tor-browser

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

commit 77d076e38a89e197a0393a88c18cfd581d90d725
parent 5f26a17f96a7adec6c43a7f734ca7e9afefdefab
Author: agoloman <agoloman@mozilla.com>
Date:   Tue,  2 Dec 2025 03:52:59 +0200

Revert "Bug 2003282 - change the buttons on the Report Broken Site preview panel's footer to cancel and send; r=Gijs" for causing bc failures @browser_report_preview.js.

This reverts commit 75d83b3a960ad02c4fb47e5d54a5210b1aab2bb3.

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, 56 insertions(+), 49 deletions(-)

diff --git a/browser/components/reportbrokensite/ReportBrokenSite.sys.mjs b/browser/components/reportbrokensite/ReportBrokenSite.sys.mjs @@ -301,15 +301,9 @@ export class ViewState { ); } - get previewCancelButton() { + get copyButton() { return this.#previewView.querySelector( - "#report-broken-site-popup-preview-cancel-button" - ); - } - - get previewSendButton() { - return this.#previewView.querySelector( - "#report-broken-site-popup-preview-send-button" + "#report-broken-site-popup-preview-copy-button" ); } @@ -635,36 +629,33 @@ export var ReportBrokenSite = new (class ReportBrokenSite { } #initPreviewView(state) { - 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(); + state.copyButton.addEventListener("click", event => { + event.preventDefault(); + const { cachedPreviewData } = state; + if (!cachedPreviewData) { + console.error("Report Broken Site: No cached preview data to copy?"); + return; } + this.#setClipboardToString(JSON.stringify(cachedPreviewData)); }); + } - state.previewCancelButton.addEventListener("command", ({ target }) => { - target.ownerGlobal.CustomizableUI.hidePanelForNode(target); - state.reset(); - }); + #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 + ); } #initReportSentView(state) { diff --git a/browser/components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml b/browser/components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml @@ -130,13 +130,9 @@ <vbox id="report-broken-site-panel-preview-items"/> </vbox> <html:moz-button-group class="panel-footer"> - <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 id="report-broken-site-popup-preview-copy-button" + type="primary" + data-l10n-id="report-broken-site-panel-button-copy"/> </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 @@ -79,7 +79,7 @@ async function checkPreviewPanel(rbs, basic) { ); } target = await pressKeyAndGetFocus("VK_TAB"); - is(target, rbs.previewCancelButton, "Focus is on cancel button"); + 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,6 +110,25 @@ 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,6 +365,10 @@ class ReportBrokenSiteHelper { await this.#assertClickAndViewChanges(this.okayButton, this.sentView); } + async clickPreviewCopy() { + EventUtils.synthesizeMouseAtCenter(this.previewCopyButton, {}, this.win); + } + async clickPreview() { await this.#assertClickAndViewChanges( this.previewButton, @@ -474,12 +478,8 @@ class ReportBrokenSiteHelper { return this.getViewNode("report-broken-site-popup-preview-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 previewCopyButton() { + return this.getViewNode("report-broken-site-popup-preview-copy-button"); } get previewItems() { diff --git a/browser/locales/en-US/browser/reportBrokenSite.ftl b/browser/locales/en-US/browser/reportBrokenSite.ftl @@ -70,3 +70,4 @@ 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