在后台页面中,我们能够使用 chrome.runtime.onInstalled.addListener
检测扩展更新。
但是更新扩展后,所有内容脚本都无法连接到后台页面。我们得到一个错误:Error connecting to extension ....
可以使用 chrome.tabs.executeScript
重新注入(inject)内容脚本...但是如果我们有敏感数据应该在更新前保存并在更新后使用怎么办?我们能做什么?
此外,如果我们重新注入(inject)所有内容脚本,我们应该正确地拆除以前的内容脚本。
在不丢失用户数据的情况下处理来自内容脚本的扩展更新的正确方法是什么?
最佳答案
一旦 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);
但是,此通信 channel 可能会被主机页面窃听。而且,如前所述,窃听不是您可以绕过的。
然而,您可以拥有一些带外预共享数据。假设您在第一次安装时生成了一个随 secret 钥并将其保存在 chrome.storage
中——网页无法通过任何方式访问它。当然,一旦成为孤儿你就无法阅读它,但在注入(inject)时你可以。
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
监听器。
关于javascript - 如何正确处理来自内容脚本的 chrome 扩展更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22516195/