是什么导致我的chrome扩展background.js冻结而不响应消息

时间:2014-02-12 22:07:29

标签: javascript google-chrome google-chrome-extension

我的Chrome扩展程序的 background.js 页面每隔一段时间就会冻结,我不知道是什么导致它。

background.js 文件冻结时,它不再响应来自内容脚本的消息,当我尝试通过扩展管理器打开后台页面进行检查时,窗口会弹出向上,但它保持空白,没有界面出现。

我在后台页面中做的唯一事情是消息传递和检索localstorage变量。

我无法弄清楚导致这种情况的原因,因为我从 chrome.extension api转换到新的 chrome.runtime api后,似乎只发生了这个错误

谁能告诉我这里出了什么问题?还是帮我解决一下?谢谢!

全部是 background.js 文件的代码

if (!chrome.runtime) {
  // Chrome 20-21
  chrome.runtime = chrome.extension;
} else if(!chrome.runtime.onMessage) {
  // Chrome 22-25
  chrome.runtime.onMessage = chrome.extension.onMessage;
  chrome.runtime.sendMessage = chrome.extension.sendMessage;

}

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.method == "getLocalStorage")
    sendResponse({data: localStorage[request.key]}); // decodeURIComponent
  else if (request.method == "setLocalStorage")
    sendResponse({data: localStorage[request.key]=request.value});
  else
    sendResponse({}); // send empty response
});

是否可能出现冻结页面的死锁情况?它不会导致CPU发疯,所以我猜它不是一个无限循环。

更新 这是 manifest.json 按要求

{
   "manifest_version": 2,
   "content_scripts": [ {
      "exclude_globs": [ "http://*.facebook.com/ajax/*", "https://*.facebook.com/ajax/*" , "http://www.facebook.com/ai.php?*", "https://www.facebook.com/ai.php?*", "http://www.facebook.com/ajax/*", "https://www.facebook.com/ajax/*"],
      "include_globs": [ "http://*.facebook.com/*", "https://*.facebook.com/*" ],
      "js": [ "script.js" ],
      "matches": [ "http://*.facebook.com/*", "https://*.facebook.com/*" ],
      "run_at": "document_start"
   } ],
   "converted_from_user_script": true,
   "background": {"scripts": ["background.js"], 
                  "persistent": false},
   "icons": {
      "128": "ET-128x128.png",
      "48": "ET-48x48.png"
   },
   "key": "xxxxxxxxxxxxxxxxxxxx",
   "name": "Extension Test",
   "short_name": "ET",
   "description": "ET Does this and that, but doesnt phone home",
   "version": "999",
   "homepage_url": "http://www.etphonehome.com"
}

只有在后台页面冻结

后,才会禁用并重新启用扩展程序让它再次开始工作

以下是冻结后台页面检查窗口的屏幕截图: here is a screenshot of the frozen background page inspection window

1 个答案:

答案 0 :(得分:3)

localStorage API存在问题,因为在chrome中它是一个固有异步操作的同步API(从渲染器进程调用,然后必须与浏览器进程通信,该进程从文件系统中的后备存储读取/写入,并且可能回复渲染器过程)。虽然理论上不应该导致网页或扩展代码出现死锁,但Chrome的实现可能存在漏洞。

您可能尝试的一件事是从localStorage切换到chrome.storage.local。使用它需要更多的工作,因为它具有异步API,但不会遇到与localStorage相同的实现复杂性。

E.g。

sendResponse({data: localStorage[request.key]});

变为

chrome.storage.local.get(request.key, function(storageResult) {
  sendResponse(storageResult[request.key]);
});