From 9371f49703b5b126f159a0669d3bf9cdce3fd43f Mon Sep 17 00:00:00 2001 From: "pinkerton%netscape.com" Date: Wed, 14 May 2003 03:45:06 +0000 Subject: [PATCH] add indicator of blocked popup and a popdown menu to quickly unblock sites --- camino/Chimera.pbproj/project.pbxproj | 21 ++ .../BrowserWindow.nib/classes.nib | 4 + .../English.lproj/BrowserWindow.nib/info.nib | 14 +- .../BrowserWindow.nib/objects.nib | Bin 24500 -> 25276 bytes camino/src/application/MainController.mm | 2 +- camino/src/browser/BrowserWindowController.h | 10 + camino/src/browser/BrowserWindowController.mm | 197 +++++++++++++++++- camino/src/browser/BrowserWrapper.h | 7 + camino/src/browser/BrowserWrapper.mm | 35 +++- camino/src/browser/KeychainService.mm | 4 + camino/src/embedding/CHBrowserListener.h | 3 + camino/src/embedding/CHBrowserListener.mm | 20 +- camino/src/embedding/CHBrowserView.h | 4 +- camino/src/embedding/CHBrowserView.mm | 6 + 14 files changed, 311 insertions(+), 16 deletions(-) diff --git a/camino/Chimera.pbproj/project.pbxproj b/camino/Chimera.pbproj/project.pbxproj index 3518703ecd49..406fb25d0108 100644 --- a/camino/Chimera.pbproj/project.pbxproj +++ b/camino/Chimera.pbproj/project.pbxproj @@ -841,6 +841,7 @@ 3003B8A4044514B600B85BF3, 3003B8A5044514B600B85BF3, 3003B8AD044514E300B85BF3, + 3FAD95550461E43700A80005, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -1390,6 +1391,24 @@ settings = { }; }; + 3F8D26DE0471ED0F00A80005 = { + fileRef = 3FAD95540461E43700A80005; + isa = PBXBuildFile; + settings = { + }; + }; + 3FAD95540461E43700A80005 = { + isa = PBXFileReference; + name = "popup-blocked.png"; + path = "resources/images/chrome/popup-blocked.png"; + refType = 2; + }; + 3FAD95550461E43700A80005 = { + fileRef = 3FAD95540461E43700A80005; + isa = PBXBuildFile; + settings = { + }; + }; //3F0 //3F1 //3F2 @@ -1921,6 +1940,7 @@ F557149E023B46BF010001CA, F540BD1A029ED15301026D5D, F540BD1C029ED17901026D5D, + 3FAD95540461E43700A80005, F5A112C902DF270F01026D5D, F55B6BF402EF1F7E01026D5D, F583E3B503B8204901A80166, @@ -7930,6 +7950,7 @@ 3003B8A9044514B600B85BF3, 3003B8AA044514B600B85BF3, 3003B8AE044514E300B85BF3, + 3F8D26DE0471ED0F00A80005, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; diff --git a/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib b/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib index 9ae7c167d3de..f85041e1c7ac 100644 --- a/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib +++ b/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib @@ -90,6 +90,7 @@ closeCurrentTab = id; closeOtherTabs = id; closeSendersTab = id; + configurePopupBlocking = id; copyImage = id; copyImageLocation = id; copyLinkLocation = id; @@ -127,6 +128,8 @@ stop = id; toggleBookmarkManager = id; toggleSidebar = id; + unblockAllSites = id; + unblockSite = id; viewOnlyThisImage = id; viewPageSource = id; viewSource = id; @@ -154,6 +157,7 @@ mLock = NSImageView; mPageMenu = NSMenu; mPersonalToolbar = BookmarksToolbar; + mPopupBlocked = NSButton; mProgress = NSProgressIndicator; mProxyIcon = PageProxyIcon; mSearchBar = SearchTextField; diff --git a/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib b/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib index 914861122721..d95e74dd428e 100644 --- a/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib +++ b/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib @@ -3,7 +3,7 @@ IBDocumentLocation - 50 101 653 383 0 0 1024 746 + 122 60 653 383 0 0 1280 832 IBEditorPositions 124 @@ -23,16 +23,18 @@ 463 268 375 213 264 0 0 1280 832 56 - 355 485 314 64 0 0 1024 746 + 483 539 314 64 0 0 1280 832 654 159 629 198 144 0 0 1280 832 731 185 277 654 459 0 0 1024 746 801 418 469 201 79 0 0 1024 746 + 826 + 96 451 213 78 0 0 1280 832 IBFramework Version - 286.0 + 291.0 IBGroupedObjects 7 @@ -45,11 +47,7 @@ 8 IBLockedObjects - IBOpenObjects - - 56 - IBSystem Version - 6L29 + 6I32 diff --git a/camino/resources/localized/English.lproj/BrowserWindow.nib/objects.nib b/camino/resources/localized/English.lproj/BrowserWindow.nib/objects.nib index 99c869ac50e6e9df9a8bc7d1794dada5d4518e90..f1b2c0801a1fb2961f6576576f043e1e0eff2ea4 100644 GIT binary patch literal 25276 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 literal 24500 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 diff --git a/camino/src/application/MainController.mm b/camino/src/application/MainController.mm index 22246ef68cd4..cbec143933d2 100644 --- a/camino/src/application/MainController.mm +++ b/camino/src/application/MainController.mm @@ -173,7 +173,7 @@ const int kReuseWindowOnAE = 2; // initialize if we haven't already. [self preferenceManager]; - [self setupStartpage]; + [self setupStartpage]; // register our app components with the embed layer unsigned int numComps = 0; diff --git a/camino/src/browser/BrowserWindowController.h b/camino/src/browser/BrowserWindowController.h index 524e0d6dc686..1e4d987d8eec 100644 --- a/camino/src/browser/BrowserWindowController.h +++ b/camino/src/browser/BrowserWindowController.h @@ -107,6 +107,7 @@ typedef enum IBOutlet NSTextField* mStatus; IBOutlet NSProgressIndicator* mProgress; // STRONG reference IBOutlet NSImageView* mLock; + IBOutlet NSButton* mPopupBlocked; IBOutlet NSWindow* mLocationSheetWindow; IBOutlet NSTextField* mLocationSheetURLField; IBOutlet NSView* mStatusBar; // contains the status text, progress bar, and lock @@ -183,6 +184,7 @@ typedef enum // could be an outlet, but i figure it's easier to get it at runtime thereby saving // someone from messing up in the nib when making changes. NSView* mProgressSuperview; // WEAK ptr + NSView* mPopupBlockSuperview; // WEAK ptr nsIURIFixup* mURIFixer; // [STRONG] should be nsCOMPtr, but can't nsIBrowserHistory* mGlobalHistory; // [STRONG] should be nsCOMPtr, but can't @@ -205,6 +207,14 @@ typedef enum // call to update the image of the lock icon with a value from nsIWebProgressListener - (void)updateLock:(unsigned int)securityState; + // call to update (show/hide) the image of the blocked-popup indicator and handle + // the items of the popup un-blocker menu +- (void)showPopupBlocked:(BOOL)inBlocked; +- (void)buildPopupBlockerMenu:(NSNotification*)notifer; +- (IBAction)unblockSite:(id)sender; +- (IBAction)unblockAllSites:(id)sender; +- (IBAction)configurePopupBlocking:(id)sender; + - (void)performAppropriateLocationAction; - (IBAction)goToLocationFromToolbarURLField:(id)sender; - (void)beginLocationSheet; diff --git a/camino/src/browser/BrowserWindowController.mm b/camino/src/browser/BrowserWindowController.mm index 12664f9f29d7..9eea0240887d 100644 --- a/camino/src/browser/BrowserWindowController.mm +++ b/camino/src/browser/BrowserWindowController.mm @@ -79,6 +79,7 @@ #include "nsIURI.h" #include "nsIURIFixup.h" #include "nsIBrowserHistory.h" +#include "nsIPermissionManager.h" #include @@ -161,6 +162,52 @@ static NSArray* sToolbarDefaults = nil; @end ////////////////////////////////////// +#pragma mark - + +// +// IconPopUpCell +// +// A popup cell that displays only an icon with no border, yet retains the +// behaviors of a popup menu. It's amazing you can't get this w/out having +// to subclass, but *shrug*. +// +@interface IconPopUpCell : NSPopUpButtonCell +{ +@private + NSImage* fImage; + NSRect fSrcRect; // rect cached for drawing, same size as image +} +- (id)initWithImage:(NSImage *)inImage; +@end + +@implementation IconPopUpCell + +- (id)initWithImage:(NSImage *)inImage +{ + if ( (self = [super initTextCell:@"" pullsDown:YES]) ) + { + fImage = [inImage retain]; + fSrcRect = NSMakeRect(0,0,0,0); + fSrcRect.size = [fImage size]; + } + return self; +} + +- (void)dealloc +{ + [fImage release]; +} + +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView +{ + [fImage setFlipped:[controlView isFlipped]]; + cellFrame.size = fSrcRect.size; // don't scale + [fImage drawInRect:cellFrame fromRect:fSrcRect operation:NSCompositeSourceOver fraction:1.0]; +} + +@end + +#pragma mark - @interface BrowserWindowController(Private) - (void)setupToolbar; @@ -358,6 +405,7 @@ static NSArray* sToolbarDefaults = nil; // [mSidebarBrowserView windowClosed]; [mProgress release]; + [mPopupBlocked release]; [mSearchBar release]; [self stopThrobber]; [mThrobberImages release]; @@ -387,13 +435,18 @@ static NSArray* sToolbarDefaults = nil; mProgress = nil; mStatus = nil; mLock = nil; + mPopupBlocked = nil; } else { // Retain with a single extra refcount. This allows us to remove // the progress meter from its superview without having to worry // about retaining and releasing it. Cache the superview of the // progress. Dynamically fetch the superview so as not to burden - // someone rearranging the nib with this detail. + // someone rearranging the nib with this detail. Note that this + // needs to be in a subview from the status bar because if the + // window resizes while it is hidden, its position wouldn't get updated. + // Having it in a separate view that stays visible (and is thus + // involved in the layout process) solves this. [mProgress retain]; mProgressSuperview = [mProgress superview]; @@ -402,6 +455,26 @@ static NSArray* sToolbarDefaults = nil; // (radar 2194819), we need to make the text area opaque. [mStatus setBackgroundColor:[NSColor windowBackgroundColor]]; [mStatus setDrawsBackground:YES]; + + // create a new cell for our popup blocker item that draws just an image + // yet still retains the functionality of a popdown menu. Like the progress + // meter above, we retain so we can hide with impunity and grab its superview. + // However, unlike the progress meter, this doesn't need to be in a subview from + // the status bar because it is in a fixed position on the LHS. + [mPopupBlocked retain]; + NSMenu* savedMenu = [mPopupBlocked menu]; // must cache this before replacing cell + IconPopUpCell* iconCell = [[[IconPopUpCell alloc] initWithImage:[NSImage imageNamed:@"popup-blocked"]] autorelease]; + [mPopupBlocked setCell:iconCell]; + //[iconCell setPreferredEdge:NSMinYEdge]; + [iconCell setMenu:savedMenu]; + [iconCell setBordered:NO]; + mPopupBlockSuperview = [mPopupBlocked superview]; + [self showPopupBlocked:NO]; + + // register for notifications so we can populate the popup blocker menu + // right before it's displayed. + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buildPopupBlockerMenu:) + name:NSPopUpButtonCellWillPopUpNotification object:nil]; } // Set up the toolbar's search text field @@ -2220,6 +2293,128 @@ static NSArray* sToolbarDefaults = nil; [mProgress removeFromSuperview]; } +// +// - showPopupBlocked: +// +// Show/hide the image of the blocked-popup indicator +// +- (void)showPopupBlocked:(BOOL)inBlocked +{ + if ( inBlocked && ![mPopupBlocked window] ) { // told to show, currently hidden + [mPopupBlockSuperview addSubview:mPopupBlocked]; + } + else if ( !inBlocked && [mPopupBlocked window] ) { // told to hide, currently visible + [mPopupBlocked removeFromSuperview]; + } +} + +// +// buildPopupBlockerMenu: +// +// Called by the notification center right before the menu will be displayed. This +// allows us the opportunity to populate its contents from the list of sites +// in the block list. +// +- (void)buildPopupBlockerMenu:(NSNotification*)notifier +{ + const long kSeparatorTag = -1; + NSPopUpButton* popup = [notifier object]; + + // clear out existing menu. loop until we hit our special tag + NSMenu* menu = [popup menu]; + int numItemsToDelete = [popup indexOfItemWithTag:kSeparatorTag]; + for ( int i = 0; i < numItemsToDelete; ++i ) + [popup removeItemAtIndex:0]; + + // the first item will get swallowed by the popup + [popup insertItemWithTitle:@"" atIndex:0]; + + // fill in new menu + nsCOMPtr blockedSites; + [[self getBrowserWrapper] getBlockedSites:getter_AddRefs(blockedSites)]; + PRUint32 siteCount = 0; + blockedSites->Count(&siteCount); + for ( PRUint32 i = 0; i < siteCount; ++i ) { + nsCOMPtr genericURI = dont_AddRef(blockedSites->ElementAt(i)); + nsCOMPtr uri = do_QueryInterface(genericURI); + if ( uri ) { + // extract the host + nsCAutoString host; + uri->GetHost(host); + NSString* hostString = [NSString stringWithCString:host.get()]; + + // create a new menu item and set its tag to the position in the menu so + // the action can know which site we want to unblock. Insert it at |i+1| + // because we had to pad with one item above, but set the tag to |i| because + // that's the index in the array. + const PRUint32 insertAt = i + 1; + NSString* itemTitle = [NSString stringWithFormat:NSLocalizedString(@"Unblock %@", @"Unblock %@"), hostString]; + [popup insertItemWithTitle:itemTitle atIndex:insertAt]; + NSMenuItem* currItem = [popup itemAtIndex:insertAt]; + [currItem setAction:@selector(unblockSite:)]; + [currItem setTarget:self]; + [currItem setTag:i]; + } + } +} + +// +// unblockSite: +// +// Called in response to an item in the unblock popup menu being selected to +// add a particular site to the popup whitelist. We assume that the tag of +// the sender is the index into the blocked sites array stores in the browser +// wrapper to get the nsURI. +// +- (IBAction)unblockSite:(id)sender +{ + nsCOMPtr blockedSites; + [[self getBrowserWrapper] getBlockedSites:getter_AddRefs(blockedSites)]; + + // get the tag from the sender and use that as the index into the list + long tag = [sender tag]; + if ( tag >= 0 ) { + nsCOMPtr genUri = dont_AddRef(blockedSites->ElementAt(tag)); + nsCOMPtr uri = do_QueryInterface(genUri); + + nsCOMPtr pm ( do_GetService(NS_PERMISSIONMANAGER_CONTRACTID) ); + pm->Add(uri, nsIPermissionManager::POPUP_TYPE, nsIPermissionManager::ALLOW_ACTION); + } +} + +// +// - unblockAllSites: +// +// Called in response to the menu item from the unblock popup. Loop over all +// the items in the blocked sites array in the browser wrapper and add them +// to the whitelist. +// +- (IBAction)unblockAllSites:(id)sender +{ + nsCOMPtr blockedSites; + [[self getBrowserWrapper] getBlockedSites:getter_AddRefs(blockedSites)]; + nsCOMPtr pm ( do_GetService(NS_PERMISSIONMANAGER_CONTRACTID) ); + + PRUint32 count = 0; + blockedSites->Count(&count); + for ( PRUint32 i = 0; i < count; ++i ) { + nsCOMPtr genUri = dont_AddRef(blockedSites->ElementAt(i)); + nsCOMPtr uri = do_QueryInterface(genUri); + pm->Add(uri, nsIPermissionManager::POPUP_TYPE, nsIPermissionManager::ALLOW_ACTION); + } +} + +// +// -configurePopupBlocking +// +// Show the web features pref panel where the user can do things to configure +// popup blocking +// +- (IBAction)configurePopupBlocking:(id)sender +{ + [[NSApp delegate] displayPreferencesWindow:self]; + [[[NSApp delegate] preferencesController] selectPreferencePaneByIdentifier:@"org.mozilla.chimera.preference.webfeatures"]; +} // // updateLock: diff --git a/camino/src/browser/BrowserWrapper.h b/camino/src/browser/BrowserWrapper.h index 8ee95bdb2cd9..5834350d25c1 100644 --- a/camino/src/browser/BrowserWrapper.h +++ b/camino/src/browser/BrowserWrapper.h @@ -42,6 +42,8 @@ @class ToolTip; @class AutoCompleteTextField; +class nsISupportsArray; + @interface BrowserWrapper : NSView { AutoCompleteTextField* mUrlbar; @@ -62,6 +64,9 @@ NSString* mTitle; // the title we use for the tab. This differs for mTitle when the tab is loading NSString* mTabTitle; + // array of sites that have blocked popups. If nil, no sites are blocked. Cleared + // after each new page. + nsISupportsArray* mBlockedSites; // STRONG CHBrowserView* mBrowserView; NSString* mDefaultStatusString; @@ -92,6 +97,8 @@ - (NSString*)getCurrentURLSpec; +- (void)getBlockedSites:(nsISupportsArray**)outSites; + - (void)loadURI:(NSString *)urlSpec referrer:(NSString*)referrer flags:(unsigned int)flags activate:(BOOL)activate; - (void)makePrimaryBrowserView: (id)aUrlbar status: (id)aStatus windowController: (BrowserWindowController*)aWindowController; diff --git a/camino/src/browser/BrowserWrapper.mm b/camino/src/browser/BrowserWrapper.mm index b9f2cd89a623..41f0c5151e59 100644 --- a/camino/src/browser/BrowserWrapper.mm +++ b/camino/src/browser/BrowserWrapper.mm @@ -113,7 +113,8 @@ const NSString* kOfflineNotificationName = @"offlineModeChanged"; mListenersAttached = NO; mSecureState = nsIWebProgressListener::STATE_IS_INSECURE; mProgress = 0.0; - + mBlockedSites = nsnull; + BOOL gotPref; BOOL pluginsEnabled = [[PreferenceManager sharedInstance] getBooleanPref:"chimera.enable_plugins" withSuccess:&gotPref]; if (gotPref && !pluginsEnabled) @@ -149,6 +150,8 @@ const NSString* kOfflineNotificationName = @"offlineModeChanged"; [mTitle release]; [mTabTitle release]; + NS_IF_RELEASE(mBlockedSites); + [super dealloc]; } @@ -255,6 +258,9 @@ const NSString* kOfflineNotificationName = @"offlineModeChanged"; selector:@selector(offlineModeChanged:) name:kOfflineNotificationName object:nil]; + + // update the blocked popup indicator + [mWindowController showPopupBlocked:(mBlockedSites != nil)]; // Update the URL bar, but only if the user hasn't put something of their // own in there. @@ -336,6 +342,9 @@ const NSString* kOfflineNotificationName = @"offlineModeChanged"; mLoadingStatusString = [NSLocalizedString(@"TabLoading", @"") retain]; [mStatus setStringValue:mLoadingStatusString]; + NS_IF_RELEASE(mBlockedSites); + [mWindowController showPopupBlocked:NO]; + mProgress = 0.0; mIsBusy = YES; @@ -574,6 +583,23 @@ const NSString* kOfflineNotificationName = @"offlineModeChanged"; [mToolTip closeToolTip]; } +// +// - onPopupBlocked:fromSite: +// +// Called when gecko blocks a popup, telling us who it came from. Currently, we +// don't do anything with the blocked URI, but we have it just in case. +// +- (void)onPopupBlocked:(nsIURI*)inURIBlocked fromSite:(nsIURI*)inSite +{ + // lazily instantiate. + if ( !mBlockedSites ) + NS_NewISupportsArray(&mBlockedSites); + if ( mBlockedSites ) { + mBlockedSites->AppendElement(inSite); + [mWindowController showPopupBlocked:YES]; + } +} + // Called when a context menu should be shown. - (void)onShowContextMenu:(int)flags domEvent:(nsIDOMEvent*)aEvent domNode:(nsIDOMNode*)aNode { @@ -857,5 +883,12 @@ const NSString* kOfflineNotificationName = @"offlineModeChanged"; return [[self getBrowserView] currentCharset]; } +- (void)getBlockedSites:(nsISupportsArray**)outSites +{ + if ( !outSites ) + return; + *outSites = mBlockedSites; + NS_IF_ADDREF(*outSites); +} @end diff --git a/camino/src/browser/KeychainService.mm b/camino/src/browser/KeychainService.mm index 781d73ebc66b..438286a75894 100644 --- a/camino/src/browser/KeychainService.mm +++ b/camino/src/browser/KeychainService.mm @@ -1023,6 +1023,10 @@ KeychainFormSubmitObserver::CheckChangeDataYN(nsIDOMWindowInternal* window) { } +- (void)onPopupBlocked:(nsIURI*)inURIBlocked fromSite:(nsIURI*)inSite +{ +} + @end // diff --git a/camino/src/embedding/CHBrowserListener.h b/camino/src/embedding/CHBrowserListener.h index 80950778e3b1..3c2b6dd7821b 100644 --- a/camino/src/embedding/CHBrowserListener.h +++ b/camino/src/embedding/CHBrowserListener.h @@ -17,6 +17,7 @@ #include "nsIWebProgressListener.h" #include "nsIEmbeddingSiteWindow2.h" #include "nsIWindowCreator.h" +#include "nsIDOMEventListener.h" #include "nsIContextMenuListener.h" #include "nsITooltipListener.h" @@ -30,6 +31,7 @@ class CHBrowserListener : public nsSupportsWeakReference, public nsIEmbeddingSiteWindow2, public nsIWebProgressListener, public nsIContextMenuListener, + public nsIDOMEventListener, public nsITooltipListener { public: @@ -45,6 +47,7 @@ public: NS_DECL_NSIWEBPROGRESSLISTENER NS_DECL_NSICONTEXTMENULISTENER NS_DECL_NSITOOLTIPLISTENER + NS_DECL_NSIDOMEVENTLISTENER void AddListener(id aListener); void RemoveListener(id aListener); diff --git a/camino/src/embedding/CHBrowserListener.mm b/camino/src/embedding/CHBrowserListener.mm index 5d3fcab3b789..2c2cd1b73c62 100644 --- a/camino/src/embedding/CHBrowserListener.mm +++ b/camino/src/embedding/CHBrowserListener.mm @@ -50,6 +50,7 @@ #include "nsCRT.h" #include "nsString.h" #include "nsCOMPtr.h" +#include "nsIDOMPopupBlockedEvent.h" #import "CHBrowserView.h" @@ -70,7 +71,7 @@ CHBrowserListener::~CHBrowserListener() [mContainer release]; } -NS_IMPL_ISUPPORTS9(CHBrowserListener, +NS_IMPL_ISUPPORTS10(CHBrowserListener, nsIInterfaceRequestor, nsIWebBrowserChrome, nsIWindowCreator, @@ -79,6 +80,7 @@ NS_IMPL_ISUPPORTS9(CHBrowserListener, nsIWebProgressListener, nsISupportsWeakReference, nsIContextMenuListener, + nsIDOMEventListener, nsITooltipListener) // Implementation of nsIInterfaceRequestor @@ -326,9 +328,6 @@ CHBrowserListener::SetDimensions(PRUint32 flags, PRInt32 x, PRInt32 y, PRInt32 c { NSRect frame = [window frame]; - float newWidth = (float)cx; - float newHeight = (float)cy; - // should we allow resizes larger than the screen, or smaller // than some min size here? @@ -626,3 +625,16 @@ CHBrowserListener::SetContainer(id aContainer) [mContainer retain]; } +NS_IMETHODIMP +CHBrowserListener::HandleEvent(nsIDOMEvent *event) +{ + nsCOMPtr blockEvent = do_QueryInterface(event); + if ( blockEvent ) { + nsCOMPtr blockedURI, blockedSite; + blockEvent->GetPopupWindowURI(getter_AddRefs(blockedURI)); + blockEvent->GetRequestingWindowURI(getter_AddRefs(blockedSite)); + [mContainer onPopupBlocked:blockedURI fromSite:blockedSite]; + } + return NS_OK; +} + diff --git a/camino/src/embedding/CHBrowserView.h b/camino/src/embedding/CHBrowserView.h index cffe24d2a49f..ede73d37b606 100644 --- a/camino/src/embedding/CHBrowserView.h +++ b/camino/src/embedding/CHBrowserView.h @@ -51,6 +51,7 @@ class nsIWebBrowserFind; class nsIEventSink; class nsIDragHelperService; class nsIPrintSettings; +class nsIURI; // Protocol implemented by anyone interested in progress @@ -73,7 +74,8 @@ class nsIPrintSettings; // Called when a tooltip should be shown or hidden - (void)onShowTooltip:(NSPoint)where withText:(NSString*)text; - (void)onHideTooltip; - +// Called when a popup is blocked +- (void)onPopupBlocked:(nsIURI*)inURIBlocked fromSite:(nsIURI*)inSite; @end typedef enum { diff --git a/camino/src/embedding/CHBrowserView.mm b/camino/src/embedding/CHBrowserView.mm index 58a4e150b0ac..7804870e93c4 100644 --- a/camino/src/embedding/CHBrowserView.mm +++ b/camino/src/embedding/CHBrowserView.mm @@ -177,6 +177,12 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1"; nsCOMPtr rec(do_QueryInterface(chromeHandler)); if ( rec ) rec->AddEventListenerByIID(clickListener, NS_GET_IID(nsIDOMMouseListener)); + + // register the CHBrowserListener as an event listener for popup-blocking events + nsCOMPtr eventTarget = do_QueryInterface(rec); + if ( eventTarget ) + rv = eventTarget->AddEventListener(NS_LITERAL_STRING("DOMPopupBlocked"), + NS_STATIC_CAST(nsIDOMEventListener*, _listener), PR_FALSE); } return self; }