[tbb-commits] [Git][tpo/applications/tor-browser][tor-browser-115.15.0esr-13.5-1] Bug 1885101: Match screen and window properties with top window for...
ma1 (@ma1)
git at gitlab.torproject.org
Sat Aug 31 05:54:36 UTC 2024
ma1 pushed to branch tor-browser-115.15.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
fdbe54d5 by Fatih at 2024-08-29T22:23:54+00:00
Bug 1885101: Match screen and window properties with top window for ScreenRect, ScreenAvailRect and WindowOuterSize. r=timhuang,emilio
This patch removes test_iframe.html. We remove it because the newly introduced test covers the tests done in that test. The reason for removing it in the first place is now that screen properties are inherited/spoofed xorigin, we get a 4px difference. The reasosn for 4px difference is the test runner runs tests in an iframe with a 2px border on each side.
Differential Revision: https://phabricator.services.mozilla.com/D215509
- - - - -
7 changed files:
- docshell/base/BrowsingContext.h
- docshell/base/CanonicalBrowsingContext.cpp
- dom/base/nsGlobalWindowOuter.cpp
- dom/base/nsScreen.cpp
- dom/base/nsScreen.h
- layout/base/nsPresContext.cpp
- layout/base/nsPresContext.h
Changes:
=====================================
docshell/base/BrowsingContext.h
=====================================
@@ -32,6 +32,9 @@
#include "nsILoadInfo.h"
#include "nsILoadContext.h"
#include "nsThreadUtils.h"
+// It seems ESR-115 is missing the definitions of CSSIntSize, so add this
+// header to include it
+#include "Units.h"
class nsDocShellLoadState;
class nsGlobalWindowInner;
@@ -266,7 +269,10 @@ struct EmbedderColorSchemes {
* a content process. */ \
FIELD(EmbeddedInContentDocument, bool) \
/* If true, this browsing context is within a hidden embedded document. */ \
- FIELD(IsUnderHiddenEmbedderElement, bool)
+ FIELD(IsUnderHiddenEmbedderElement, bool) \
+ /* Used to propagate window.top's inner size for RFPTarget::Window* \
+ * protections */ \
+ FIELD(TopInnerSizeForRFP, mozilla::CSSIntSize)
// BrowsingContext, in this context, is the cross process replicated
// environment in which information about documents is stored. In
@@ -1231,6 +1237,10 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
const bool& aIsUnderHiddenEmbedderElement,
ContentParent* aSource);
+ bool CanSet(FieldIndex<IDX_TopInnerSizeForRFP>, bool, ContentParent*) {
+ return IsTop();
+ }
+
bool CanSet(FieldIndex<IDX_EmbeddedInContentDocument>, bool,
ContentParent* aSource) {
return CheckOnlyEmbedderCanSet(aSource);
=====================================
docshell/base/CanonicalBrowsingContext.cpp
=====================================
@@ -318,6 +318,7 @@ void CanonicalBrowsingContext::ReplacedBy(
txn.SetEmbedderColorSchemes(GetEmbedderColorSchemes());
txn.SetHasRestoreData(GetHasRestoreData());
txn.SetShouldDelayMediaFromStart(GetShouldDelayMediaFromStart());
+ txn.SetTopInnerSizeForRFP(GetTopInnerSizeForRFP());
// Propagate some settings on BrowsingContext replacement so they're not lost
// on bfcached navigations. These are important for GeckoView (see bug
=====================================
dom/base/nsGlobalWindowOuter.cpp
=====================================
@@ -3582,9 +3582,10 @@ CSSIntSize nsGlobalWindowOuter::GetOuterSize(CallerType aCallerType,
ErrorResult& aError) {
if (nsIGlobalObject::ShouldResistFingerprinting(aCallerType,
RFPTarget::Unknown)) {
- CSSSize size;
- aError = GetInnerSize(size);
- return RoundedToInt(size);
+ if (BrowsingContext* bc = GetBrowsingContext()) {
+ return bc->Top()->GetTopInnerSizeForRFP();
+ }
+ return {};
}
// Windows showing documents in RDM panes and any subframes within them
=====================================
dom/base/nsScreen.cpp
=====================================
@@ -81,7 +81,7 @@ nsDeviceContext* nsScreen::GetDeviceContext() const {
nsresult nsScreen::GetRect(CSSIntRect& aRect) {
// Return window inner rect to prevent fingerprinting.
if (ShouldResistFingerprinting()) {
- return GetWindowInnerRect(aRect);
+ return GetTopWindowInnerRectForRFP(aRect);
}
// Here we manipulate the value of aRect to represent the screen size,
@@ -113,7 +113,7 @@ nsresult nsScreen::GetRect(CSSIntRect& aRect) {
nsresult nsScreen::GetAvailRect(CSSIntRect& aRect) {
// Return window inner rect to prevent fingerprinting.
if (ShouldResistFingerprinting()) {
- return GetWindowInnerRect(aRect);
+ return GetTopWindowInnerRectForRFP(aRect);
}
// Here we manipulate the value of aRect to represent the screen size,
@@ -208,20 +208,14 @@ JSObject* nsScreen::WrapObject(JSContext* aCx,
return Screen_Binding::Wrap(aCx, this, aGivenProto);
}
-nsresult nsScreen::GetWindowInnerRect(CSSIntRect& aRect) {
- aRect.x = 0;
- aRect.y = 0;
- nsCOMPtr<nsPIDOMWindowInner> win = GetOwner();
- if (!win) {
- return NS_ERROR_FAILURE;
+nsresult nsScreen::GetTopWindowInnerRectForRFP(CSSIntRect& aRect) {
+ aRect = {};
+ if (nsPIDOMWindowInner* inner = GetOwner()) {
+ if (BrowsingContext* bc = inner->GetBrowsingContext()) {
+ CSSIntSize size = bc->Top()->GetTopInnerSizeForRFP();
+ aRect = {0, 0, size.width, size.height};
+ }
}
- double width;
- double height;
- nsresult rv = win->GetInnerWidth(&width);
- NS_ENSURE_SUCCESS(rv, rv);
- rv = win->GetInnerHeight(&height);
- NS_ENSURE_SUCCESS(rv, rv);
- aRect.SizeTo(std::round(width), std::round(height));
return NS_OK;
}
=====================================
dom/base/nsScreen.h
=====================================
@@ -127,7 +127,9 @@ class nsScreen : public mozilla::DOMEventTargetHelper {
nsDeviceContext* GetDeviceContext() const;
nsresult GetRect(mozilla::CSSIntRect& aRect);
nsresult GetAvailRect(mozilla::CSSIntRect& aRect);
- nsresult GetWindowInnerRect(mozilla::CSSIntRect& aRect);
+ // Sometime between ESR-115 and ESR-128 the function signature changed, so we
+ // revert to the ESR-115 way of doing things
+ nsresult GetTopWindowInnerRectForRFP(mozilla::CSSIntRect& aRect);
private:
explicit nsScreen(nsPIDOMWindowInner* aWindow);
=====================================
layout/base/nsPresContext.cpp
=====================================
@@ -1448,6 +1448,26 @@ void nsPresContext::SetOverrideDPPX(float aDPPX) {
MediaFeatureChangePropagation::JustThisDocument);
}
+void nsPresContext::UpdateTopInnerSizeForRFP() {
+// RFPTarget::WindowOuterSize does not exist in ESR-115 so use fallback
+ if (!mDocument->ShouldResistFingerprinting(RFPTarget::Unknown) ||
+ !mDocument->GetBrowsingContext() ||
+ !mDocument->GetBrowsingContext()->IsTop()) {
+ return;
+ }
+
+ CSSSize size = CSSPixel::FromAppUnits(GetVisibleArea().Size());
+
+ // The upstream version of this patch had conditional logic based on the
+ // dom.innerSize.rounding pref which does not exist in ESR-115, so we
+ // pick the branch it would have taken for the pref's default value (2)
+ size.width = std::truncf(size.width);
+ size.height = std::truncf(size.height);
+
+ Unused << mDocument->GetBrowsingContext()->SetTopInnerSizeForRFP(
+ CSSIntSize{(int)size.width, (int)size.height});
+}
+
gfxSize nsPresContext::ScreenSizeInchesForFontInflation(bool* aChanged) {
if (aChanged) {
*aChanged = false;
@@ -2979,6 +2999,8 @@ void nsPresContext::SetVisibleArea(const nsRect& r) {
{mozilla::MediaFeatureChangeReason::ViewportChange},
MediaFeatureChangePropagation::JustThisDocument);
}
+
+ UpdateTopInnerSizeForRFP();
}
}
=====================================
layout/base/nsPresContext.h
=====================================
@@ -549,6 +549,7 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr {
void SetFullZoom(float aZoom);
void SetOverrideDPPX(float);
void SetInRDMPane(bool aInRDMPane);
+ void UpdateTopInnerSizeForRFP();
public:
float GetFullZoom() { return mFullZoom; }
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/fdbe54d55678935528d9387639c333c9202bd732
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/fdbe54d55678935528d9387639c333c9202bd732
You're receiving this email because of your account on gitlab.torproject.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tbb-commits/attachments/20240831/0a3d9a43/attachment-0001.htm>
More information about the tbb-commits
mailing list