javascript - 如何正确处理来自内容脚本的 chrome 扩展更新

标签 javascript google-chrome google-chrome-extension

在后台页面中,我们能够使用 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/

相关文章:

javascript - 在 Javascript 中使用 switch 语句处理多个 case 时,如何引用一个 case?

javascript使用嵌套的for循环动态更改网页的内容

javascript - 谷歌浏览器 session 过期= null 不工作

google-chrome - 在水平模式下打开 (chrome) devtools

javascript - 使用链接登录网站

javascript - 通过 Chrome 浏览器阻止网站?

javascript - 操作 DOM 时的数据绑定(bind)不适用于 Angular、Knockout

javascript - 如果在 DOM 中找不到选择器或类,则出现错误 "Cannot read property ' click' of undefined”

javascript - 如何使用我的 Chrome 扩展文件分发 OAuth2 客户端 ID?

javascript - 将变量从内容脚本传递到弹出窗口