Bug 1440592 - [4.3] Allow load delegation when opening windows before requesting a new session. r=snorp

This commit is contained in:
Eugen Sawin 2018-03-27 22:35:17 +02:00
Родитель 65de3da95f
Коммит 994b2f05f2
2 изменённых файлов: 37 добавлений и 11 удалений

Просмотреть файл

@ -129,13 +129,13 @@ class EventProxy {
} }
registerListener(aEventList) { registerListener(aEventList) {
debug("rabbit register " + aEventList); debug("register " + aEventList);
this.eventDispatcher.registerListener(this, aEventList); this.eventDispatcher.registerListener(this, aEventList);
this._registeredEvents = this._registeredEvents.concat(aEventList); this._registeredEvents = this._registeredEvents.concat(aEventList);
} }
unregisterListener() { unregisterListener() {
debug("rabbit unregister"); debug("unregister");
if (this._registeredEvents.length === 0) { if (this._registeredEvents.length === 0) {
return; return;
} }
@ -145,7 +145,7 @@ class EventProxy {
onEvent(aEvent, aData, aCallback) { onEvent(aEvent, aData, aCallback) {
if (this._enableQueuing) { if (this._enableQueuing) {
debug("rabbit queue " + aEvent + ", aData=" + JSON.stringify(aData)); debug("queue " + aEvent + ", aData=" + JSON.stringify(aData));
this._eventQueue.unshift(arguments); this._eventQueue.unshift(arguments);
} else { } else {
this._dispatch.apply(this, arguments); this._dispatch.apply(this, arguments);
@ -158,12 +158,12 @@ class EventProxy {
} }
_dispatch(aEvent, aData, aCallback) { _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); this.listener.onEvent.apply(this.listener, arguments);
} }
dispatchQueuedEvents() { dispatchQueuedEvents() {
debug("rabbit dispatchQueued"); debug("dispatchQueued");
while (this._eventQueue.length) { while (this._eventQueue.length) {
const e = this._eventQueue.pop(); const e = this._eventQueue.pop();
this._dispatch.apply(this, e); this._dispatch.apply(this, e);

Просмотреть файл

@ -152,9 +152,21 @@ class GeckoViewNavigation extends GeckoViewModule {
" aWhere=" + aWhere + " aWhere=" + aWhere +
" aFlags=" + aFlags); " 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, const browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags,
aTriggeringPrincipal); aTriggeringPrincipal);
return browser && browser.contentWindow; if (!browser) {
Components.returnCode = Cr.NS_ERROR_ABORT;
return null;
}
return browser.contentWindow;
} }
// nsIBrowserDOMWindow. // nsIBrowserDOMWindow.
@ -167,28 +179,42 @@ class GeckoViewNavigation extends GeckoViewModule {
" aNextTabParentId=" + aNextTabParentId + " aNextTabParentId=" + aNextTabParentId +
" aName=" + aName); " aName=" + aName);
const browser = this.handleNewSession(aUri, null, aWhere, aFlags, null); if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags, null)) {
if (browser) { // The app has handled the load, abort open-window handling.
browser.setAttribute("nextTabParentId", aNextTabParentId); 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; return browser;
} }
handleOpenUri(aUri, aOpener, aWhere, aFlags, aTriggeringPrincipal, handleOpenUri(aUri, aOpener, aWhere, aFlags, aTriggeringPrincipal,
aNextTabParentId) { aNextTabParentId) {
let browser = this.browser; debug("handleOpenUri: aUri=" + (aUri && aUri.spec) +
" aWhere=" + aWhere +
" aFlags=" + aFlags);
if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags, if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags,
aTriggeringPrincipal)) { aTriggeringPrincipal)) {
return browser; return null;
} }
let browser = this.browser;
if (aWhere === Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW || if (aWhere === Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW ||
aWhere === Ci.nsIBrowserDOMWindow.OPEN_NEWTAB || aWhere === Ci.nsIBrowserDOMWindow.OPEN_NEWTAB ||
aWhere === Ci.nsIBrowserDOMWindow.OPEN_SWITCHTAB) { aWhere === Ci.nsIBrowserDOMWindow.OPEN_SWITCHTAB) {
browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags, browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags,
aTriggeringPrincipal); aTriggeringPrincipal);
} }
if (!browser) { if (!browser) {
// Should we throw? // Should we throw?
return null; return null;