一旦发生 Chrome 扩展更新,“孤立”的内容脚本就会从扩展中完全切断。它仍然可以通信的唯一方法是通过共享 DOM。如果您谈论的是真正敏感数据,那么从页面来看这并不安全。稍后会详细介绍。
首先,您可以延迟更新。在您的后台脚本中,为chrome.runtime.onUpdateAvailable 事件添加一个处理程序。只要听者在,你就有机会进行清理。
// Background script
chrome.runtime.onUpdateAvailable.addListener(function(details) {
// Do your work, call the callback when done
syncRemainingData(function() {
chrome.runtime.reload();
});
});
其次,假设最坏的情况发生了,你被切断了。您仍然可以使用 DOM 事件进行通信:
// Content script
// Get ready for data
window.addEventListener("SendRemainingData", function(evt) {
processData(evt.detail);
}, false);
// Request data
var event = new CustomEvent("RequestRemainingData");
window.dispatchEvent(event);
// Be ready to send data if asked later
window.addEventListener("RequestRemainingData", function(evt) {
var event = new CustomEvent("SendRemainingData", {detail: data});
window.dispatchEvent(event);
}, false);
但是,此通信渠道可能会被主机页面窃听。而且,如前所述,窃听不是您可以绕过的。
不过,您可以拥有一些带外预共享数据。假设您在第一次安装时生成了一个随机密钥并将其保存在chrome.storage - 无论如何网页都无法访问该密钥。当然,一旦成为孤儿就无法读取它,但在注入的那一刻你可以。
var PSK;
chrome.storage.local.get("preSharedKey", function(data) {
PSK = data.preSharedKey;
// ...
window.addEventListener("SendRemainingData", function(evt) {
processData(decrypt(evt.detail, PSK));
}, false);
// ...
window.addEventListener("RequestRemainingData", function(evt) {
var event = new CustomEvent("SendRemainingData", {detail: encrypt(data, PSK)});
window.dispatchEvent(event);
}, false);
});
这当然是概念验证代码。我怀疑您需要的不仅仅是onUpdateAvailable 听众。