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.