use*_*109 5 javascript google-chrome google-chrome-extension
每隔一段时间,我的 chrome 扩展程序的background.js页面就会冻结,我不知道是什么原因造成的。
当background.js文件冻结时,它不再响应来自内容脚本的消息,当我尝试通过扩展管理器打开后台页面来检查它时,会弹出窗口,但它保持空白,并且不会出现界面。
我在后台页面所做的唯一事情是消息传递和检索本地存储变量。
我无法弄清楚是什么导致了这个问题,这个错误似乎只是在我从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
});
Run Code Online (Sandbox Code Playgroud)
是否可能发生死锁情况导致页面冻结?它不会导致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"
}
Run Code Online (Sandbox Code Playgroud)
一旦后台页面冻结,只有禁用并重新启用扩展程序才能使其重新开始工作
下面是冻结背景页面检查窗口的屏幕截图:

小智 3
localStorage API 是有问题的,因为在 chrome 中,它是本质上异步操作的同步 API(从渲染器进程调用,然后渲染器进程必须与浏览器进程通信,该浏览器进程读取/写入文件系统中的后备存储,并可能回复到渲染器进程)。虽然理论上不可能导致网页或扩展代码出现死锁,但 Chrome 的实现中可能存在错误。
您可以尝试的一件事是从 localStorage 切换到chrome.storage.local。由于它具有异步 API,因此使用起来需要做更多的工作,但不会遇到与 localStorage 相同的实现复杂性。
例如
sendResponse({data: localStorage[request.key]});
Run Code Online (Sandbox Code Playgroud)
变成
chrome.storage.local.get(request.key, function(storageResult) {
sendResponse(storageResult[request.key]);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2143 次 |
| 最近记录: |