ma1 pushed to branch mullvad-browser-115.15.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
-
5436ef3f
by Fatih at 2024-08-31T13:56:21+08:00
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:
... | ... | @@ -32,6 +32,9 @@ |
32 | 32 | #include "nsILoadInfo.h"
|
33 | 33 | #include "nsILoadContext.h"
|
34 | 34 | #include "nsThreadUtils.h"
|
35 | +// It seems ESR-115 is missing the definitions of CSSIntSize, so add this
|
|
36 | +// header to include it
|
|
37 | +#include "Units.h"
|
|
35 | 38 | |
36 | 39 | class nsDocShellLoadState;
|
37 | 40 | class nsGlobalWindowInner;
|
... | ... | @@ -266,7 +269,10 @@ struct EmbedderColorSchemes { |
266 | 269 | * a content process. */ \
|
267 | 270 | FIELD(EmbeddedInContentDocument, bool) \
|
268 | 271 | /* If true, this browsing context is within a hidden embedded document. */ \
|
269 | - FIELD(IsUnderHiddenEmbedderElement, bool)
|
|
272 | + FIELD(IsUnderHiddenEmbedderElement, bool) \
|
|
273 | + /* Used to propagate window.top's inner size for RFPTarget::Window* \
|
|
274 | + * protections */ \
|
|
275 | + FIELD(TopInnerSizeForRFP, mozilla::CSSIntSize)
|
|
270 | 276 | |
271 | 277 | // BrowsingContext, in this context, is the cross process replicated
|
272 | 278 | // environment in which information about documents is stored. In
|
... | ... | @@ -1231,6 +1237,10 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache { |
1231 | 1237 | const bool& aIsUnderHiddenEmbedderElement,
|
1232 | 1238 | ContentParent* aSource);
|
1233 | 1239 | |
1240 | + bool CanSet(FieldIndex<IDX_TopInnerSizeForRFP>, bool, ContentParent*) {
|
|
1241 | + return IsTop();
|
|
1242 | + }
|
|
1243 | + |
|
1234 | 1244 | bool CanSet(FieldIndex<IDX_EmbeddedInContentDocument>, bool,
|
1235 | 1245 | ContentParent* aSource) {
|
1236 | 1246 | return CheckOnlyEmbedderCanSet(aSource);
|
... | ... | @@ -318,6 +318,7 @@ void CanonicalBrowsingContext::ReplacedBy( |
318 | 318 | txn.SetEmbedderColorSchemes(GetEmbedderColorSchemes());
|
319 | 319 | txn.SetHasRestoreData(GetHasRestoreData());
|
320 | 320 | txn.SetShouldDelayMediaFromStart(GetShouldDelayMediaFromStart());
|
321 | + txn.SetTopInnerSizeForRFP(GetTopInnerSizeForRFP());
|
|
321 | 322 | |
322 | 323 | // Propagate some settings on BrowsingContext replacement so they're not lost
|
323 | 324 | // on bfcached navigations. These are important for GeckoView (see bug
|
... | ... | @@ -3581,9 +3581,10 @@ CSSIntSize nsGlobalWindowOuter::GetOuterSize(CallerType aCallerType, |
3581 | 3581 | ErrorResult& aError) {
|
3582 | 3582 | if (nsIGlobalObject::ShouldResistFingerprinting(aCallerType,
|
3583 | 3583 | RFPTarget::Unknown)) {
|
3584 | - CSSSize size;
|
|
3585 | - aError = GetInnerSize(size);
|
|
3586 | - return RoundedToInt(size);
|
|
3584 | + if (BrowsingContext* bc = GetBrowsingContext()) {
|
|
3585 | + return bc->Top()->GetTopInnerSizeForRFP();
|
|
3586 | + }
|
|
3587 | + return {};
|
|
3587 | 3588 | }
|
3588 | 3589 | |
3589 | 3590 | // Windows showing documents in RDM panes and any subframes within them
|
... | ... | @@ -81,7 +81,7 @@ nsDeviceContext* nsScreen::GetDeviceContext() const { |
81 | 81 | nsresult nsScreen::GetRect(CSSIntRect& aRect) {
|
82 | 82 | // Return window inner rect to prevent fingerprinting.
|
83 | 83 | if (ShouldResistFingerprinting()) {
|
84 | - return GetWindowInnerRect(aRect);
|
|
84 | + return GetTopWindowInnerRectForRFP(aRect);
|
|
85 | 85 | }
|
86 | 86 | |
87 | 87 | // Here we manipulate the value of aRect to represent the screen size,
|
... | ... | @@ -113,7 +113,7 @@ nsresult nsScreen::GetRect(CSSIntRect& aRect) { |
113 | 113 | nsresult nsScreen::GetAvailRect(CSSIntRect& aRect) {
|
114 | 114 | // Return window inner rect to prevent fingerprinting.
|
115 | 115 | if (ShouldResistFingerprinting()) {
|
116 | - return GetWindowInnerRect(aRect);
|
|
116 | + return GetTopWindowInnerRectForRFP(aRect);
|
|
117 | 117 | }
|
118 | 118 | |
119 | 119 | // Here we manipulate the value of aRect to represent the screen size,
|
... | ... | @@ -208,20 +208,14 @@ JSObject* nsScreen::WrapObject(JSContext* aCx, |
208 | 208 | return Screen_Binding::Wrap(aCx, this, aGivenProto);
|
209 | 209 | }
|
210 | 210 | |
211 | -nsresult nsScreen::GetWindowInnerRect(CSSIntRect& aRect) {
|
|
212 | - aRect.x = 0;
|
|
213 | - aRect.y = 0;
|
|
214 | - nsCOMPtr<nsPIDOMWindowInner> win = GetOwner();
|
|
215 | - if (!win) {
|
|
216 | - return NS_ERROR_FAILURE;
|
|
211 | +nsresult nsScreen::GetTopWindowInnerRectForRFP(CSSIntRect& aRect) {
|
|
212 | + aRect = {};
|
|
213 | + if (nsPIDOMWindowInner* inner = GetOwner()) {
|
|
214 | + if (BrowsingContext* bc = inner->GetBrowsingContext()) {
|
|
215 | + CSSIntSize size = bc->Top()->GetTopInnerSizeForRFP();
|
|
216 | + aRect = {0, 0, size.width, size.height};
|
|
217 | + }
|
|
217 | 218 | }
|
218 | - double width;
|
|
219 | - double height;
|
|
220 | - nsresult rv = win->GetInnerWidth(&width);
|
|
221 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
222 | - rv = win->GetInnerHeight(&height);
|
|
223 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
224 | - aRect.SizeTo(std::round(width), std::round(height));
|
|
225 | 219 | return NS_OK;
|
226 | 220 | }
|
227 | 221 |
... | ... | @@ -127,7 +127,9 @@ class nsScreen : public mozilla::DOMEventTargetHelper { |
127 | 127 | nsDeviceContext* GetDeviceContext() const;
|
128 | 128 | nsresult GetRect(mozilla::CSSIntRect& aRect);
|
129 | 129 | nsresult GetAvailRect(mozilla::CSSIntRect& aRect);
|
130 | - nsresult GetWindowInnerRect(mozilla::CSSIntRect& aRect);
|
|
130 | + // Sometime between ESR-115 and ESR-128 the function signature changed, so we
|
|
131 | + // revert to the ESR-115 way of doing things
|
|
132 | + nsresult GetTopWindowInnerRectForRFP(mozilla::CSSIntRect& aRect);
|
|
131 | 133 | |
132 | 134 | private:
|
133 | 135 | explicit nsScreen(nsPIDOMWindowInner* aWindow);
|
... | ... | @@ -1448,6 +1448,26 @@ void nsPresContext::SetOverrideDPPX(float aDPPX) { |
1448 | 1448 | MediaFeatureChangePropagation::JustThisDocument);
|
1449 | 1449 | }
|
1450 | 1450 | |
1451 | +void nsPresContext::UpdateTopInnerSizeForRFP() {
|
|
1452 | +// RFPTarget::WindowOuterSize does not exist in ESR-115 so use fallback
|
|
1453 | + if (!mDocument->ShouldResistFingerprinting(RFPTarget::Unknown) ||
|
|
1454 | + !mDocument->GetBrowsingContext() ||
|
|
1455 | + !mDocument->GetBrowsingContext()->IsTop()) {
|
|
1456 | + return;
|
|
1457 | + }
|
|
1458 | + |
|
1459 | + CSSSize size = CSSPixel::FromAppUnits(GetVisibleArea().Size());
|
|
1460 | + |
|
1461 | + // The upstream version of this patch had conditional logic based on the
|
|
1462 | + // dom.innerSize.rounding pref which does not exist in ESR-115, so we
|
|
1463 | + // pick the branch it would have taken for the pref's default value (2)
|
|
1464 | + size.width = std::truncf(size.width);
|
|
1465 | + size.height = std::truncf(size.height);
|
|
1466 | + |
|
1467 | + Unused << mDocument->GetBrowsingContext()->SetTopInnerSizeForRFP(
|
|
1468 | + CSSIntSize{(int)size.width, (int)size.height});
|
|
1469 | +}
|
|
1470 | + |
|
1451 | 1471 | gfxSize nsPresContext::ScreenSizeInchesForFontInflation(bool* aChanged) {
|
1452 | 1472 | if (aChanged) {
|
1453 | 1473 | *aChanged = false;
|
... | ... | @@ -2979,6 +2999,8 @@ void nsPresContext::SetVisibleArea(const nsRect& r) { |
2979 | 2999 | {mozilla::MediaFeatureChangeReason::ViewportChange},
|
2980 | 3000 | MediaFeatureChangePropagation::JustThisDocument);
|
2981 | 3001 | }
|
3002 | + |
|
3003 | + UpdateTopInnerSizeForRFP();
|
|
2982 | 3004 | }
|
2983 | 3005 | }
|
2984 | 3006 |
... | ... | @@ -549,6 +549,7 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr { |
549 | 549 | void SetFullZoom(float aZoom);
|
550 | 550 | void SetOverrideDPPX(float);
|
551 | 551 | void SetInRDMPane(bool aInRDMPane);
|
552 | + void UpdateTopInnerSizeForRFP();
|
|
552 | 553 | |
553 | 554 | public:
|
554 | 555 | float GetFullZoom() { return mFullZoom; }
|