Skip to content

Commit a97fd22

Browse files
committed
Add a settings button that supports:
- Enabling/disabling scroll-to-element on hover - Enabling/disabling iframe download when downloading a webpage
1 parent 3232795 commit a97fd22

File tree

10 files changed

+398
-58
lines changed

10 files changed

+398
-58
lines changed

eslint.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export default [
4343
},
4444
},
4545
{
46-
files: ["extension/content/*.js"],
46+
files: ["extension/content/*.js", "extension/content/*.mjs"],
4747
languageOptions: {
4848
globals: {
4949
...globals.browser,

extension/background.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -395,11 +395,12 @@ class DownloadPageFeature {
395395
return html;
396396
}
397397

398-
static async freezePage(tabId, fieldDetails) {
398+
static async freezePage(tabId, fieldDetails, includeIframe = true) {
399399
let frames = await browser.webNavigation.getAllFrames({ tabId });
400400
const mainFrame = frames.find((frame) => frame.parentFrameId == -1);
401401
const iframes = frames.filter(
402402
(frame) =>
403+
includeIframe &&
403404
frame.parentFrameId == mainFrame.frameId &&
404405
!frame.url.startsWith("about:"),
405406
);
@@ -523,6 +524,7 @@ class GenerateTestFeature {
523524
let expectedField = {
524525
fieldName: fieldDetail.fieldName,
525526
reason: fieldDetail.reason,
527+
"data-moz-autofill-inspect-id": fieldDetail.inspectId,
526528
};
527529
if (fieldDetail.part) {
528530
expectedField.part = fieldDetail.part;
@@ -666,24 +668,32 @@ async function handleMessage(request) {
666668
}
667669
// Download the page markup
668670
case "download-page": {
669-
const { fieldDetails } = request;
671+
const { fieldDetails, includeIframe } = request;
670672
const host = await getHostNameByTabId(tabId);
671673

672-
const pages = await DownloadPageFeature.freezePage(tabId, fieldDetails);
674+
const pages = await DownloadPageFeature.freezePage(
675+
tabId,
676+
fieldDetails,
677+
includeIframe,
678+
);
673679
zipAndDownload(pages, host, "page");
674680
break;
675681
}
676682
// Generate a report with everything
677683
case "generate-report": {
678-
const { panelDataUrl, fieldDetails } = request;
684+
const { panelDataUrl, fieldDetails, includeIframe } = request;
679685
const host = await getHostNameByTabId(tabId);
680686

681687
const screenshot = await DownloadPageFeature.screenshot(tabId);
682688
const inspect = await DownloadPageFeature.exportInspect(
683689
tabId,
684690
panelDataUrl,
685691
);
686-
const pages = await DownloadPageFeature.freezePage(tabId, fieldDetails);
692+
const pages = await DownloadPageFeature.freezePage(
693+
tabId,
694+
fieldDetails,
695+
includeIframe,
696+
);
687697
pages.forEach((page) => (page.filename = `page/${page.filename}`));
688698

689699
const tests = await GenerateTestFeature.create(host, fieldDetails);

extension/content/autofill-inspector.js

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,14 @@ class AutofillInspector {
136136
#originFieldNameByInspectId = new Map();
137137
#hasEverEdited = false;
138138

139+
#settings = {
140+
// Setting to control whether we scroll the view to the hovered field.
141+
scrollHover: false,
142+
143+
// Setting to control whether we include iframe when downloading the web page.
144+
includeIframe: true,
145+
};
146+
139147
/**
140148
* Array contains the list of all inspected elements. This value
141149
* is set after calling `inspect` experiment API.
@@ -164,6 +172,17 @@ class AutofillInspector {
164172
["autofill-add-credit-card-button", () => this.onAddOrRemoveTestRecord()],
165173
];
166174

175+
#menuItemClickHandlers = [
176+
[
177+
"menuitem-scroll-hover",
178+
(event) => this.onSelectScrollWhenHover(event.target),
179+
],
180+
[
181+
"menuitem-download-iframe",
182+
(event) => this.onSelectIncludeIframeWhenDownload(event.target),
183+
],
184+
];
185+
167186
/**
168187
* Array of <th> configuration of the header of inspect result table.
169188
*/
@@ -189,16 +208,19 @@ class AutofillInspector {
189208

190209
init() {
191210
// Helper to attach event listeners
192-
const addEventListeners = (handlers, eventType) => {
211+
const addEventListeners = (root, handlers, eventType) => {
193212
for (const [id, handler] of handlers) {
194-
const element = document.getElementById(id);
195-
element.addEventListener(eventType, (event) => handler(event));
213+
const element = root.getElementById(id);
214+
element?.addEventListener(eventType, (event) => handler(event));
196215
}
197216
};
198217

199218
// Setup toolbar button and checkbox change handlers
200-
addEventListeners(this.#buttonClickHandlers, "click");
201-
addEventListeners(this.#checkboxChangeHandlers, "change");
219+
addEventListeners(document, this.#buttonClickHandlers, "click");
220+
addEventListeners(document, this.#checkboxChangeHandlers, "change");
221+
222+
const setting = document.getElementById("autofill-setting-button");
223+
addEventListeners(setting.shadowRoot, this.#menuItemClickHandlers, "click");
202224

203225
// Setup inspect result table
204226
const headerRow = document.getElementById("form-analysis-head-row");
@@ -213,6 +235,17 @@ class AutofillInspector {
213235
return th;
214236
}),
215237
);
238+
239+
this.initSettingMenuItems();
240+
}
241+
242+
initSettingMenuItems() {
243+
const setting = document.getElementById("autofill-setting-button");
244+
245+
let element = setting.shadowRoot.getElementById("menuitem-scroll-hover");
246+
this.onSelectScrollWhenHover(element, true);
247+
element = setting.shadowRoot.getElementById("menuitem-download-iframe");
248+
this.onSelectIncludeIframeWhenDownload(element, true);
216249
}
217250

218251
/**
@@ -299,7 +332,10 @@ class AutofillInspector {
299332
this.#updateProgress("downloading page");
300333
await this.waitForInspect();
301334

302-
sendMessage("download-page", { fieldDetails: this.#inspectedFieldDetails });
335+
sendMessage("download-page", {
336+
fieldDetails: this.#inspectedFieldDetails,
337+
includeIframe: this.#settings.includeIframe,
338+
});
303339
}
304340

305341
async onGenerateReport() {
@@ -310,6 +346,7 @@ class AutofillInspector {
310346
sendMessage("generate-report", {
311347
panelDataUrl,
312348
fieldDetails: this.#inspectedFieldDetails,
349+
includeIframe: this.#settings.includeIframe,
313350
});
314351
}
315352

@@ -366,6 +403,28 @@ class AutofillInspector {
366403
event.target.classList.toggle("editing");
367404
}
368405

406+
onSelectScrollWhenHover(target, init = false) {
407+
if (!init) {
408+
this.#settings.scrollHover = !this.#settings.scrollHover;
409+
}
410+
if (this.#settings.scrollHover) {
411+
target.classList.add("menuitem-selected");
412+
} else {
413+
target.classList.remove("menuitem-selected");
414+
}
415+
}
416+
417+
onSelectIncludeIframeWhenDownload(target, init = false) {
418+
if (!init) {
419+
this.#settings.includeIframe = !this.#settings.includeIframe;
420+
}
421+
if (this.#settings.includeIframe) {
422+
target.classList.add("menuitem-selected");
423+
} else {
424+
target.classList.remove("menuitem-selected");
425+
}
426+
}
427+
369428
onFilterFields() {
370429
this.#updateFieldsInfo(this.#inspectedFieldDetails);
371430
}
@@ -415,7 +474,9 @@ class AutofillInspector {
415474
}
416475

417476
#scrollIntoView(fieldDetail) {
418-
sendMessage("scroll-to", { fieldDetail });
477+
if (this.#settings.scrollHover) {
478+
sendMessage("scroll-to", { fieldDetail });
479+
}
419480
}
420481

421482
#addHighlightOverlay(type, fieldDetails) {

extension/content/devtools-panel.html

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<link rel="stylesheet" type="text/css" href="style/autofill.css">
88
<script src="autofill-inspector.js"></script>
99
<script src="libs/html2canvas.min.js"></script>
10+
<script type="module" src="menu-button.mjs"></script>
1011
</head>
1112
<body class="theme-body">
1213
<div class="autofill-panel">
@@ -42,6 +43,8 @@
4243
<input id="autofill-add-credit-card-button" type="checkbox" class="devtools-checkbox"/>
4344
Show Test Credit Card
4445
</label>
46+
<span class="devtools-separator"></span>
47+
<menu-button id="autofill-setting-button" title="Setting" class="devtools-button autofill-setting-button"></menu-button>
4548
</div>
4649
<div class="field-list-container">
4750
<div class="field-list-scroll">
@@ -60,21 +63,13 @@
6063
</div>
6164
</div>
6265

63-
<template id="menu-template">
64-
<div class="tooltip-container tooltip-bottom" type="doorhanger">
65-
<div class="tooltip-panel">
66-
<div role="menu" class="checkbox-container menu-standard-padding" id="menu-item-list"></div>
67-
</div>
68-
<div class="tooltip-arrow"></div>
69-
</div>
70-
</template>
71-
72-
<template id="menu-item-template">
73-
<li class="menuitem" role="presentation">
74-
<button class="command menu-item" role="menuitem">
75-
<span class="label"></span>
76-
</button>
77-
</li>
66+
<template id="menu-button-template">
67+
<link rel="stylesheet" type="text/css" href="style/menu-button.css">
68+
<ul class="menu" role="menu" hidden>
69+
<button id="menuitem-scroll-hover" role="menuitem" class="menuitem-button ghost-button">Scroll When Hover</button>
70+
<hr role="separator" class="menuitem-separator">
71+
<button id="menuitem-download-iframe" role="menuitem" class="menuitem-button ghost-button">Download Iframe</button>
72+
</ul>
7873
</template>
7974
</body>
8075
</html>

extension/content/icons/check.svg

Lines changed: 6 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)