зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1243707 - Split up addTad, create the new browser and link it to the new tab in _linkBrowserToTab. r=dao
This commit is contained in:
Родитель
01d7e9bf57
Коммит
cfd01a0232
|
@ -1824,6 +1824,99 @@
|
|||
</body>
|
||||
</method>
|
||||
|
||||
<method name="_linkBrowserToTab">
|
||||
<parameter name="aTab"/>
|
||||
<parameter name="aURI"/>
|
||||
<parameter name="aParams"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
"use strict";
|
||||
|
||||
let aReferrerURI = aParams.referrerURI;
|
||||
let aReferrerPolicy = aParams.referrerPolicy;
|
||||
let aCharset = aParams.charset;
|
||||
let aPostData = aParams.postData;
|
||||
let aAllowThirdPartyFixup = aParams.allowThirdPartyFixup;
|
||||
let aFromExternal = aParams.fromExternal;
|
||||
let aAllowMixedContent = aParams.allowMixedContent;
|
||||
let aForceNotRemote = aParams.forceNotRemote;
|
||||
let aNoReferrer = aParams.noReferrer;
|
||||
let aUserContextId = aParams.userContextId;
|
||||
|
||||
let uriIsAboutBlank = !aURI || aURI == "about:blank";
|
||||
|
||||
// The new browser should be remote if this is an e10s window and
|
||||
// the uri to load can be loaded remotely.
|
||||
let remote = gMultiProcessBrowser &&
|
||||
!aForceNotRemote &&
|
||||
E10SUtils.canLoadURIInProcess(aURI, Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT);
|
||||
|
||||
let browser;
|
||||
let usingPreloadedContent = false;
|
||||
|
||||
// If we open a new tab with the newtab URL in the default
|
||||
// userContext, check if there is a preloaded browser ready.
|
||||
// Private windows are not included because both the label and the
|
||||
// icon for the tab would be set incorrectly (see bug 1195981).
|
||||
if (aURI == BROWSER_NEW_TAB_URL && !aUserContextId &&
|
||||
!PrivateBrowsingUtils.isWindowPrivate(window)) {
|
||||
browser = this._getPreloadedBrowser();
|
||||
usingPreloadedContent = !!browser;
|
||||
}
|
||||
|
||||
if (!browser) {
|
||||
// No preloaded browser found, create one.
|
||||
browser = this._createBrowser({remote: remote,
|
||||
uriIsAboutBlank: uriIsAboutBlank,
|
||||
userContextId: aUserContextId});
|
||||
}
|
||||
|
||||
let notificationbox = this.getNotificationBox(browser);
|
||||
let uniqueId = this._generateUniquePanelID();
|
||||
notificationbox.id = uniqueId;
|
||||
aTab.linkedPanel = uniqueId;
|
||||
aTab.linkedBrowser = browser;
|
||||
this._tabForBrowser.set(browser, aTab);
|
||||
|
||||
// Inject the <browser> into the DOM if necessary.
|
||||
if (!notificationbox.parentNode) {
|
||||
// NB: this appendChild call causes us to run constructors for the
|
||||
// browser element, which fires off a bunch of notifications. Some
|
||||
// of those notifications can cause code to run that inspects our
|
||||
// state, so it is important that the tab element is fully
|
||||
// initialized by this point.
|
||||
this.mPanelContainer.appendChild(notificationbox);
|
||||
}
|
||||
|
||||
// wire up a progress listener for the new browser object.
|
||||
let tabListener = this.mTabProgressListener(aTab, browser, uriIsAboutBlank, usingPreloadedContent);
|
||||
const filter = Cc["@mozilla.org/appshell/component/browser-status-filter;1"]
|
||||
.createInstance(Ci.nsIWebProgress);
|
||||
filter.addProgressListener(tabListener, Ci.nsIWebProgress.NOTIFY_ALL);
|
||||
browser.webProgress.addProgressListener(filter, Ci.nsIWebProgress.NOTIFY_ALL);
|
||||
this._tabListeners.set(aTab, tabListener);
|
||||
this._tabFilters.set(aTab, filter);
|
||||
|
||||
browser.droppedLinkHandler = handleDroppedLink;
|
||||
|
||||
// We start our browsers out as inactive, and then maintain
|
||||
// activeness in the tab switcher.
|
||||
browser.docShellIsActive = false;
|
||||
|
||||
// When addTab() is called with an URL that is not "about:blank" we
|
||||
// set the "nodefaultsrc" attribute that prevents a frameLoader
|
||||
// from being created as soon as the linked <browser> is inserted
|
||||
// into the DOM. We thus have to register the new outerWindowID
|
||||
// for non-remote browsers after we have called browser.loadURI().
|
||||
if (!remote) {
|
||||
this._outerWindowIDBrowserMap.set(browser.outerWindowID, browser);
|
||||
}
|
||||
|
||||
return { usingPreloadedContent: usingPreloadedContent };
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="addTab">
|
||||
<parameter name="aURI"/>
|
||||
<parameter name="aReferrerURI"/>
|
||||
|
@ -1833,6 +1926,8 @@
|
|||
<parameter name="aAllowThirdPartyFixup"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
"use strict";
|
||||
|
||||
const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
var aReferrerPolicy;
|
||||
var aFromExternal;
|
||||
|
@ -1884,12 +1979,6 @@
|
|||
t.setAttribute("onerror", "this.removeAttribute('image');");
|
||||
t.className = "tabbrowser-tab";
|
||||
|
||||
// The new browser should be remote if this is an e10s window and
|
||||
// the uri to load can be loaded remotely.
|
||||
let remote = gMultiProcessBrowser &&
|
||||
!aForceNotRemote &&
|
||||
E10SUtils.canLoadURIInProcess(aURI, Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT);
|
||||
|
||||
this.tabContainer._unlockTabSizing();
|
||||
|
||||
// When overflowing, new tabs are scrolled into view smoothly, which
|
||||
|
@ -1914,59 +2003,35 @@
|
|||
if (aOwner)
|
||||
t.owner = aOwner;
|
||||
|
||||
let b;
|
||||
let usingPreloadedContent = false;
|
||||
|
||||
// If we open a new tab with the newtab URL in the default
|
||||
// userContext, check if there is a preloaded browser ready.
|
||||
// Private windows are not included because both the label and the
|
||||
// icon for the tab would be set incorrectly (see bug 1195981).
|
||||
if (aURI == BROWSER_NEW_TAB_URL && !aUserContextId &&
|
||||
!PrivateBrowsingUtils.isWindowPrivate(window)) {
|
||||
b = this._getPreloadedBrowser();
|
||||
usingPreloadedContent = !!b;
|
||||
}
|
||||
|
||||
if (!b) {
|
||||
// No preloaded browser found, create one.
|
||||
b = this._createBrowser({remote: remote,
|
||||
uriIsAboutBlank: uriIsAboutBlank,
|
||||
userContextId: aUserContextId});
|
||||
}
|
||||
|
||||
let notificationbox = this.getNotificationBox(b);
|
||||
var position = this.tabs.length - 1;
|
||||
var uniqueId = this._generateUniquePanelID();
|
||||
notificationbox.id = uniqueId;
|
||||
t.linkedPanel = uniqueId;
|
||||
t.linkedBrowser = b;
|
||||
this._tabForBrowser.set(b, t);
|
||||
t._tPos = position;
|
||||
t.lastAccessed = Date.now();
|
||||
this.tabContainer._setPositionalAttributes();
|
||||
|
||||
// Inject the <browser> into the DOM if necessary.
|
||||
if (!notificationbox.parentNode) {
|
||||
// NB: this appendChild call causes us to run constructors for the
|
||||
// browser element, which fires off a bunch of notifications. Some
|
||||
// of those notifications can cause code to run that inspects our
|
||||
// state, so it is important that the tab element is fully
|
||||
// initialized by this point.
|
||||
this.mPanelContainer.appendChild(notificationbox);
|
||||
}
|
||||
|
||||
this.tabContainer.updateVisibility();
|
||||
|
||||
// wire up a progress listener for the new browser object.
|
||||
var tabListener = this.mTabProgressListener(t, b, uriIsAboutBlank, usingPreloadedContent);
|
||||
const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
|
||||
.createInstance(Components.interfaces.nsIWebProgress);
|
||||
filter.addProgressListener(tabListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
||||
b.webProgress.addProgressListener(filter, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
||||
this._tabListeners.set(t, tabListener);
|
||||
this._tabFilters.set(t, filter);
|
||||
let options = {
|
||||
referrerURI : aReferrerURI,
|
||||
referrerPolicy : aReferrerPolicy,
|
||||
charset : aCharset,
|
||||
postData : aPostData,
|
||||
allowThirdPartyFixup : aAllowThirdPartyFixup,
|
||||
fromExternal : aFromExternal,
|
||||
allowMixedContent : aAllowMixedContent,
|
||||
forceNotRemote : aForceNotRemote,
|
||||
noReferrer : aNoReferrer,
|
||||
userContextId : aUserContextId
|
||||
};
|
||||
|
||||
b.droppedLinkHandler = handleDroppedLink;
|
||||
// Currently in this incarnation of bug 906076, we are forcing the
|
||||
// browser to immediately be linked. In future incarnations of this
|
||||
// bug this will be removed so we can leave the tab in its "lazy"
|
||||
// state to be exploited for startup optimization. Note that for
|
||||
// now this must occur before "TabOpen" event is fired, as that will
|
||||
// trigger SessionStore.jsm to run code that expects the existence
|
||||
// of tab.linkedBrowser.
|
||||
let { usingPreloadedContent } = this._linkBrowserToTab(t, aURI, options);
|
||||
let b = t.linkedBrowser;
|
||||
|
||||
// Dispatch a new tab notification. We do this once we're
|
||||
// entirely done, so that things are in a consistent state
|
||||
|
@ -2005,23 +2070,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
// We start our browsers out as inactive, and then maintain
|
||||
// activeness in the tab switcher.
|
||||
b.docShellIsActive = false;
|
||||
|
||||
// When addTab() is called with an URL that is not "about:blank" we
|
||||
// set the "nodefaultsrc" attribute that prevents a frameLoader
|
||||
// from being created as soon as the linked <browser> is inserted
|
||||
// into the DOM. We thus have to register the new outerWindowID
|
||||
// for non-remote browsers after we have called browser.loadURI().
|
||||
//
|
||||
// Note: Only do this of we still have a docShell. The TabOpen
|
||||
// event was dispatched above and a gBrowser.removeTab() call from
|
||||
// one of its listeners could cause us to fail here.
|
||||
if (!remote && b.docShell) {
|
||||
this._outerWindowIDBrowserMap.set(b.outerWindowID, b);
|
||||
}
|
||||
|
||||
// Check if we're opening a tab related to the current tab and
|
||||
// move it to after the current tab.
|
||||
// aReferrerURI is null or undefined if the tab is opened from
|
||||
|
|
Загрузка…
Ссылка в новой задаче