From 762c7de9ceef170ecca3d7da437822b74d581c1b Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 7 Nov 2018 23:45:33 +0800 Subject: [PATCH] Fix: make API work in private windows --- js/msg.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/js/msg.js b/js/msg.js index d6c0cb35..d50f6341 100644 --- a/js/msg.js +++ b/js/msg.js @@ -13,6 +13,15 @@ const msg = (() => { handler: null, 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 tabSend = chrome.tabs && promisify(chrome.tabs.sendMessage.bind(chrome.tabs)); @@ -195,6 +204,10 @@ const msg = (() => { } function handleMessage(message, sender, sendResponse) { + if (message._msg) { + // internal message + return; + } const handlers = message.target === 'tab' ? handler.tab.concat(handler.both) : message.target === 'extension' ? handler.extension.concat(handler.both) : @@ -251,12 +264,22 @@ const msg = (() => { if (bg === undefined) { 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) { - message.data = deepCopy(message.data); + data = deepCopy(message.data); } else { bg._msg.storage.delete(message.id); } + exchange(data); + + function exchange(newData) { + message.data = newData; + } } function exchangeSet(message) {