You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/www-client/seamonkey/files/seamonkey-2.53.7-ownertab.p...

237 lines
9.9 KiB

--- seamonkey-2.53.7/comm/suite/app/profile/suite-prefs.js
+++ seamonkey-2.53.7/comm/suite/app/profile/suite-prefs.js
@@ -225,16 +225,17 @@ pref("browser.tabs.autoHide", false);
pref("browser.tabs.forceHide", false);
pref("browser.tabs.closeWindowWithLastTab", true);
pref("browser.tabs.warnOnClose", true);
pref("browser.tabs.warnOnCloseOther", true);
pref("browser.tabs.warnOnOpen", true);
pref("browser.tabs.maxOpenBeforeWarn", 15);
pref("browser.tabs.insertRelatedAfterCurrent", true);
pref("browser.tabs.insertAllTabsAfterCurrent", false);
+pref("browser.tabs.selectOwnerOnClose", true);
// For future use
pref("browser.tabs.loadBookmarksInBackground", false);
// how many browsers can be saved in the DOM (by the tabbed browser)
pref("browser.tabs.max_tabs_undo", 3);
// should popups by saved in the DOM (by the tabbed browser)
pref("browser.tabs.cache_popups", false);
--- seamonkey-2.53.7/comm/suite/base/content/utilityOverlay.js
+++ seamonkey-2.53.7/comm/suite/base/content/utilityOverlay.js
@@ -1624,21 +1624,23 @@ function openLinkIn(url, where, params)
// forces tab to be focused
loadInBackground = true;
// fall through
case "tabshifted":
loadInBackground = !loadInBackground;
// fall through
case "tab":
var browser = w.getBrowser();
+ var owner = loadInBackground ? null : browser.selectedTab;
var tab = browser.addTab(url, {
referrerURI: aReferrerURI,
referrerPolicy: aReferrerPolicy,
charset: aCharset,
postData: aPostData,
+ ownerTab: owner,
allowThirdPartyFixup: aAllowThirdPartyFixup,
relatedToCurrent: aRelatedToCurrent,
allowMixedContent: aAllowMixedContent,
noReferrer: aNoReferrer,
userContextId: aUserContextId,
originPrincipal: aPrincipal,
triggeringPrincipal: aTriggeringPrincipal,
});
--- seamonkey-2.53.7/comm/suite/browser/tabbrowser.xml
+++ seamonkey-2.53.7/comm/suite/browser/tabbrowser.xml
@@ -1151,16 +1151,28 @@
newBrowser.docShellIsActive = this.mCurrentTab.linkedBrowser.docShellIsActive;
if (this.mCurrentBrowser) {
this.mCurrentBrowser.droppedLinkHandler = null;
this.mCurrentBrowser.docShellIsActive = false;
this.mCurrentBrowser.removeAttribute("primary");
this.finder.mListeners.forEach(l => this.mCurrentBrowser.finder.removeResultListener(l));
}
+ var oldTab = this.mCurrentTab;
+
+ // Preview mode should not reset the owner
+ if (!this._previewMode && !oldTab.selected)
+ oldTab.owner = null;
+
+ let lastRelatedTab = this.mLastRelatedIndex ? this.tabs[this.mLastRelatedIndex] : null;
+ if (lastRelatedTab) {
+ if (!lastRelatedTab.selected)
+ lastRelatedTab.owner = null;
+ }
+
newBrowser.setAttribute("primary", "true");
this.mCurrentBrowser = newBrowser;
this.mCurrentTab = this.selectedTab;
this.mCurrentTab.removeAttribute("unread");
this.finder.mListeners.forEach(l => this.mCurrentBrowser.finder.addResultListener(l));
var tabListener = this.mTabListeners[this.tabContainer.selectedIndex];
@@ -1445,16 +1457,19 @@
opener: null,
};
}
params.focusNewTab = params.inBackground != null ?
!params.inBackground :
!Services.prefs.getBoolPref("browser.tabs.loadInBackground");
+ if (params.focusNewTab)
+ params.ownerTab = this.selectedTab;
+
return this.addTab(aURI, params);
]]>
</body>
</method>
<method name="loadTabs">
<parameter name="aURIs"/>
<parameter name="aLoadInBackground"/>
@@ -1556,43 +1571,49 @@
<parameter name="aPostData"/>
<parameter name="aFocusNewTab"/>
<parameter name="aAllowThirdPartyFixup"/>
<body>
<![CDATA[
var aTriggeringPrincipal;
var aReferrerPolicy;
var aFromExternal;
+ var aOwner;
var aRelatedToCurrent;
var aAllowMixedContent;
var aNoReferrer;
var aUserContextId;
var aOriginPrincipal;
var aOpener;
if (arguments.length == 2 &&
arguments[1] != null &&
typeof arguments[1] == "object" &&
!(arguments[1] instanceof Ci.nsIURI)) {
let params = arguments[1];
aTriggeringPrincipal = params.triggeringPrincipal;
aReferrerURI = params.referrerURI;
aReferrerPolicy = params.referrerPolicy;
aCharset = params.charset;
aPostData = params.postData;
+ aOwner = params.ownerTab;
aFocusNewTab = params.focusNewTab;
aAllowThirdPartyFixup = params.allowThirdPartyFixup;
aFromExternal = params.fromExternal;
aRelatedToCurrent = params.relatedToCurrent;
aAllowMixedContent = params.allowMixedContent;
aNoReferrer = params.noReferrer;
aUserContextId = params.userContextId;
aOriginPrincipal = params.originPrincipal;
aOpener = params.opener;
}
+ // if we're adding tabs, we're past interrupt mode, ditch the owner
+ if (this.mCurrentTab.owner)
+ this.mCurrentTab.owner = null;
+
this._browsers = null; // invalidate cache
var t = this.referenceTab.cloneNode(true);
var blank = !aURI || aURI == "about:blank";
if (!blank)
t.setAttribute("label", aURI);
@@ -1640,16 +1661,20 @@
// We start our browsers out as inactive.
b.docShellIsActive = false;
this.mStrip.collapsed = false;
Services.prefs.setBoolPref("browser.tabs.forceHide", false);
+ // If this new tab is owned by another, assert that relationship
+ if (aOwner)
+ t.owner = aOwner;
+
// wire up a progress listener for the new browser object.
var position = this.tabs.length - 1;
var tabListener = this.mTabProgressListener(t, b, blank);
const filter = Cc["@mozilla.org/appshell/component/browser-status-filter;1"]
.createInstance(Ci.nsIWebProgress);
filter.addProgressListener(tabListener, Ci.nsIWebProgress.NOTIFY_ALL);
b.webProgress.addProgressListener(filter, Ci.nsIWebProgress.NOTIFY_ALL);
this.mTabListeners[position] = tabListener;
@@ -1689,16 +1714,20 @@
// aReferrerURI is null or undefined if the tab is opened from
// an external application or bookmark, i.e. somewhere other
// than the current tab.
if ((aRelatedToCurrent || aReferrerURI ||
Services.prefs.getBoolPref("browser.tabs.insertAllTabsAfterCurrent")) &&
Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent")) {
var lastRelatedIndex = this.mLastRelatedIndex ||
this.tabContainer.selectedIndex;
+ if (this.mLastRelatedIndex)
+ this.tabs[this.mLastRelatedIndex].owner = null;
+ else
+ t.owner = this.selectedTab;
this.moveTabTo(t, ++lastRelatedIndex);
this.mLastRelatedIndex = lastRelatedIndex;
}
if (aFocusNewTab) {
var parentTab = this.selectedTab;
this.selectedTab = t;
this.mPreviousTab = parentTab;
@@ -2007,16 +2036,23 @@
oldBrowser.webProgress.removeProgressListener(filter);
filter.removeProgressListener(this.mTabListeners[index]);
this.mTabFilters.splice(index, 1);
this.mTabListeners.splice(index, 1);
// We are no longer the primary content area
oldBrowser.removeAttribute("primary");
+ // Remove this tab as the owner of any other tabs, since it's going away.
+ for (let tab of this.tabs) {
+ if ("owner" in tab && tab.owner == aTab)
+ // |tab| is a child of the tab we're removing, make it an orphan
+ tab.owner = null;
+ }
+
// Now select the new tab before nuking the old one.
var currentIndex = this.tabContainer.selectedIndex;
var newIndex = -1;
if (currentIndex > index)
newIndex = currentIndex - 1;
else if (currentIndex < index)
newIndex = currentIndex;
@@ -2033,17 +2069,21 @@
this._browsers = null;
// Clean up before/afterselected attributes before removing the tab
aTab._selected = false;
aTab.remove();
// When the current tab is removed select a new tab
// and fire select events on tabpanels and tabs
- if (this.mPreviousTab && (aTab == this.mCurrentTab))
+ if (aTab.owner && !aTab.owner.hidden && !aTab.owner.closing &&
+ Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")) {
+ this.selectedTab = aTab.owner;
+ }
+ else if (this.mPreviousTab && (aTab == this.mCurrentTab))
this.selectedTab = this.mPreviousTab;
else {
this.tabContainer.selectedIndex = newIndex;
// We need to explicitly clear this, because updateCurrentBrowser
// doesn't get called for a background tab
this.mPreviousTab = null;
}