Chrome Extension DevTools Extensions — Developer Guide

5 min read

Building DevTools Extensions

Introduction

manifest.json Setup

{
  "devtools_page": "devtools.html"
}

DevTools Page (devtools.html / devtools.js)

<!DOCTYPE html>
<html><body><script src="devtools.js"></script></body></html>
// devtools.js — runs once when DevTools opens for a tab
chrome.devtools.panels.create(
  "My Panel",           // Panel title in DevTools tab bar
  "icon.png",           // 16x16 icon
  "panel.html",         // Panel content page
  (panel) => {
    panel.onShown.addListener((window) => { /* panel visible */ });
    panel.onHidden.addListener(() => { /* panel hidden */ });
  }
);

chrome.devtools.panels API

create() — Custom Panels

elements.createSidebarPane() — Elements Sidebar

chrome.devtools.panels.elements.createSidebarPane("My Sidebar", (sidebar) => {
  sidebar.setPage("sidebar.html");
  // Or set content dynamically:
  sidebar.setObject({ key: "value" });
  sidebar.setExpression("document.querySelector('body').dataset");
});

themes

const theme = chrome.devtools.panels.themeName; // "default" or "dark"

chrome.devtools.inspectedWindow API

eval() — Execute in Inspected Page

chrome.devtools.inspectedWindow.eval(
  "document.querySelectorAll('img').length",
  (result, error) => {
    if (error) console.error(error);
    else console.log("Images on page:", result);
  }
);

getResources() — List Page Resources

chrome.devtools.inspectedWindow.getResources((resources) => {
  resources.forEach(r => console.log(r.url, r.type));
});

reload(options)

chrome.devtools.inspectedWindow.reload({
  injectedScript: "window.__DEVTOOLS_HOOK__ = true;"
});

tabId

const tabId = chrome.devtools.inspectedWindow.tabId;

chrome.devtools.network API

getHAR() — HTTP Archive

chrome.devtools.network.getHAR((harLog) => {
  harLog.entries.forEach(entry => {
    console.log(entry.request.url, entry.response.status, entry.time);
  });
});

onRequestFinished

chrome.devtools.network.onRequestFinished.addListener((request) => {
  request.getContent((body, encoding) => {
    console.log("Response body:", body);
  });
});

Communication Architecture

DevTools Page <-> Background Service Worker <-> Content Script <-> Inspected Page

Panel UI Best Practices

Common Patterns

Network Inspector Panel

Page State Inspector

Performance Monitor

Common Mistakes

Part of the Chrome Extension Guide by theluckystrike. Built at zovo.one.

No previous article
No next article