我的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"
}
只有在后台页面冻结
后,才会禁用并重新启用扩展程序让它再次开始工作以下是冻结后台页面检查窗口的屏幕截图:
答案 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]);
});