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; }
|