Microsoft Edge DevTools にカスタム ツールを追加する

この記事では、Custom DevTools サンプルのコードについて説明します。 最初にサンプルをインストールして実行するには、「 サンプル: カスタム DevTools ツール」を参照してください。

概要

通常の拡張機能と同様に、DevTools 拡張機能にはマニフェスト ファイルがあります。 これは、「 拡張機能の開発を開始する」で説明されています。ここでは、最初に使用できる基本的な拡張機能サンプルを示します。

DevTools を拡張する拡張機能には、次のものが含まれます。

  • DevTools のツールのパネルに表示されるレンダリングされた HTML ファイル。
  • DevTools が開かれたときに実行され、通常はカスタム DevTools ツールと検査対象の Web ページ間の通信を処理するレンダリングされていない HTML ファイル。

この DevTools 拡張機能サンプルは、DevTools と検査された Web ページの間で通信し、DevTools API を呼び出します。

DevTools 拡張機能のサンプルでは、DevTools にカスタム ツールが表示されます。これには、アクティビティ バーの [カスタム] タブと、タブに接続されているパネルが含まれます。

カスタム タブ

パネルは、Microsoft Edge DevTools のツール ページと、アクティビティ バーのツールのタブです。

関連項目:

ファイルの概要

DevTools 拡張機能のサンプルには、次のファイルがあります。

ファイル 説明
manifest.json 拡張機能に関する情報: DevTools に表示する名前、説明、バージョン、マニフェスト バージョン、HTML ページ。
panel.html DevTools のカスタム パネルに表示する Web ページ。
devtools.html DevTools を開いたときに実行され、拡張機能の JavaScript ファイルを読み込む、レンダリングされていない HTML ファイル。
devtools.js カスタム DevTools ページのメイン ロジック。
content_script.js 検査された Web ページに拡張機能が挿入するコード。 マウス クリック位置でメッセージを送信するクリック イベント リスナーをページに追加します。 devtools.js は、このメッセージをリッスンし、カスタム パネルの位置を表示します。
icon.png DevTools のアクティビティ バーのツールのタブと [ その他のツール ] メニューに表示するアイコン。
README.md サンプルの使用方法に関する開発者向けの基本情報。

詳細は以下のとおりです。

Web ページと DevTools 間の対話

検査された Web ページと DevTools 間の対話を有効にするには、複数のファイルが必要です。 これらのファイルは、さまざまなコンテキストで実行されます。

  • devtools.js は、DevTools のカスタム ツール パネルのコンテキストで実行されます。

  • content_script.jsコンテンツ スクリプトです。これは、検査された Web ページのコンテキストで実行されることを意味します。 Web ページによって他のスクリプトが読み込まれるのと同じ方法で、コンテンツ スクリプトは DOM にアクセスでき、変更できます。

DevTools ページ、検査済みページ、およびコンテンツ スクリプトは、拡張機能にまとめられます。

DevTools 拡張機能の構造を示す図

content_script.jsは、検査された Web ページでユーザーがクリックした場所を検出します。

document.addEventListener("click", event => {
  chrome.runtime.sendMessage({
    click: true,
    xPosition: event.clientX + document.body.scrollLeft,
    yPosition: event.clientY + document.body.scrollTop
  });
});

コンテンツ スクリプトは、この情報を devtools.js ファイルに中継します。ここで、データは カスタム ツールと コンソール ツールの DevTools に表示されます。

コンテンツ スクリプトを使用して、ユーザーが Web ページをクリックした場合を検出します。 コンテンツ スクリプトは、この情報を devtools.js ファイルに中継します。ここで、データは DevTools コンソール と、Microsoft Edge 拡張機能である DevTools Custom ツールの両方に表示されます。

カスタム DevTools ツールのコード

Custom DevTools サンプルは、次のファイルとコードで構成されます。 検査された Web ページと対話するコードは、次の処理を行います。

  • カスタム DevTools ツールでメモリ情報を表示します。

  • Web ページがクリックされたときに、 カスタム DevTools ツールのマウス クリック位置を表示します。

  • カスタム DevTools ツールで [Hello と言う] ボタンがクリックされたときに、検査された Web ページに案内応答アラートを表示します。

manifest.json

拡張機能に関する情報: DevTools に表示する名前、説明、バージョン、マニフェスト バージョン、HTML ページ。

マニフェスト ファイルには、キーと値のペアが含まれています。 最上位のキーは メンバーと呼ばれます。

このファイルは、拡張機能に必要です。 マニフェストには、拡張機能に関する次の情報が含まれています。

メンバー 説明
name edge://extensions/の下に表示される拡張機能の名前。
description 拡張機能の名前の下に表示される拡張機能の説明。
version 拡張機能の名前の横に表示される拡張機能のバージョン。
manifest_version ネットワーク要求の変更など、拡張機能が使用する機能のセットを決定します。 現在のバージョンはバージョン 3です。 このバージョンとバージョン 2との違いの詳細については、「 Manifest V3 に移行するための概要とタイムライン」を参照してください。
devtools_page DevTools が開かれるたびに実行され、拡張機能の JavaScript ファイルが読み込まれる HTML ファイルへのパス。 このページは DevTools ではレンダリングされません。
content_scripts ユーザーが指定した Web ページを開くときに使用する JavaScript または CSS ファイル。 Chrome ドキュメント のコンテンツ スクリプトに関する ページを参照してください。
permissions スクリプトはそのための API を呼び出すので、ローカル デバイスにはシステム メモリ容量を表示するためのアクセス許可が必要です。

manifest.json:

{
    "name": "Custom DevTools Tool",
    "description": "A DevTools extension interacting with the inspected page",
    "manifest_version": 3,
    "version": "1.0",
    "devtools_page": "devtools.html",
    "content_scripts": [{
        "matches": [
            "http://*/*",
            "https://*/*"
        ],
        "run_at": "document_idle",
        "js": [
            "content_script.js"
        ]
    }],
    "permissions": [
        "system.memory"
    ]
}

manifest.jsonpermissions マニフェスト メンバーは、拡張機能がユーザーに必要とするアクセス許可を定義します。 特定の拡張機能 API を使用するには、一部のアクセス許可が必要です。 拡張機能 API を使用するには、 system-memory アクセス許可が必要です。 特定の API には、アクセス許可が関連付けられています。

content_scripts メンバー内のキー:

キー
matches このコンテンツ スクリプトを挿入するページを指定します。
run_at ブラウザーがスクリプトをページに挿入するタイミングを示します。
js 挿入する javascript ファイル。

関連項目:

panel.html

DevTools のカスタム パネルに表示する Web ページ。

このファイルは必須です。 これは、DevTools のカスタム パネルに表示する Web ページです。

panel.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <h2>Custom DevTools tool</h2>

    <h3>Memory</h3>
    <div>
      <b>Available Memory Capacity:</b> <span id="availableMemoryCapacity"></span>
    </div>
    <div>
      <b>Total Memory Capacity:</b> <span id="totalMemoryCapacity"></span>
    </div>

    <h3>Send message from DevTools to inspected page</h3>
    <input type="button" id="sayHello" value="Say hello to the inspected page">
    <h3>Send message from inspected page to DevTools</h3>
    <p>Click somewhere in the inspected webpage.</p>
    <div>
      <b>Coordinates:</b> <span id="youClickedOn"></span>
    </div>

  </body>
</html>

panel.htmlは、devtools.jschrome.devtools.panels.create メソッド呼び出しで参照されます。 panel.html Web ページには、カスタム ツールのパネルのユーザー インターフェイスが含まれています。

上記の要素は、検査されたページと DevTools パネルの間の相互作用を示しています。

ユーザーが DevTools 拡張機能の [ sayHello ] ボタンをクリックすると、検査されたウィンドウにアラートが表示されます。

ユーザーが検査されたページ内の任意の場所をクリックすると、マウス クリック座標が DevTools カスタム ツールに表示されます。

関連項目:

  • panel.html - リポジトリ内のソース ファイル。

devtools.html

DevTools を開いたときに実行されるレンダリングされていない HTML ファイル。 このファイルは必須です。

devtools.htmlファイル名は、マニフェスト ファイル内のdevtools_page メンバーの値と一致する必要があります。

devtools.htmlには、devtools.jsを読み込む<script>要素が含まれています。

devtools.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script src="devtools.js"></script>
  </body>
</html>

関連項目:

devtools.js

devtools.js には、カスタム DevTools ページのメイン ロジックが含まれています。 devtools.js では、次の処理が実行されます。

  1. chrome.devtools.panels.create()を使用して、DevTools に新しいカスタム ツール タブとパネルを作成します。

  2. ツールが表示されると (リスナーpanel.onShown )、 availableMemoryCapacity 要素と totalMemoryCapacity 要素が DOM から取得されます。

  3. パネルが表示された後、1 秒ごとにコードを実行するタイマーを設定します。

  4. タイマーが起動すると、 chrome.system.memory.getInfo メソッドを使用してデバイスの使用可能なメモリ容量と合計メモリ容量を取得し、これらの値が対応する DOM 要素に表示されます。

devtools.js:

let availableMemoryCapacity;
let totalMemoryCapacity;
let youClickedOn;

chrome.devtools.panels.create("Custom", "icon.png", "panel.html", panel => {
    // Code invoked on panel creation.
    panel.onShown.addListener( (extPanelWindow) => {
        // Memory API.
        availableMemoryCapacity = extPanelWindow.document.querySelector('#availableMemoryCapacity');
        totalMemoryCapacity = extPanelWindow.document.querySelector('#totalMemoryCapacity');
        // 2-way message sending.
        let sayHello = extPanelWindow.document.querySelector('#sayHello');
        youClickedOn = extPanelWindow.document.querySelector('#youClickedOn');
        sayHello.addEventListener("click", () => {
            // show a greeting alert in the inspected page
            chrome.devtools.inspectedWindow.eval('alert("Hello from the DevTools extension!");');
        });
    });
});

// Update the Memory display.
setInterval(() => {
    chrome.system.memory.getInfo((data) => {
        if (availableMemoryCapacity) {
            availableMemoryCapacity.innerHTML = data.availableCapacity;
        }
        if (totalMemoryCapacity) {
            totalMemoryCapacity.innerHTML = data.capacity;
        }
    });
}, 1000);

// Send a message from the inspected page to DevTools.
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    // Messages from content scripts should have sender.tab set.
    if (sender.tab && request.click == true) {
        console.log('I am here!');
        if (youClickedOn) {
            youClickedOn.innerHTML = `(${request.xPosition}, ${request.yPosition})`;
        }
        sendResponse({
            xPosition: request.xPosition,
            yPosition: request.yPosition
        });
    }
});

devtools.jscreate メソッド呼び出し:

chrome.devtools.panels.create("Custom", "icon.png", "panel.html", panel => {
    // code invoked on panel creation
});

create メソッドには、次のシグネチャがあります。

chrome.devtools.panels.create(
    title: string, // Tool tab's label in Activity bar.
    iconPath: string, // Icon to display in tool's tab.
    pagePath: string, // Webpage to display in tool's panel.
    callback: function // Code to run when tool is opened.
)

検査された Web ページと通信するには、devtools.jssayHello ボタンにイベント リスナーを追加し、panel.html ファイルで定義されているラベルをyouClickedOnします。

ユーザーが [sayHello] ボタンをクリックすると、devtools.jschrome.devtools.inspectedWindow.eval() メソッドを使用して、検査されたウィンドウでコードを直接実行します。

ユーザーが検査されたウィンドウ内の任意の場所をクリックすると、DevTools 拡張機能は、 request.click == true とマウスの位置情報を含むメッセージを受け取ります。

関連項目:

content_script.js

検査された Web ページにカスタム DevTools ツールが挿入するコード。 検査された Web ページ (任意の Web ページ) に挿入される JavaScript が含まれます。

このファイルは次の処理を行います。

  • chrome.runtime.sendMessageを呼び出して、マウス クリック位置を含むメッセージを送信する、検査された Web ページにクリック イベント リスナーを追加します。
  • イベント リスナーを介してページ クリック イベントをリッスンします。

コンテンツ スクリプトは、マウス クリック座標を devtools.js ファイルに中継します。ここで、座標は 、コンソール ツールと DevTools の カスタム ツールの両方に表示されます。

コンテンツ スクリプトは、検査された Web ページのコンテキストで実行されます。 Web ページによって他のスクリプトが読み込まれるのと同じ方法で、コンテンツ スクリプトは DOM にアクセスでき、変更できます。

content_script.js:

document.addEventListener("click", (event) => {
  chrome.runtime.sendMessage({
      click: true,
      xPosition: event.clientX + document.body.scrollLeft,
      yPosition: event.clientY + document.body.scrollTop
    },
    response => {
      console.log("Received response", response);
    }
  );
});

関連項目:

icon.png

DevTools のアクティビティ バーのツールのタブと [ その他のツール ] メニューに表示するアイコン。

icon.png は、DevTools の アクティビティ バー と [ その他のツール ] メニューのツールのタブに表示するアイコンです。

アイコン ファイル

関連項目:

  • icon.png - リポジトリ内のソース ファイル。

関連項目

Chrome 拡張機能のドキュメント:

リポジトリ内のソース ファイル: