序章
Chrome の拡張機能に問題があります。テキストの選択に基づいて、Google からの検索結果を含む小さなオーバーレイ ポップアップ ウィンドウ (jQuery で作成) を表示するはずです。基本的に、任意のページのテキストを強調表示し、それを右クリックして (コンテキスト メニュー)、[「選択したキーワード」を検索] をクリックすると、同じタブに小さなウィンドウがポップアップし、すべての検索結果がオーバーレイとして表示されます。グーグルまたは別の検索エンジン。
問題
現在、拡張機能は問題なく非常にうまく機能しますが、この拡張機能を長時間 (たとえば 1 時間) 使用した後、別のキーワードを強調表示して検索すると、拡張機能が最後のキーワードを思い出し、間違った検索結果が表示されます。もう一度、別のキーワードを強調表示すると、強調表示したキーワードが記憶されますが、以前は結果が得られませんでした。それは連鎖するプロセスのようなもので、私は常に 1 つのキーワードの後ろにいます。
私の考え
この問題が発生したときに console.log(chrome.extension.onRequest.hasListeners()); からログを取得しているため、この問題の原因はイベント リスナーである可能性があると思います。これは本当です。これは、2 つ以上のイベント リスナーがアタッチされていることを意味します。
実際の Web ページがまだロードされていて、キーワードを強調表示しているときに発生する可能性があります。コンテキスト メニューをクリックすると、拡張機能はまだロードできませんが、どういうわけかイベント リスナーが起動します...この問題を完全に再現することはできません...そしてこの問題の原因。
マニフェスト ファイル
{
"name": "Search Accelerator",
"version": "1.0",
"manifest_version": 2,
"description": "Search Accelerator extension",
"icons": {
"16": "icon19.png",
"48": "icon48.png",
"128": "icon128.png"
},
"background": {
"scripts": ["content_script.js"]
},
"minimum_chrome_version": "18",
"permissions": [
"contextMenus",
"tabs",
"http://*/*",
"https://*/*",
"management",
"webRequest"
]
}
コンテンツ スクリプト
chrome.contextMenus.create({ "title": '"%s" を検索',
"contexts":['selection'], "onclick": getClickHandler() });function getClickHandler() { return function(info, tab) {
console.log(chrome.extension.onRequest.hasListeners());chrome.extension.onRequest.addListener(function listener1 (request, sender, sendResponse) { var url = "http://www.google.com/?s=" + info.selectionText; console.log(url); var keywordObj = {keyword: url}; if (request.keywordRequest == "Yes") { console.log(keywordObj); sendResponse(keywordObj); }; chrome.extension.onRequest.removeListener(listener1); } ); chrome.tabs.executeScript(null, { file: "jquery.js" }, function() { chrome.tabs.executeScript(null, { file: "popup.js" }); }); }; };
ポップアップjs
chrome.extension.sendRequest({keywordRequest: "Yes"}, function(response) {
$(document).ready(function() {
if($("#e14_accelerator")) {
$("#e14_accelerator").remove();
}
var rkeyword = response.keyword;
$("body").append("<div id=\"e14_accelerator\" style=\"position: fixed;top: 30px;right: -330px;z-index: 999999; \"><iframe style=\"border:5px solid #c9c9c9;-webkit-box-shadow: 1px 1px 15px 1px rgba(0, 0, 0, 0.2);\" src=\""+ rkeyword +"\" width=\"328\" height=\"240\"></iframe></div>");
$("#e14_accelerator").animate({right:-13},500);
$(document).click(function() {
$("#e14_accelerator").remove();
});
$("#e14_accelerator").click(function() {
return false;
});
});
});
この問題が発生したときに表示されるエラー メッセージ:
Error during tabs.executeScript: Cannot access contents of url "chrome-devtools://devtools/devtools.html?docked=true&dockSide=bottom&toolbarColor=rgba(230,230,230,1)&textColor=rgba(0,0,0,1)". Extension manifest must request permission to access this host. sendRequest:21
chromeHidden.handleResponse sendRequest:21
Error during tabs.executeScript: Cannot access contents of url "chrome-devtools://devtools/devtools.html?docked=true&dockSide=bottom&toolbarColor=rgba(230,230,230,1)&textColor=rgba(0,0,0,1)". Extension manifest must request permission to access this host. sendRequest:21
chromeHidden.handleResponse