🐳

[Chrome拡張機能] background/content script/popupのメッセージやり取りのイメージ

2024/09/01に公開

Chrome拡張機能を作っていて、いろいろ混乱したのでまとめておきます。

各スクリプトの主な用途

  • background.js <service worker>
    裏で動かしておくもの。APIをフルで使えるので以下2つの橋渡し的役割。
  • content.js <content script>
    表示されたページに対して書き換えなど、DOM操作を行う。
  • popup.js <browser action>
    アイコンがクリックされたときの動作および表示されたpopup表示内の処理を担う。

互いにAPIによって情報のやり取りする。(メッセージパッシング)

メッセージを送るときはsend.Message、受け取るときはonMessage

メッセージを送信
    chrome.XX.sendMessage({ message: "送るよ" }, (response) => {
      //処理
    });
メッセージを受信
    chrome.XX.onMessage.addListener((request, sender, sendResponse) =>{
        console.log(request.message) //送るよ
    });

タブの情報を取得するときは、tabs.query

  • アクティブなタブを取得

    background.js
        chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
            console.log({ tabs })
        });
    
  • すべてのタブを取得

    background.js
        chrome.tabs.query({}, (tabs) => {
            console.log({ tabs })
        });
    

各スクリプト間のメッセージやり取り

background.js → content js

background.js(メッセージを送信)
  //この前にtabの情報(tab.id)を取得するコードを書いておく必要がある。
  
  chrome.tabs.sendMessage(tab.id, {message:'to_content_script'}, (response)=>{
      //処理
  });
content.js(メッセージを受信)
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>{
    //処理
  });
  • content.jsでページの書き換えなどを行いたいときタブ情報が必要ですが、content.jsではタブ情報を得ることができません(タブIDを取得するtabs APIを使えない)。そのためtabsAPIを使用可能なbackground.jsを介してtab情報をcontentへ渡します。
  • メッセージパッシングの図から、background→contentではtabs APIを使用していることがわかります。

popup.js → background.js

popup.js(メッセージを受信)
  chrome.runtime.sendMessage({ message: "to_background" }, (response) => {});
    //処理
  });
background.js(メッセージを送信)
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
      //処理
  });

popup.js → content.js 他

  • メッセージパッシング図と上の2例を参考にしてください。
  • そのほかのつなぎも同じくです。
  • 反対方向へのメッセージも同様です。

content scriptはどのページに対して処理をする?

渡されたタブID(ページ)に対して処理を行う。

  • 以下のイメージです。

  • content scriptは指定されたページ(タブID)のみに対して、処理を実行します。
  • 複数のタブに処理を行う場合は、それらのタブのIDをすべてcontents scriptに対して渡す必要があります。
  • アクティブなタブを指定することもできます。

Discussion