Skip to content
Snippets Groups Projects
Verified Commit be88af1c authored by ma1's avatar ma1
Browse files

Bug 41695: Warn on window maximization without letterboxing in RFPHelper module

parent e32a6cd3
1 merge request!594Non-letterboxed window management migration to the RFPHelper
......@@ -8,3 +8,7 @@ language-notification-label-system = { -brand-short-name } has set your display
# $language is the language Tor Browser is displayed in (already translated).
language-notification-label = { -brand-short-name } has set your display language to { $language }.
language-notification-button = Change Language…
basebrowser-rfp-maximize-warning-message = Maximizing the browser window can allow websites to determine your monitor size, which can be used to track you. We recommend that you leave browser windows in their original default size.
basebrowser-rfp-restore-window-size-button-label = Restore
basebrowser-rfp-restore-window-size-button-ak = R
......@@ -22,6 +22,8 @@ const kPrefLetterboxingTesting =
"privacy.resistFingerprinting.letterboxing.testing";
const kTopicDOMWindowOpened = "domwindowopened";
const kPrefResizeWarnings = "privacy.resistFingerprinting.resizeWarnings";
XPCOMUtils.defineLazyGetter(this, "logConsole", () =>
console.createInstance({
prefix: "RFPHelper.jsm",
......@@ -47,6 +49,85 @@ function forEachWindow(callback) {
}
}
async function windowResizeHandler(aEvent) {
if (RFPHelper.letterboxingEnabled) {
return;
}
if (Services.prefs.getIntPref(kPrefResizeWarnings, 3) <= 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 {
// ============================================================================
// Shared Setup
......@@ -436,7 +517,12 @@ class _RFPHelper {
])
);
if (!win._rfpSizeOffset) {
if (
!win._rfpSizeOffset ||
(win._rfpOriginalSize &&
win.outerWidth === win._rfpOriginalSize.width &&
win.outerHeight === win._rfpOriginalSize.height)
) {
const BASELINE_ROUNDING = 10;
const offset = s =>
s - Math.round(s / BASELINE_ROUNDING) * BASELINE_ROUNDING;
......@@ -606,10 +692,18 @@ class _RFPHelper {
// we need to add this class late because otherwise new windows get maximized
aWindow.setTimeout(() => {
tabBrowser.tabpanels?.classList.add("letterboxing-ready");
if (!aWindow._rfpOriginalSize) {
aWindow._rfpOriginalSize = {
width: aWindow.outerWidth,
height: aWindow.outerHeight,
};
log("Recording original window size", aWindow._rfpOriginalSize);
}
});
}
_attachWindow(aWindow) {
aWindow.addEventListener("sizemodechange", windowResizeHandler);
aWindow.gBrowser.addTabsProgressListener(this);
aWindow.addEventListener("TabOpen", this);
const resizeObserver = (aWindow._rfpResizeObserver = new aWindow.ResizeObserver(
......@@ -644,6 +738,7 @@ class _RFPHelper {
let browser = tab.linkedBrowser;
this._resetContentSize(browser);
}
aWindow.removeEventListener("sizemodechange", windowResizeHandler);
}
_handleDOMWindowOpened(win) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment