Fix: make API work in private windows

This commit is contained in:
eight 2018-11-07 23:45:33 +08:00
parent 4db8a9ea9a
commit 762c7de9ce

View File

@ -13,6 +13,15 @@ const msg = (() => {
handler: null, handler: null,
clone: deepCopy clone: deepCopy
}; };
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message._msg === 'getMsg') {
const data = window._msg.storage.get(message.id);
if (!message.keepStorage) {
window._msg.storage.delete(message.id);
}
sendResponse(data);
}
});
} }
const runtimeSend = promisify(chrome.runtime.sendMessage.bind(chrome.runtime)); const runtimeSend = promisify(chrome.runtime.sendMessage.bind(chrome.runtime));
const tabSend = chrome.tabs && promisify(chrome.tabs.sendMessage.bind(chrome.tabs)); const tabSend = chrome.tabs && promisify(chrome.tabs.sendMessage.bind(chrome.tabs));
@ -195,6 +204,10 @@ const msg = (() => {
} }
function handleMessage(message, sender, sendResponse) { function handleMessage(message, sender, sendResponse) {
if (message._msg) {
// internal message
return;
}
const handlers = message.target === 'tab' ? const handlers = message.target === 'tab' ?
handler.tab.concat(handler.both) : message.target === 'extension' ? handler.tab.concat(handler.both) : message.target === 'extension' ?
handler.extension.concat(handler.both) : handler.extension.concat(handler.both) :
@ -251,12 +264,22 @@ const msg = (() => {
if (bg === undefined) { if (bg === undefined) {
return preparing.then(() => exchangeGet(message, keepStorage)); return preparing.then(() => exchangeGet(message, keepStorage));
} }
message.data = bg._msg.storage.get(message.id); if (!bg) {
// FF's private window
return runtimeSend({_msg: 'getMsg', id: message.id, keepStorage})
.then(exchange);
}
let data = bg._msg.storage.get(message.id);
if (keepStorage) { if (keepStorage) {
message.data = deepCopy(message.data); data = deepCopy(message.data);
} else { } else {
bg._msg.storage.delete(message.id); bg._msg.storage.delete(message.id);
} }
exchange(data);
function exchange(newData) {
message.data = newData;
}
} }
function exchangeSet(message) { function exchangeSet(message) {