[tor-commits] [tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 19459: Size new windows to 1000x1000 or nearest 200x100
gk at torproject.org
gk at torproject.org
Thu Nov 10 20:38:17 UTC 2016
commit fa996469071a1442386f0313b278cf07ccb4d14c
Author: Arthur Edelstein <arthuredelstein at gmail.com>
Date: Wed Oct 12 02:28:31 2016 +0000
Bug 19459: Size new windows to 1000x1000 or nearest 200x100
---
browser/base/content/browser.js | 10 +++-
xpfe/appshell/nsXULWindow.cpp | 108 ++++++++++++++++++++++++++++++++++------
xpfe/appshell/nsXULWindow.h | 2 +
3 files changed, 102 insertions(+), 18 deletions(-)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 41d72ae..e5fb01c 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -999,8 +999,14 @@ var gBrowserInit = {
// have been initialized.
Services.obs.notifyObservers(window, "browser-window-before-show", "");
- // Set a sane starting width/height for all resolutions on new profiles.
- if (!document.documentElement.hasAttribute("width")) {
+ if (gPrefService.getBoolPref("privacy.resistFingerprinting")) {
+ // With fingerprinting resistance enabled, code elsewhere
+ // is going to generate rounded window dimensions. Make sure
+ // we don't have a maximized window that can interfere with
+ // that, as observed in http://trac.torproject.org/18175
+ document.documentElement.setAttribute("sizemode", "normal");
+ } else if (!document.documentElement.hasAttribute("width")) {
+ // Set a sane starting width/height for all resolutions on new profiles.
let defaultWidth;
let defaultHeight;
diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
index 99289a0..c523e31 100644
--- a/xpfe/appshell/nsXULWindow.cpp
+++ b/xpfe/appshell/nsXULWindow.cpp
@@ -1007,7 +1007,70 @@ NS_IMETHODIMP nsXULWindow::EnsureAuthPrompter()
}
return mAuthPrompter ? NS_OK : NS_ERROR_FAILURE;
}
-
+
+// Rounds window size to 1000x1000, or, if there isn't enough available
+// screen space, to a multiple of 200x100.
+NS_IMETHODIMP nsXULWindow::ResizeToRoundedDimensions()
+{
+ NS_ENSURE_STATE(mPrimaryContentShell);
+ nsCOMPtr<nsIBaseWindow> shellWindow(do_QueryInterface(mPrimaryContentShell));
+ NS_ENSURE_STATE(shellWindow);
+ int32_t windowWidth, windowHeight;
+ int32_t availWidthCSS, availHeightCSS;
+ int32_t contentWidth, contentHeight;
+ double devicePerCSSPixels = 1.0;
+ shellWindow->GetUnscaledDevicePixelsPerCSSPixel(&devicePerCSSPixels);
+ GetSize(&windowWidth, &windowHeight); // device pixels
+ NS_ENSURE_TRUE(GetAvailScreenSize(&availWidthCSS, &availHeightCSS),
+ NS_ERROR_FAILURE);
+ int32_t availWidth = NSToIntRound(devicePerCSSPixels *
+ availWidthCSS); // device pixels
+ int32_t availHeight = NSToIntRound(devicePerCSSPixels *
+ availHeightCSS); // device pixels
+ shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ // Useful for debugging:
+ //printf("\nscaling factor: %f\n", devicePerCSSPixels);
+ //printf("window size: %d x %d\n", windowWidth, windowHeight);
+ //printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ int32_t chromeWidth = windowWidth - contentWidth;
+ int32_t chromeHeight = windowHeight - contentHeight;
+ int maxInnerWidth = Preferences::GetInt("privacy.window.maxInnerWidth",
+ INT_MAX);
+ int maxInnerHeight = Preferences::GetInt("privacy.window.maxInnerHeight",
+ INT_MAX);
+ int32_t availForContentWidthCSS =
+ std::min(maxInnerWidth,
+ NSToIntRound((0.95 * availWidth - chromeWidth) /
+ devicePerCSSPixels));
+ int32_t availForContentHeightCSS =
+ std::min(maxInnerHeight,
+ NSToIntRound((0.95 * availHeight - chromeHeight) /
+ devicePerCSSPixels));
+ int32_t targetContentWidth =
+ NSToIntRound(devicePerCSSPixels *
+ std::min(1000, availForContentWidthCSS -
+ (availForContentWidthCSS % 200)));
+ int32_t targetContentHeight =
+ NSToIntRound(devicePerCSSPixels *
+ std::min(1000, availForContentHeightCSS -
+ (availForContentHeightCSS % 100)));
+ SizeShellTo(mPrimaryContentShell,
+ targetContentWidth, targetContentHeight);
+ mIgnoreXULSize = true;
+ mIgnoreXULSizeMode = true;
+ // Useful for debugging:
+ //printf("target content size: %d, %d\n",
+ // targetContentWidth, targetContentHeight);
+ //GetSize(&windowWidth, &windowHeight);
+ //GetAvailScreenSize(&availWidth, &availHeight);
+ //shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ //printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
+ //printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ return NS_OK;
+}
+
void nsXULWindow::OnChromeLoaded()
{
nsresult rv = EnsureContentTreeOwner();
@@ -1037,6 +1100,13 @@ void nsXULWindow::OnChromeLoaded()
}
}
+ // If we have a content browser object, and fingerprinting resistance
+ // is active, then set to a rounded size.
+ if (mPrimaryContentShell &&
+ Preferences::GetBool("privacy.resistFingerprinting", false)) {
+ ResizeToRoundedDimensions();
+ }
+
bool positionSet = !mIgnoreXULPosition;
nsCOMPtr<nsIXULWindow> parentWindow(do_QueryReferent(mParentWindow));
#if defined(XP_UNIX) && !defined(XP_MACOSX)
@@ -1137,6 +1207,21 @@ bool nsXULWindow::LoadPositionFromXUL()
return gotPosition;
}
+bool nsXULWindow::GetAvailScreenSize(int32_t* availWidth, int32_t* availHeight)
+{
+ nsCOMPtr<nsIDOMWindow> domWindow;
+ GetWindowDOMWindow(getter_AddRefs(domWindow));
+ if (nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(domWindow)) {
+ nsCOMPtr<nsIDOMScreen> screen = window->GetScreen();
+ if (screen) {
+ screen->GetAvailWidth(availWidth);
+ screen->GetAvailHeight(availHeight);
+ return true;
+ }
+ }
+ return false;
+}
+
bool nsXULWindow::LoadSizeFromXUL()
{
bool gotSize = false;
@@ -1181,21 +1266,12 @@ bool nsXULWindow::LoadSizeFromXUL()
}
if (gotSize) {
- // constrain to screen size
- nsCOMPtr<nsIDOMWindow> domWindow;
- GetWindowDOMWindow(getter_AddRefs(domWindow));
- if (nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(domWindow)) {
- nsCOMPtr<nsIDOMScreen> screen = window->GetScreen();
- if (screen) {
- int32_t screenWidth;
- int32_t screenHeight;
- screen->GetAvailWidth(&screenWidth);
- screen->GetAvailHeight(&screenHeight);
- if (specWidth > screenWidth)
- specWidth = screenWidth;
- if (specHeight > screenHeight)
- specHeight = screenHeight;
- }
+ int32_t screenWidth, screenHeight;
+ if (GetAvailScreenSize(&screenWidth, &screenHeight)) {
+ if (specWidth > screenWidth)
+ specWidth = screenWidth;
+ if (specHeight > screenHeight)
+ specHeight = screenHeight;
}
mIntrinsicallySized = false;
diff --git a/xpfe/appshell/nsXULWindow.h b/xpfe/appshell/nsXULWindow.h
index 882e614..f959e11 100644
--- a/xpfe/appshell/nsXULWindow.h
+++ b/xpfe/appshell/nsXULWindow.h
@@ -88,6 +88,7 @@ protected:
NS_IMETHOD EnsurePrimaryContentTreeOwner();
NS_IMETHOD EnsurePrompter();
NS_IMETHOD EnsureAuthPrompter();
+ NS_IMETHOD ResizeToRoundedDimensions();
void OnChromeLoaded();
void StaggerPosition(int32_t &aRequestedX, int32_t &aRequestedY,
@@ -120,6 +121,7 @@ protected:
void SetContentScrollbarVisibility(bool aVisible);
bool GetContentScrollbarVisibility();
void PersistentAttributesDirty(uint32_t aDirtyFlags);
+ bool GetAvailScreenSize(int32_t* availWidth, int32_t* availHeight);
nsChromeTreeOwner* mChromeTreeOwner;
nsContentTreeOwner* mContentTreeOwner;
More information about the tor-commits
mailing list