Merge b471cc2fdf
into 4a1597c87f
This commit is contained in:
commit
5bf8b82b71
1 changed files with 87 additions and 0 deletions
|
@ -177,6 +177,93 @@ const assignManager = {
|
||||||
browser.webRequest.onBeforeRequest.addListener((options) => {
|
browser.webRequest.onBeforeRequest.addListener((options) => {
|
||||||
return this.onBeforeRequest(options);
|
return this.onBeforeRequest(options);
|
||||||
},{urls: ["<all_urls>"], types: ["main_frame"]}, ["blocking"]);
|
},{urls: ["<all_urls>"], types: ["main_frame"]}, ["blocking"]);
|
||||||
|
|
||||||
|
// We need to keep track over the last activated tab, in order to open new
|
||||||
|
// tabs in the correct container. See the comments in _onTabCreated for
|
||||||
|
// more details
|
||||||
|
this.lastActivatedTab = new Map();
|
||||||
|
browser.tabs.onActivated.addListener((info) => {
|
||||||
|
this._onTabActivated(info);
|
||||||
|
});
|
||||||
|
// We need to query for the currently active tabs, to support
|
||||||
|
// hot-reloading of the extensions, and possibly also for functioning on
|
||||||
|
// browser startup
|
||||||
|
browser.tabs.query({active: true}).then(active => {
|
||||||
|
active.forEach(tab => {
|
||||||
|
this.lastActivatedTab.set(tab.windowId, tab.id);
|
||||||
|
});
|
||||||
|
}).catch();
|
||||||
|
|
||||||
|
// Add listener that reopens new tabs without container in the same
|
||||||
|
// container as the last tab.
|
||||||
|
browser.tabs.onCreated.addListener((tab) => {
|
||||||
|
this._onTabCreated(tab);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_onTabActivated(info) {
|
||||||
|
this.lastActivatedTab.set(info.windowId, info.tabId);
|
||||||
|
},
|
||||||
|
|
||||||
|
async _onTabCreated(tab) {
|
||||||
|
// Here we rely on the fact that the new tab is created before it can be
|
||||||
|
// activated, so that the "currently active" tab before this set of event
|
||||||
|
// executions is really the previous tab
|
||||||
|
const previousTabId = this.lastActivatedTab.get(tab.windowId);
|
||||||
|
if (!previousTabId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.contextualIdentities.get(tab.cookieStoreId).catch(() => {
|
||||||
|
// We now know that the new tab doesn't have an identity
|
||||||
|
return browser.tabs.get(previousTabId);
|
||||||
|
}).then(previousTab => {
|
||||||
|
if (tab.cookieStoreId === previousTab.cookieStoreId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// We now know that the previous tab did have an identity (as it is
|
||||||
|
// different from the one the new tab has, which is none) therefore, we
|
||||||
|
// add a listener that will reopen the tab once we know the URL.
|
||||||
|
|
||||||
|
// Here we rely on the fact that about:newtab and the like will get
|
||||||
|
// an update event for setting the favicon, and that other sites will
|
||||||
|
// get their URL in the first update event
|
||||||
|
const updateHandler = (tabId, change, newTab) => {
|
||||||
|
if (tabId !== tab.id) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
browser.tabs.onUpdated.removeListener(updateHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.reopenIn(newTab, previousTab.cookieStoreId);
|
||||||
|
};
|
||||||
|
browser.tabs.onUpdated.addListener(updateHandler);
|
||||||
|
}).catch();
|
||||||
|
},
|
||||||
|
|
||||||
|
async reopenIn(tab, cookieStoreId) {
|
||||||
|
const createTabObject = (withUrl) => {
|
||||||
|
const obj = {
|
||||||
|
active: tab.active,
|
||||||
|
cookieStoreId: cookieStoreId,
|
||||||
|
index: tab.index,
|
||||||
|
openerTabId: tab.openerTabId,
|
||||||
|
pinned: tab.pinned,
|
||||||
|
windowId: tab.windowId
|
||||||
|
};
|
||||||
|
if (withUrl) {
|
||||||
|
obj.url = tab.url;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
browser.tabs.create(createTabObject(true)).catch(() => {
|
||||||
|
// We are probably going to the new tab page, which is protected, so
|
||||||
|
// instead, we just open a plain new tab, without an URL
|
||||||
|
return browser.tabs.create(createTabObject(false));
|
||||||
|
}).then(() => {
|
||||||
|
browser.tabs.remove(tab.id);
|
||||||
|
}).catch();
|
||||||
},
|
},
|
||||||
|
|
||||||
async _onClickedHandler(info, tab) {
|
async _onClickedHandler(info, tab) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue