Loading browser/app/profile/001-base-profile.js +2 −0 Original line number Diff line number Diff line Loading @@ -519,6 +519,8 @@ pref("privacy.resistFingerprinting.letterboxing.vcenter", true); pref("privacy.resistFingerprinting.letterboxing.gradient", true); // tor-browser#41918: Should we reuse last window sizes if letterboxing is enabled pref("privacy.resistFingerprinting.letterboxing.rememberSize", false); // tor-browser#41695: How many warnings we show if user closes them without restoring the window size pref("privacy.resistFingerprinting.resizeWarnings", 3); // tor-browser#43402: Avoid a resize from the skeleton to the newwin size. // Should be fixed in ESR-140 with Bug 1448423. pref("browser.startup.blankWindow", false); Loading toolkit/components/resistfingerprinting/RFPHelper.sys.mjs +82 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ const kPrefLetterboxingRememberSize = const kTopicDOMWindowOpened = "domwindowopened"; const kTopicDOMWindowClosed = "domwindowclosed"; const kPrefResizeWarnings = "privacy.resistFingerprinting.resizeWarnings"; const lazy = {}; ChromeUtils.defineLazyGetter(lazy, "logConsole", () => Loading Loading @@ -55,6 +57,84 @@ function forEachWindow(callback) { } } async function windowResizeHandler(aEvent) { if (RFPHelper.letterboxingEnabled || !RFPHelper.rfpEnabled) { return; } if (Services.prefs.getIntPref(kPrefResizeWarnings) <= 0) { return; } const window = aEvent.currentTarget; // Wait for end of execution queue to ensure we have correct windowState. await new Promise(resolve => window.setTimeout(resolve, 0)); switch (window.windowState) { case window.STATE_MAXIMIZED: case window.STATE_FULLSCREEN: break; default: return; } // Do not add another notification if one is already showing. const kNotificationName = "rfp-window-resize-notification"; let box = window.gNotificationBox; if (box.getNotificationWithValue(kNotificationName)) { return; } // Rate-limit showing our notification if needed. if (Date.now() - (windowResizeHandler.timestamp || 0) < 1000) { return; } windowResizeHandler.timestamp = Date.now(); const decreaseWarningsCount = () => { const currentCount = Services.prefs.getIntPref(kPrefResizeWarnings); if (currentCount > 0) { Services.prefs.setIntPref(kPrefResizeWarnings, currentCount - 1); } }; const [label, accessKey] = await window.document.l10n.formatValues([ { id: "basebrowser-rfp-restore-window-size-button-label" }, { id: "basebrowser-rfp-restore-window-size-button-ak" }, ]); const buttons = [ { label, accessKey, popup: null, callback() { // reset notification timer to work-around resize race conditions windowResizeHandler.timestamp = Date.now(); // restore the original (rounded) size we had stored on window startup let { _rfpOriginalSize } = window; window.setTimeout(() => { window.resizeTo(_rfpOriginalSize.width, _rfpOriginalSize.height); }, 0); }, }, ]; box.appendNotification( kNotificationName, { label: { "l10n-id": "basebrowser-rfp-maximize-warning-message" }, priority: box.PRIORITY_WARNING_LOW, eventCallback(event) { if (event === "dismissed") { // user manually dismissed the notification decreaseWarningsCount(); } }, }, buttons ); } class _RFPHelper { _resizeObservers = new WeakMap(); Loading Loading @@ -717,6 +797,7 @@ class _RFPHelper { _attachWindow(aWindow) { this._fixRounding(aWindow); aWindow.addEventListener("sizemodechange", windowResizeHandler); aWindow.gBrowser.addTabsProgressListener(this); aWindow.addEventListener("TabOpen", this); let resizeObserver = new aWindow.ResizeObserver(entries => { Loading Loading @@ -756,6 +837,7 @@ class _RFPHelper { let browser = tab.linkedBrowser; this._resetContentSize(browser); } aWindow.removeEventListener("sizemodechange", windowResizeHandler); } _handleDOMWindowOpened(win) { Loading Loading
browser/app/profile/001-base-profile.js +2 −0 Original line number Diff line number Diff line Loading @@ -519,6 +519,8 @@ pref("privacy.resistFingerprinting.letterboxing.vcenter", true); pref("privacy.resistFingerprinting.letterboxing.gradient", true); // tor-browser#41918: Should we reuse last window sizes if letterboxing is enabled pref("privacy.resistFingerprinting.letterboxing.rememberSize", false); // tor-browser#41695: How many warnings we show if user closes them without restoring the window size pref("privacy.resistFingerprinting.resizeWarnings", 3); // tor-browser#43402: Avoid a resize from the skeleton to the newwin size. // Should be fixed in ESR-140 with Bug 1448423. pref("browser.startup.blankWindow", false); Loading
toolkit/components/resistfingerprinting/RFPHelper.sys.mjs +82 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ const kPrefLetterboxingRememberSize = const kTopicDOMWindowOpened = "domwindowopened"; const kTopicDOMWindowClosed = "domwindowclosed"; const kPrefResizeWarnings = "privacy.resistFingerprinting.resizeWarnings"; const lazy = {}; ChromeUtils.defineLazyGetter(lazy, "logConsole", () => Loading Loading @@ -55,6 +57,84 @@ function forEachWindow(callback) { } } async function windowResizeHandler(aEvent) { if (RFPHelper.letterboxingEnabled || !RFPHelper.rfpEnabled) { return; } if (Services.prefs.getIntPref(kPrefResizeWarnings) <= 0) { return; } const window = aEvent.currentTarget; // Wait for end of execution queue to ensure we have correct windowState. await new Promise(resolve => window.setTimeout(resolve, 0)); switch (window.windowState) { case window.STATE_MAXIMIZED: case window.STATE_FULLSCREEN: break; default: return; } // Do not add another notification if one is already showing. const kNotificationName = "rfp-window-resize-notification"; let box = window.gNotificationBox; if (box.getNotificationWithValue(kNotificationName)) { return; } // Rate-limit showing our notification if needed. if (Date.now() - (windowResizeHandler.timestamp || 0) < 1000) { return; } windowResizeHandler.timestamp = Date.now(); const decreaseWarningsCount = () => { const currentCount = Services.prefs.getIntPref(kPrefResizeWarnings); if (currentCount > 0) { Services.prefs.setIntPref(kPrefResizeWarnings, currentCount - 1); } }; const [label, accessKey] = await window.document.l10n.formatValues([ { id: "basebrowser-rfp-restore-window-size-button-label" }, { id: "basebrowser-rfp-restore-window-size-button-ak" }, ]); const buttons = [ { label, accessKey, popup: null, callback() { // reset notification timer to work-around resize race conditions windowResizeHandler.timestamp = Date.now(); // restore the original (rounded) size we had stored on window startup let { _rfpOriginalSize } = window; window.setTimeout(() => { window.resizeTo(_rfpOriginalSize.width, _rfpOriginalSize.height); }, 0); }, }, ]; box.appendNotification( kNotificationName, { label: { "l10n-id": "basebrowser-rfp-maximize-warning-message" }, priority: box.PRIORITY_WARNING_LOW, eventCallback(event) { if (event === "dismissed") { // user manually dismissed the notification decreaseWarningsCount(); } }, }, buttons ); } class _RFPHelper { _resizeObservers = new WeakMap(); Loading Loading @@ -717,6 +797,7 @@ class _RFPHelper { _attachWindow(aWindow) { this._fixRounding(aWindow); aWindow.addEventListener("sizemodechange", windowResizeHandler); aWindow.gBrowser.addTabsProgressListener(this); aWindow.addEventListener("TabOpen", this); let resizeObserver = new aWindow.ResizeObserver(entries => { Loading Loading @@ -756,6 +837,7 @@ class _RFPHelper { let browser = tab.linkedBrowser; this._resetContentSize(browser); } aWindow.removeEventListener("sizemodechange", windowResizeHandler); } _handleDOMWindowOpened(win) { Loading