Skip to content
This repository was archived by the owner on Jul 23, 2024. It is now read-only.

Commit 2e115c8

Browse files
committed
Make the nodes which caused the issue searchable
1 parent 1299ab9 commit 2e115c8

7 files changed

Lines changed: 141 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"use strict";
2+
3+
// We can not call any experimental APIs in devtools page context.
4+
// https://searchfox.org/mozilla-central/source/toolkit/components/extensions/docs/basics.rst#155-156
5+
// Thus, introduce api-server / api-client that provides pseudo api to make experimental
6+
// api accessible even in devtools page context.
7+
//
8+
// This script should run on devtools page context.
9+
10+
(async function install() {
11+
if (browser.experiments && browser.experiments.highlighter) {
12+
return;
13+
}
14+
15+
if (!browser.experiments) {
16+
browser.experiments = {};
17+
}
18+
19+
const port = browser.runtime.connect();
20+
21+
browser.experiments.highlighter = {
22+
async highlight(selector) {
23+
this._invoke("highlight", selector);
24+
},
25+
26+
async _invoke(method, parameter) {
27+
return new Promise(resolve => {
28+
const timestamp = Date.now();
29+
30+
const listener = response => {
31+
if (method === response.method && timestamp === response.timestamp) {
32+
port.onMessage.removeListener(listener);
33+
resolve(response.result);
34+
}
35+
};
36+
37+
port.onMessage.addListener(listener);
38+
port.postMessage({
39+
namespace: "browser.experiments.highlighter",
40+
method,
41+
parameter,
42+
timestamp,
43+
});
44+
});
45+
}
46+
};
47+
})();
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
3+
// We can not call any experimental APIs in devtools page context.
4+
// https://searchfox.org/mozilla-central/source/toolkit/components/extensions/docs/basics.rst#155-156
5+
// Thus, introduce api-server / api-client that provides pseudo api to make experimental
6+
// api accessible even in devtools page context.
7+
//
8+
// This script should run on addon parent context (as background).
9+
10+
browser.runtime.onConnect.addListener(port => {
11+
const onMessage = async ({ namespace, method, parameter, timestamp }) => {
12+
if (namespace !== "browser.experiments.highlighter") {
13+
return;
14+
}
15+
16+
const result = await browser.experiments.highlighter[method](parameter);
17+
port.postMessage({ method, timestamp, result });
18+
};
19+
port.onMessage.addListener(onMessage);
20+
21+
const onDisconnect = () => {
22+
browser.experiments.inspectedNode.onChange.removeListener(onChange);
23+
port.onDisconnect.removeListener(onDisconnect);
24+
port.onMessage.removeListener(onMessage);
25+
};
26+
port.onDisconnect.addListener(onDisconnect);
27+
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"use strict";
2+
3+
this.highlighter = class extends ExtensionAPI {
4+
getAPI(context) {
5+
const { Services } = Cu.import("resource://gre/modules/Services.jsm");
6+
const { require } = Cu.import("resource://devtools/shared/Loader.jsm");
7+
const { gDevTools } = require("devtools/client/framework/devtools");
8+
9+
async function _highlight(selector) {
10+
const navigator = Services.wm.getMostRecentWindow("navigator:browser");
11+
const tab = navigator.gBrowser.selectedTab;
12+
const target = await gDevTools.getTargetForTab(tab);
13+
const toolbox = gDevTools.getToolbox(target);
14+
const inspector = toolbox.getPanel("inspector");
15+
inspector.searchBox.value = selector;
16+
inspector.search.doFullTextSearch(selector, false);
17+
}
18+
19+
return {
20+
experiments: {
21+
highlighter: {
22+
async highlight(selector) {
23+
await _highlight(selector);
24+
}
25+
},
26+
},
27+
};
28+
}
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[
2+
{
3+
"namespace": "experiments.highlighter",
4+
"functions": [
5+
{
6+
"name": "highlight",
7+
"type": "function",
8+
"parameters": [
9+
{
10+
"type": "string",
11+
"name": "selector"
12+
}
13+
],
14+
"async": true
15+
}
16+
]
17+
}
18+
]

extension/manifest.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,21 @@
1313
],
1414
"background": {
1515
"scripts": [
16+
"experiments/highlighter/api-server.js",
1617
"experiments/inspectedNode/api-server.js",
1718
"proxy/tabs/api-server.js"
1819
]
1920
},
2021
"devtools_page": "devtools.html",
2122
"experiment_apis": {
23+
"highlighter": {
24+
"schema": "experiments/highlighter/schema.json",
25+
"parent": {
26+
"scopes": ["addon_parent"],
27+
"script": "experiments/highlighter/api.js",
28+
"paths": [["experiments", "highlighter"]]
29+
}
30+
},
2231
"inspectedNode": {
2332
"schema": "experiments/inspectedNode/schema.json",
2433
"parent": {

extension/sidebar-pane.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
.occurrences li {
143143
font-family: monospace;
144144
font-size: 12px;
145+
cursor: pointer;
145146
}
146147

147148
.occurrences .node-name {
@@ -191,6 +192,7 @@
191192
to { transform: rotate(1turn); }
192193
}
193194
</style>
195+
<script src="experiments/highlighter/api-client.js"></script>
194196
<script src="experiments/inspectedNode/api-client.js"></script>
195197
<script src="proxy/tabs/api-client.js"></script>
196198
<script type="module" src="sidebar-pane.js"></script>

extension/sidebar-pane.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ function _renderOccurrences({ nodes }) {
184184
} else if (className.length) {
185185
nodeEl.append(_renderTerm(`.${ className.replace(/\s+/g, ".") }`, ["node-class"]));
186186
}
187+
188+
nodeEl.addEventListener("click", _onClickNodeSelector);
187189
nodelistEl.append(nodeEl);
188190
}
189191

@@ -375,6 +377,13 @@ function _onClickLink(e) {
375377
browser.tabs.create({ url: e.target.href });
376378
}
377379

380+
function _onClickNodeSelector(e) {
381+
e.stopPropagation();
382+
e.preventDefault();
383+
const selector = e.target.closest("li").textContent;
384+
browser.experiments.highlighter.highlight(selector);
385+
}
386+
378387
async function _updateCSSValueEnabled() {
379388
const isCSSValueEnabled = await _userSettings.isCSSValueEnabled();
380389
_webcompat.setCSSValueEnabled(isCSSValueEnabled);

0 commit comments

Comments
 (0)