簡単なWeb拡張機能を作成しようとしています。現在、私はさまざまなチュートリアルに従って、アーキテクチャを理解しようとしています。
特定のタブとの相互作用は、Webサイトのソースコードに挿入されたcontent_scriptsを使用して行われます。content_scriptsが自動的にロードされるように私には思えます:https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Content_scripts
MDNのチュートリアルでは、これがさらに明確になります。
このスクリプトは、content_scriptsmanifest.jsonキーで指定されたパターンに一致するページに読み込まれます。スクリプトは、ページ自体によってロードされるスクリプトと同じように、ドキュメントに直接アクセスできます。
私の拡張機能は、すべてのテキスト選択でコンテキストメニューを提供することになっています。出発点として、私はchromeの便利なサンプル拡張機能を見つけました。あなたはここでそれを見つけることができますhttps://developers.chrome.com/extensions/samples、それは「話す選択」と呼ばれています
この拡張機能は、ttsエンジンを使用して選択したテキストを読み取ります。しかし、ソースコードの一部は紛らわしいです。それらには、タブでcontent_scriptsを実行するための明示的な関数があります。このコードは、バックグラウンドスクリプトの1つでInit()関数の一部として実行されます。
function loadContentScriptInAllTabs() {
chrome.windows.getAll({'populate': true}, function(windows) {
for (var i = 0; i < windows.length; i++) {
var tabs = windows[i].tabs;
for (var j = 0; j < tabs.length; j++) {
chrome.tabs.executeScript(
tabs[j].id,
{file: 'keycodes.js', allFrames: true});
chrome.tabs.executeScript(
tabs[j].id,
{file: 'content_script.js', allFrames: true});
}
}
});
}
私の知る限り、コードはブラウザが起動するとすぐに実行されます。それは冗長ではありませんか?
それらのmanifest.jsonがcontent_scriptの実行を処理する必要があります。関連するコードは次のとおりです。
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"all_frames": true,
"js": [
"keycodes.js",
"content_script.js"
]
}
],
開いているすべてのタブにスクリプトを挿入する適切な方法は何ですか?
簡単な答え:Chromeでは必要ですがFirefoxでは必要ありません。
Chromeは、拡張機能の読み込み時にコンテンツスクリプトを一致するページに読み込みません(初期読み込みだけでなく、拡張機能の更新も含まれます)。
したがって、(将来のナビゲーションではなく)拡張機能のロード時にタブのコンテンツスクリプト機能を開きたい場合は、このコード(または同様のもの)が必要です。
このコードは、で少し現代化できchrome.tabs.query
ます。
Firefoxは、この点でのクロムと互換性がありません:それはありませんロード時に一致していることを、すべてのコンテンツのスクリプト注入自動的に。したがって、ブラウザの検出や1回限りのガードコードの挿入を使用する必要があります。
彼らがそれを重大な変化として紹介しなかったらいいのにと思います。移行を容易にするための動作を選択するためのマニフェストキーを少なくとも提供することは理にかなっています。
注:拡張機能のリロードシナリオでは、古いインスタンスのコンテンツスクリプトが引き続き存在します(ただし、拡張機能のAPIは失敗します)。それを優雅に処理するのはあなたの責任です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加