2

パッケージ化されておらず、コンピューター上の単なるディレクトリである、機能するChrome拡張機能を作成しました。これを Firefox にかなり簡単に移植できるはずだということがわかりました。

MDN の「 Google Chrome 拡張機能の移植」ガイドに従っていると、マニフェスト ファイルが完璧であることがわかりました。

次に、拡張機能の「Firefox での一時的なインストール」を実行する方法の指示に従いました。

ただし、ディレクトリ内のファイルをクリックしても何も起こりません。拡張機能が読み込まれません。何かアドバイス?拡張機能が Chrome で正常に動作し、エラーなく読み込まれることはわかっています。

manifest.json :

{
  "manifest_version": 2,
  "name": "ER",
  "description": "P",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },

  "background": {
    "scripts": [ "background.js" ]
  },

  "content_scripts": [
    {
      "matches": [ "SiteIwant" ],
      "js": [ "ChromeFormFill.js" ],
      "run_at":  "document_idle" 

    }
  ],

  "permissions": [
    "*://*/*",
    "cookies",
    "activeTab",
    "tabs",
    "https://ajax.googleapis.com/"
  ],
  "externally_connectable": {
    "matches": ["SiteIwant"]
  }
}

ChromeFormFill.js :

// JavaScript source c
console.log("inside content");
console.log(chrome.runtime.id);
document.getElementById("ID").value = chrome.runtime.id.toString();

Background.js

chrome.runtime.onMessage.addListener(
  function (request, sender, sendResponse) {
      if (request.data === "info") {
          console.log("Recieving Info");
          return true;
      }
 });

chrome.tabs.create(
{
    url: 'myUrl' 
    active: true
}, function (tab) {
    chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });
});

Run.jsはただalert('hi').

Firefox にロードしようとしても、何もしません。何も起こりません。

4

1 に答える 1

4

問題:

manifest.jsonで:

externally_connectableはサポートされていません: 1

Firefox はサポートしていませんexternally_connectable詳細については、バグ 1319168に従ってください。現時点では、これが実装される予定の時期はありません。

別の方法を使用して、サイトのコードと WebExtension の間で通信する必要があります。これを行う方法は、コンテンツ スクリプトを挿入し、サイトのコードとコンテンツ スクリプトの間で通信することです。これを行う一般的な方法は、CustomEvent()またはwindow.postMessage()です。私の好みはCustomEvent()です。

を使用するwindow.postMessage()ことは、外でメッセージを大声で叫び、他の誰も聞いていないこと、またはメッセージを無視する必要があることを知っていることを期待するようなものです. 同じように使用している他の人のコードはwindow.postMessage()、あなたのメッセージを無視するように書かれているに違いありません。他のコードからの潜在的なメッセージを無視するようにコードを記述する必要があります。これらのいずれかが行われていない場合、コードまたは他のコードが誤動作する可能性があります。

使用CustomEvent()することは、部屋にいる誰かと直接話すようなものです。他の人が聞いている可能性がありますが、そのためには部屋の存在を知る必要があり、具体的にはあなたの会話を聞いていることを選択します。カスタム イベントは、指定したイベント タイプ (選択した任意の有効な識別子) をリッスンしているコードによってのみ受信されます。これにより、誤って干渉が発生する可能性が大幅に低くなります。また、複数の異なるイベント タイプを使用して異なることを意味するように選択することも、1 つのイベント タイプのみを使用してメッセージのフォーマットを定義し、必要なメッセージ タイプを区別することもできます。

matches値は有効である必要があります (意図的に編集されていると想定されます):

2 つの行があります (1 つは末尾,に があり、もう 1 つはありません。どちらも構文的に正しい):

"matches": ["SiteIwant"]

"SiteIwant"は有効な一致パターンである必要があります。これは、作業しているサイトを難読化するために有効なものから変更されたと思います。私が使用した:

"matches": [ "*://*.mozilla.org/*" ]

Background.jsで:

台詞:

    url: 'myUrl' 
    active: true

する必要があります:

    url: 'myUrl',
    active: true

[,後に注意してください'myUrl'。] さらに、myUrl は有効な URL である必要があります。私が使用した:

    url: 'http://www.mozilla.org/',

Firefox 48 のバグ (現在は長い間修正されています):

あなたの行:

chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });

Firefox 48 では、この行はタブが使用可能になる前に実行されます。これはバグです。これはFirefox Developer EditionNightlyで修正されています。開発をテスト/継続するには、それらのいずれかが必要になります。

ChromeFormFill.jsの問題:

別の Firefox 48 のバグ (現在は長い間修正されています):

chrome.runtime.id is undefined. これは、Developer Edition と Nightly で修正されています。

潜在的なコンテンツ スクリプトの問題:

HTML に ID = の要素があると仮定します'ID'。そうでない場合は、 にdocument.getElementById("ID")なりますnull。戻り値が有効かどうかを確認しません。

サンプルコードの実行

これらのエラーがすべて解決され、Firefox Nightly または Developer Edition で実行されると、問題なく動作しました。ただし、機能しないであることに依存するものは何もありませexternally_connectableんでした。


  1. agaggiは、この問題を回答の元のバージョンに含めるのを忘れていたことに気付きました。
于 2016-08-12T05:31:55.167 に答える