DevTools の拡張

DevTools 拡張機能は、DevTools 固有のアクセスによって、Chrome DevTools に機能を追加します。 拡張機能 API を追加できます。

<ph type="x-smartling-placeholder">
</ph> DevTools ページが
         Service Worker で検証されますService Worker は、
         コンテンツスクリプトとの通信や拡張機能 API へのアクセスなどです。
         [DevTools] ページから、パネルの作成など、DevTools API にアクセスできます。
DevTools 拡張機能のアーキテクチャ

DevTools 固有の拡張機能 API には次のものがあります。

DevTools ページ

DevTools ウィンドウが開くと、DevTools 拡張機能がその DevTools ページのインスタンスを作成します。 ウィンドウが開いている限り存続します。このページから DevTools API と拡張機能 API にアクセスし、次のことができます。

DevTools ページから拡張機能 API に直接アクセスできます。たとえば 使用して Service Worker と通信し、 メッセージの受け渡し

DevTools 拡張機能を作成する

拡張機能の DevTools ページを作成するには、拡張機能に devtools_page フィールドを追加します。 manifest:

{
  "name": ...
  "version": "1.0",
  "devtools_page": "devtools.html",
  ...
}

devtools_page フィールドは HTML ページを指している必要があります。DevTools は ページは拡張機能に対してローカルである必要があります。相対 URL を使用して指定することをおすすめします。

chrome.devtools API のメンバーは、DevTools 内で読み込まれたページでのみ使用できます。 そのウィンドウを開いたままにします。コンテンツ スクリプトやその他の拡張機能ページはアクセスできません 説明します。

DevTools UI 要素: パネルとサイドバー ペイン

ブラウザのアクション、コンテキスト メニュー、ポップアップといった通常の拡張機能 UI 要素に加え、 DevTools 拡張機能を使用すると、DevTools ウィンドウに UI 要素を追加できます。

  • パネルは、[Elements]、[Sources]、[Network] パネルなどの最上位のタブです。
  • サイドバー ペインは、パネルに関連する補足の UI です。スタイル、計算されたスタイル、 [要素] パネルの [イベント リスナー] ペインは、サイドバー ペインの例です。影響 DevTools ウィンドウが固定されている場合、サイドバーペインが 次のサンプル画像のようになります。
で確認できます。 <ph type="x-smartling-placeholder">
</ph> [Elements] パネルと [Styles] サイドバー ペインが表示された [DevTools] ウィンドウ。 [要素] パネルと [スタイル] サイドバー ペインが表示された DevTools ウィンドウ。

各パネルは独自の HTML ファイルであり、他のリソース(JavaScript、CSS、画像など)を含めることができます。 オン)。基本パネルを作成するには、次のコードを使用します。

chrome.devtools.panels.create("My Panel",
    "MyPanelIcon.png",
    "Panel.html",
    function(panel) {
      // code invoked on panel creation
    }
);

パネルまたはサイドバー ペインで実行される JavaScript は、DevTools ページと同じ API にアクセスできます。

基本的なサイドバー ペインを作成するには、次のコードを使用します。

chrome.devtools.panels.elements.createSidebarPane("My Sidebar",
    function(sidebar) {
        // sidebar initialization code here
        sidebar.setObject({ some_data: "Some data to show" });
});

サイドバー ペインにコンテンツを表示する方法はいくつかあります。

  • HTML コンテンツ: setPage() を呼び出して、ペインに表示する HTML ページを指定します。
  • JSON データ: JSON オブジェクトを setObject() に渡します。
  • JavaScript 式: 式を setExpression() に渡します。DevTools は、検査されたページのコンテキストで式を評価し、戻り値を表示します。

setObject()setExpression() の両方で、ペインには、 DevTools コンソール。ただし、setExpression() を使用すると DOM 要素と任意の JavaScript を表示できます。 setObject() は JSON オブジェクトのみをサポートしています。

拡張機能コンポーネント間の通信

以降のセクションでは、DevTools 拡張機能コンポーネントが 相互に通信します。

コンテンツ スクリプトを挿入する

コンテンツ スクリプトを挿入するには、scripting.executeScript() を使用します。

// DevTools page -- devtools.js
chrome.scripting.executeScript({
  target: {
    tabId: chrome.devtools.inspectedWindow.tabId
  },
  files: ["content_script.js"]
});

検査対象のウィンドウのタブ ID を取得するには、 inspectedWindow.tabId プロパティ。

コンテンツ スクリプトがすでに挿入されている場合は、メッセージング API を使用して 通信できます。

検査対象のウィンドウで JavaScript を評価する

inspectedWindow.eval() メソッドを使用して JavaScript を実行できます。 インスペクションされるページのコンテキストで コードを配置しますeval() メソッドは、DevTools ページから呼び出すことができます。 またはサイドバーペインに 移動することもできます

デフォルトでは、式はページのメインフレームのコンテキストで評価されます。 inspectedWindow.eval() は、コードと同じスクリプト実行コンテキストとオプションを使用します。 DevTools コンソールで入力した名前。これにより、DevTools の [Console Utilities] にアクセスできます。 API 機能(eval() を使用する場合)たとえば、SOAK はこれを使用して要素を検査します。

chrome.devtools.inspectedWindow.eval(
  "inspect($$('head script[data-soak=main]')[0])",
  function(result, isException) { }
);

また、inspectedWindow.eval() を呼び出して useContentScriptContexttrue に設定して、 コンテンツ スクリプトと同じコンテキストで式を評価します。このオプションを使用するには、eval() を呼び出す前に静的コンテンツ スクリプトの宣言を使用します。そのためには、executeScript() を呼び出すか、コンテンツを指定します。 manifest.json ファイルに記述します。コンテキスト スクリプトのコンテキストが読み込まれた後に、このオプションを使用して 追加のコンテンツ スクリプトを挿入できます。

選択した要素をコンテンツ スクリプトに渡す

コンテンツ スクリプトは、現在選択されている要素に直接アクセスできません。ただし、 DevTools へのアクセス権がある inspectedWindow.eval() を使用して実行すること Console Utilities API を使用します。たとえば、評価されたコードでは、$0 を使用して以下にアクセスできます。 選択します。

選択した要素をコンテンツ スクリプトに渡すには:

  1. 選択した要素を引数として受け取るメソッドをコンテンツ スクリプトに作成します。

    function setSelectedElement(el) {
        // do something with the selected element
    }
    
  2. inspectedWindow.eval() を使用して、DevTools ページからメソッドを呼び出す useContentScriptContext: true オプションで指定します。

    chrome.devtools.inspectedWindow.eval("setSelectedElement($0)",
        { useContentScriptContext: true });
    

useContentScriptContext: true オプションは、式を評価する必要があることを指定します。 コンテンツ スクリプトと同じコンテキストなので、setSelectedElement メソッドにアクセスできます。

参照パネルの window を取得する

devtools パネルから postMessage() を呼び出すには、その window オブジェクトへの参照が必要です。手に入れよう: パネルの iframe ウィンドウを panel.onShown イベント ハンドラから呼び出す必要があります。

extensionPanel.onShown.addListener(function (extPanelWindow) {
    extPanelWindow instanceof Window; // true
    extPanelWindow.postMessage( // …
});

挿入されたスクリプトから DevTools ページにメッセージを送信する

<script> の追加などにより、コンテンツ スクリプトなしでページに直接挿入されるコード inspectedWindow.eval() の呼び出しにより、 runtime.sendMessage() を使用した DevTools ページ。代わりに 挿入されたスクリプトを、仲介役として機能できるコンテンツ スクリプトと組み合わせ、 window.postMessage() メソッド次の例では、バックグラウンド スクリプトを使用します。 確認します。

// injected-script.js

window.postMessage({
  greeting: 'hello there!',
  source: 'my-devtools-extension'
}, '*');
// content-script.js

window.addEventListener('message', function(event) {
  // Only accept messages from the same frame
  if (event.source !== window) {
    return;
  }

  var message = event.data;

  // Only accept messages that we know are ours. Note that this is not foolproof
  // and the page can easily spoof messages if it wants to.
  if (typeof message !== 'object' || message === null ||
      message.source !== 'my-devtools-extension') {
    return;
  }

  chrome.runtime.sendMessage(message);
});

その他のメッセージを渡す方法については、GitHub をご覧ください。

DevTools の開閉を検出する

DevTools ウィンドウが開いているかどうかを追跡するには、onConnect リスナーを追加します。 Service Worker に接続し、DevTools ページから connect() を呼び出します。なぜなら、 各タブで独自の DevTools ウィンドウを開き、複数の接続イベントを受け取る場合があります。 DevTools ウィンドウが開いているかどうかを追跡するには、以下に示すように接続イベントと切断イベントをカウントします。 使用します。

// background.js
var openCount = 0;
chrome.runtime.onConnect.addListener(function (port) {
    if (port.name == "devtools-page") {
      if (openCount == 0) {
        alert("DevTools window opening.");
      }
      openCount++;

      port.onDisconnect.addListener(function(port) {
          openCount--;
          if (openCount == 0) {
            alert("Last DevTools window closing.");
          }
      });
    }
});

DevTools のページでは、次のような接続が作成されます。

// devtools.js

// Create a connection to the service worker
const serviceWorkerConnection = chrome.runtime.connect({
    name: "devtools-page"
});

// Send a periodic heartbeat to keep the port open.
setInterval(() => {
  port.postMessage("heartbeat");
}, 15000);

DevTools 拡張機能の例

このページの例は、次のページから抜粋したものです。

  • Polymer Devtools 拡張機能 - ホストページで実行されている多くのヘルパーを使用してクエリを実行します。 カスタムパネルに返送する DOM/JS 状態。
  • React DevTools 拡張機能 - レンダラのサブモジュールを使用して DevTools UI を再利用します。 説明します。
  • Ember Inspector - Chrome と Firefox の両方に対応したアダプターを備えた共有拡張機能コアです。
  • Coquette-inspect - デバッグ エージェントが挿入された、クリーンな React ベースの拡張機能 ホストページにユーザーを誘導します。
  • 拡張機能のサンプル: インストールして試す価値のある拡張機能が揃っています 選択します。

詳細

拡張機能で使用できる標準 API については、chrome.*APIウェブ API

フィードバックをお寄せくださいお寄せいただいたご意見やご提案は、API の改善に活用させていただきます。

DevTools API を使用する例については、サンプルをご覧ください。