diff --git a/mobile/android/modules/geckoview/GeckoViewModule.jsm b/mobile/android/modules/geckoview/GeckoViewModule.jsm index 29d0881f0f9e..633ef8189eb2 100644 --- a/mobile/android/modules/geckoview/GeckoViewModule.jsm +++ b/mobile/android/modules/geckoview/GeckoViewModule.jsm @@ -129,13 +129,13 @@ class EventProxy { } registerListener(aEventList) { - debug("rabbit register " + aEventList); + debug("register " + aEventList); this.eventDispatcher.registerListener(this, aEventList); this._registeredEvents = this._registeredEvents.concat(aEventList); } unregisterListener() { - debug("rabbit unregister"); + debug("unregister"); if (this._registeredEvents.length === 0) { return; } @@ -145,7 +145,7 @@ class EventProxy { onEvent(aEvent, aData, aCallback) { if (this._enableQueuing) { - debug("rabbit queue " + aEvent + ", aData=" + JSON.stringify(aData)); + debug("queue " + aEvent + ", aData=" + JSON.stringify(aData)); this._eventQueue.unshift(arguments); } else { this._dispatch.apply(this, arguments); @@ -158,12 +158,12 @@ class EventProxy { } _dispatch(aEvent, aData, aCallback) { - debug("rabbit dispatch " + aEvent + ", aData=" + JSON.stringify(aData)); + debug("dispatch " + aEvent + ", aData=" + JSON.stringify(aData)); this.listener.onEvent.apply(this.listener, arguments); } dispatchQueuedEvents() { - debug("rabbit dispatchQueued"); + debug("dispatchQueued"); while (this._eventQueue.length) { const e = this._eventQueue.pop(); this._dispatch.apply(this, e); diff --git a/mobile/android/modules/geckoview/GeckoViewNavigation.jsm b/mobile/android/modules/geckoview/GeckoViewNavigation.jsm index 16e37949b49e..ee23f145f463 100644 --- a/mobile/android/modules/geckoview/GeckoViewNavigation.jsm +++ b/mobile/android/modules/geckoview/GeckoViewNavigation.jsm @@ -152,9 +152,21 @@ class GeckoViewNavigation extends GeckoViewModule { " aWhere=" + aWhere + " aFlags=" + aFlags); + if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags, + aTriggeringPrincipal)) { + // The app has handled the load, abort open-window handling. + Components.returnCode = Cr.NS_ERROR_ABORT; + return null; + } + const browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags, aTriggeringPrincipal); - return browser && browser.contentWindow; + if (!browser) { + Components.returnCode = Cr.NS_ERROR_ABORT; + return null; + } + + return browser.contentWindow; } // nsIBrowserDOMWindow. @@ -167,28 +179,42 @@ class GeckoViewNavigation extends GeckoViewModule { " aNextTabParentId=" + aNextTabParentId + " aName=" + aName); - const browser = this.handleNewSession(aUri, null, aWhere, aFlags, null); - if (browser) { - browser.setAttribute("nextTabParentId", aNextTabParentId); + if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags, null)) { + // The app has handled the load, abort open-window handling. + Components.returnCode = Cr.NS_ERROR_ABORT; + return null; } + const browser = this.handleNewSession(aUri, null, aWhere, aFlags, null); + if (!browser) { + Components.returnCode = Cr.NS_ERROR_ABORT; + return null; + } + + browser.setAttribute("nextTabParentId", aNextTabParentId); return browser; } handleOpenUri(aUri, aOpener, aWhere, aFlags, aTriggeringPrincipal, aNextTabParentId) { - let browser = this.browser; + debug("handleOpenUri: aUri=" + (aUri && aUri.spec) + + " aWhere=" + aWhere + + " aFlags=" + aFlags); + if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags, aTriggeringPrincipal)) { - return browser; + return null; } + let browser = this.browser; + if (aWhere === Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW || aWhere === Ci.nsIBrowserDOMWindow.OPEN_NEWTAB || aWhere === Ci.nsIBrowserDOMWindow.OPEN_SWITCHTAB) { browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags, aTriggeringPrincipal); } + if (!browser) { // Should we throw? return null;