カテゴリー
JavaScript

Chrome ExtensionのService_WorkerとContent_Script

Service_Worker(Background)とContent_Script(DOM側)の関係が少し分かりにくかったので、書きとめておきます。

以下ではService_Workerをbackground.js、Content_Scriptをcontent.jsとファイル名で呼びます。

content.jsにはDOM(Document Object Model)とのやりとりに関するコード、background.jsにはその他の処理を記述する、と捉えると分かりやすいです。

content.jsとbackground.js間のやりとりはmessagesを介して行います。

background.jsからcontent.jsへは現在アクティブなtab情報を利用してmessagesを送るので、chrome.tabs.sendMessages APIを使います。

// background.js

function setListenerOnMenus() {
  chrome.contextMenus.onClicked.addListener( async (info, tab) => {
    chrome.tabs.sendMessage(tab.id, {
      // some message. can be blank
      something: "some message",
      somethingElse: "another message"
    }, (response) => {
      // receiver of the message (content.js) can return a respond
      // in a callback
      // background.js can respond to that response here...
      let context = response.context;
      let url = response.url;
      // do something with it!...
    }
  }
}
// content.js
chrome.runtime.onMessage.addListener( (request, sender, sendResponse) => {
  // request contains messages sent from background.js. Can retrieve as below...
  let something = request.something;
  let somethingElse = request.somethingElse;
  
  // also, content.js can interact/manipulate DOM element and communicate it back to background.js
  let url = window.location.href;
  let context = window.getSelection().anchorNode.data;
  // can communicate back in the callback below...
  sendResponse({
    context: context,
    url: url
  });
}

background.jsにはonStartup listenerを追加することで、extension使用時に起動するようになります。

// background.js

chrome.runtime.onStartup.addListener(() => {
  setup();
});