tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit aa8403be4bbd78a9da654f88dfd8e3fb477afc6f
parent f332ba95d3b0e36ea8ed118c22aae713be785c8d
Author: Thomas Wisniewski <twisniewski@mozilla.com>
Date:   Tue,  2 Dec 2025 03:17:58 +0000

Bug 2003282 - change the buttons on the Report Broken Site preview panel's footer to cancel and send; r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D274603

Diffstat:
Mbrowser/components/reportbrokensite/ReportBrokenSite.sys.mjs | 61+++++++++++++++++++++++++++++++++++--------------------------
Mbrowser/components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml | 10+++++++---
Mbrowser/components/reportbrokensite/test/browser/browser_report_preview.js | 21---------------------
Mbrowser/components/reportbrokensite/test/browser/head.js | 12++++++------
Mbrowser/locales/en-US/browser/reportBrokenSite.ftl | 1-
5 files changed, 48 insertions(+), 57 deletions(-)

diff --git a/browser/components/reportbrokensite/ReportBrokenSite.sys.mjs b/browser/components/reportbrokensite/ReportBrokenSite.sys.mjs @@ -301,9 +301,15 @@ export class ViewState { ); } - get copyButton() { + get previewCancelButton() { return this.#previewView.querySelector( - "#report-broken-site-popup-preview-copy-button" + "#report-broken-site-popup-preview-cancel-button" + ); + } + + get previewSendButton() { + return this.#previewView.querySelector( + "#report-broken-site-popup-preview-send-button" ); } @@ -629,33 +635,36 @@ export var ReportBrokenSite = new (class ReportBrokenSite { } #initPreviewView(state) { - state.copyButton.addEventListener("click", event => { - event.preventDefault(); - const { cachedPreviewData } = state; - if (!cachedPreviewData) { - console.error("Report Broken Site: No cached preview data to copy?"); - return; + state.previewSendButton.addEventListener("command", event => { + // If the user has not entered a reason yet, then the form's validity + // check will bring up the reason dropdown, despite it being out of view + // (since we're looking at the preview panel, not the main one). This is + // confusing, so we instead go back to the main view first if there is a + // validity check failure (we also have to be careful to avoid possibly + // racing with the user if they close the popup during this sequence, so + // we don't leak any event listeners and world with them). + if (!state.form.checkValidity()) { + const view = event.target.closest("panelview").panelMultiView; + const { document } = event.target.ownerGlobal; + const listener = event => { + document.removeEventListener("popuphiding", listener); + view.removeEventListener("ViewShown", listener); + if (event.type == "ViewShown") { + state.form.requestSubmit(); + } + }; + document.addEventListener("popuphiding", listener); + view.addEventListener("ViewShown", listener); + view.goBack(); + } else { + state.form.requestSubmit(); } - this.#setClipboardToString(JSON.stringify(cachedPreviewData)); }); - } - #setClipboardToString(string) { - let str = Cc["@mozilla.org/supports-string;1"].createInstance( - Ci.nsISupportsString - ); - str.data = string; - const xferable = Cc["@mozilla.org/widget/transferable;1"].createInstance( - Ci.nsITransferable - ); - xferable.init(null); - xferable.addDataFlavor("text/plain"); - xferable.setTransferData("text/plain", str); - Services.clipboard.setData( - xferable, - null, - Ci.nsIClipboard.kGlobalClipboard - ); + state.previewCancelButton.addEventListener("command", ({ target }) => { + target.ownerGlobal.CustomizableUI.hidePanelForNode(target); + state.reset(); + }); } #initReportSentView(state) { diff --git a/browser/components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml b/browser/components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml @@ -130,9 +130,13 @@ <vbox id="report-broken-site-panel-preview-items"/> </vbox> <html:moz-button-group class="panel-footer"> - <html:moz-button id="report-broken-site-popup-preview-copy-button" - type="primary" - data-l10n-id="report-broken-site-panel-button-copy"/> + <button id="report-broken-site-popup-preview-cancel-button" + class="footer-button" + data-l10n-id="report-broken-site-panel-button-cancel"/> + <button id="report-broken-site-popup-preview-send-button" + class="footer-button" + default="true" + data-l10n-id="report-broken-site-panel-button-send"/> </html:moz-button-group> </panelview> diff --git a/browser/components/reportbrokensite/test/browser/browser_report_preview.js b/browser/components/reportbrokensite/test/browser/browser_report_preview.js @@ -78,8 +78,6 @@ async function checkPreviewPanel(rbs, basic) { }) ); } - target = await pressKeyAndGetFocus("VK_TAB"); - is(target, rbs.previewCopyButton, "Final focus is on copy button"); function adjustForWrapping(value) { // match what we do to strings when generating the preview markup. @@ -110,25 +108,6 @@ async function checkPreviewPanel(rbs, basic) { areObjectsEqual(previewData, expectedPreviewData), "Preview had the expected information" ); - - setClipboard("did not copy"); - rbs.clickPreviewCopy(); - const copied = JSON.parse(getClipboardAsString()); - - // we don't adjust the copied text for wrapping like we do the markup. - const expectedCopyData = { basic }; - for (const [category, values] of Object.entries(rawReportData)) { - expectedCopyData[category] = Object.fromEntries( - Object.entries(values) - .filter(([_, { do_not_preview }]) => !do_not_preview) - .map(([name, { value }]) => [name, value]) - ); - } - - ok( - areObjectsEqual(copied, expectedCopyData), - "Copied the expected information" - ); } add_task(async function testPreview() { diff --git a/browser/components/reportbrokensite/test/browser/head.js b/browser/components/reportbrokensite/test/browser/head.js @@ -365,10 +365,6 @@ class ReportBrokenSiteHelper { await this.#assertClickAndViewChanges(this.okayButton, this.sentView); } - async clickPreviewCopy() { - EventUtils.synthesizeMouseAtCenter(this.previewCopyButton, {}, this.win); - } - async clickPreview() { await this.#assertClickAndViewChanges( this.previewButton, @@ -478,8 +474,12 @@ class ReportBrokenSiteHelper { return this.getViewNode("report-broken-site-popup-preview-button"); } - get previewCopyButton() { - return this.getViewNode("report-broken-site-popup-preview-copy-button"); + get previewCancelButton() { + return this.getViewNode("report-broken-site-popup-preview-cancel-button"); + } + + get previewSendButton() { + return this.getViewNode("report-broken-site-popup-preview-send-button"); } get previewItems() { diff --git a/browser/locales/en-US/browser/reportBrokenSite.ftl b/browser/locales/en-US/browser/reportBrokenSite.ftl @@ -70,4 +70,3 @@ report-broken-site-panel-preview-button = .label = Preview report report-broken-site-panel-preview-header = .label = Preview report -report-broken-site-panel-button-copy = Copy