diff --git a/webextensions/background/api-tabs-listener.js b/webextensions/background/api-tabs-listener.js index c1aa424c7..a55507e05 100644 --- a/webextensions/background/api-tabs-listener.js +++ b/webextensions/background/api-tabs-listener.js @@ -330,7 +330,7 @@ async function onNewTabTracked(tab, info) { const duplicatedInternally = window.duplicatingTabsCount > 0; const maybeOrphan = window.toBeOpenedOrphanTabs > 0; const activeTab = Tab.getActiveTab(window.id); - const fromExternalApplication = !mAppIsActive; + const fromExternal = !mAppIsActive; // New tab's index can become invalid because the value of "index" is same to // the one given to browser.tabs.create() (new tab) or the original index @@ -362,7 +362,7 @@ async function onNewTabTracked(tab, info) { mayBeReplacedWithContainer, maybeOrphan, activeTab, - fromExternalApplication + fromExternal }); if (Tab.needToWaitTracked(tab.windowId, { exceptionTabId: tab.id })) @@ -471,7 +471,7 @@ async function onNewTabTracked(tab, info) { duplicated, duplicatedInternally, activeTab, - fromExternalApplication + fromExternal }); // don't do await if not needed, to process things synchronously if (moved instanceof Promise) @@ -516,7 +516,7 @@ async function onNewTabTracked(tab, info) { duplicatedInternally, originalTab: duplicated && Tab.get(uniqueId.originalTabId), treeForActionDetection, - fromExternalApplication + fromExternal }); tab.$TST.resolveOpened(); diff --git a/webextensions/background/handle-new-tabs.js b/webextensions/background/handle-new-tabs.js index fa91acf90..3403892f6 100644 --- a/webextensions/background/handle-new-tabs.js +++ b/webextensions/background/handle-new-tabs.js @@ -41,11 +41,11 @@ Tab.onCreating.addListener((tab, info = {}) => { TabsStore.addToBeGroupedTab(tab); } else { + let dontMove = false; if (!info.maybeOrphan && possibleOpenerTab && !info.restored) { let autoAttachBehavior = configs.autoAttachOnNewTabCommand; - let dontMove = false; if (tab.$TST.nextTab && possibleOpenerTab == tab.$TST.previousTab) { // New tab opened with browser.tabs.insertAfterCurrent=true may have @@ -85,7 +85,17 @@ Tab.onCreating.addListener((tab, info = {}) => { else if (possibleOpenerTab != tab) { tab.$TST.possibleOpenerTab = possibleOpenerTab.id; } - tab.$TST.isNewTab = true; + tab.$TST.isNewTab = !info.fromExternal; + } + if (info.fromExternal) { + log('behave as a tab opened from external application'); + return Tree.behaveAutoAttachedTab(tab, { + baseTab: possibleOpenerTab, + behavior: configs.autoAttachOnOpenedFromExternal, + dontMove, + inheritContextualIdentity: configs.inheritContextualIdentityToTabsFromExternal, + broadcast: true + }).then(moved => !moved); } log('behave as a tab opened with any URL'); tab.$TST.positionedBySelf = info.positionedBySelf; @@ -111,8 +121,9 @@ Tab.onCreating.addListener((tab, info = {}) => { else if (!info.maybeOrphan && configs.autoAttach) { return Tree.behaveAutoAttachedTab(tab, { baseTab: opener, - behavior: configs.autoAttachOnOpenedWithOwner, + behavior: info.fromExternal ? configs.autoAttachOnOpenedFromExternal : configs.autoAttachOnOpenedWithOwner, dontMove: info.positionedBySelf || info.mayBeReplacedWithContainer, + inheritContextualIdentity: info.fromExternal ? configs.inheritContextualIdentityToTabsFromExternal : false, broadcast: true }).then(moved => !moved); } diff --git a/webextensions/common/common.js b/webextensions/common/common.js index 923a326f3..bef927f65 100644 --- a/webextensions/common/common.js +++ b/webextensions/common/common.js @@ -144,6 +144,7 @@ export const configs = new Configs({ autoAttachOnNewTabButtonMiddleClick: Constants.kNEWTAB_OPEN_AS_CHILD, autoAttachOnDuplicated: Constants.kNEWTAB_OPEN_AS_NEXT_SIBLING, autoAttachSameSiteOrphan: Constants.kNEWTAB_OPEN_AS_CHILD, + autoAttachOnOpenedFromExternal: Constants.kNEWTAB_DO_NOTHING, guessNewOrphanTabAsOpenedByNewTabCommand: true, guessNewOrphanTabAsOpenedByNewTabCommandUrl: 'about:newtab', inheritContextualIdentityToNewChildTab: false,