Commits:
- 
eb4cf955
 by Fatih   at 2024-09-02T08:34:39+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
 
 
 
12 changed files:
Changes:
browser/components/resistfingerprinting/test/mochitest/mochitest.toml
 
| ... | 
... | 
@@ -27,8 +27,6 @@ scheme = "https" | 
 
| 
27
 | 
27
 | 
 scheme = "https"
  | 
 
| 
28
 | 
28
 | 
 support-files = ["test_hide_gamepad_info_iframe.html"]
  | 
 
| 
29
 | 
29
 | 
 
  | 
 
| 
30
 | 
 
 | 
-["test_iframe.html"]
  | 
 
| 
31
 | 
 
 | 
-
  | 
 
| 
32
 | 
30
 | 
 ["test_keyboard_event.html"]
  | 
 
| 
33
 | 
31
 | 
 
  | 
 
| 
34
 | 
32
 | 
 ["test_pointer_event.html"]
  | 
 
| ... | 
... | 
@@ -36,3 +34,5 @@ support-files = ["../../../../../dom/events/test/pointerevents/mochitest_support | 
 
| 
36
 | 
34
 | 
 
  | 
 
| 
37
 | 
35
 | 
 ["test_speech_synthesis.html"]
  | 
 
| 
38
 | 
36
 | 
 skip-if = ["verify"]
  | 
 
| 
 
 | 
37
 | 
+
  | 
 
| 
 
 | 
38
 | 
+["test_bug1885101_screenwindow_sizes.html"]  | 
 
 
 
browser/components/resistfingerprinting/test/mochitest/test_bug1885101_screenwindow_sizes.html
 
| 
 
 | 
1
 | 
+<!DOCTYPE html>
  | 
 
| 
 
 | 
2
 | 
+<html>
  | 
 
| 
 
 | 
3
 | 
+  <head>
  | 
 
| 
 
 | 
4
 | 
+    <title>Tests if +WindowOuterSizeExceptIFrame works properly</title>
  | 
 
| 
 
 | 
5
 | 
+    <link rel="stylesheet" type="text/css" href="">"/tests/SimpleTest/test.css" />
  | 
 
| 
 
 | 
6
 | 
+    <script src="">"/tests/SimpleTest/SimpleTest.js"></script>
  | 
 
| 
 
 | 
7
 | 
+  </head>
  | 
 
| 
 
 | 
8
 | 
+
  | 
 
| 
 
 | 
9
 | 
+  <body>
  | 
 
| 
 
 | 
10
 | 
+    <iframe id="mainFrame"></iframe>
  | 
 
| 
 
 | 
11
 | 
+
  | 
 
| 
 
 | 
12
 | 
+    <template id="mainFrameContents">
  | 
 
| 
 
 | 
13
 | 
+      <script>
  | 
 
| 
 
 | 
14
 | 
+        window.parent.postMessage(
  | 
 
| 
 
 | 
15
 | 
+          {
 | 
 
| 
 
 | 
16
 | 
+            screen: {
 | 
 
| 
 
 | 
17
 | 
+              height: window.screen.height,
  | 
 
| 
 
 | 
18
 | 
+              width: window.screen.width,
  | 
 
| 
 
 | 
19
 | 
+              availHeight: window.screen.availHeight,
  | 
 
| 
 
 | 
20
 | 
+              availWidth: window.screen.availWidth,
  | 
 
| 
 
 | 
21
 | 
+            },
  | 
 
| 
 
 | 
22
 | 
+            outerHeight,
  | 
 
| 
 
 | 
23
 | 
+            outerWidth,
  | 
 
| 
 
 | 
24
 | 
+          },
  | 
 
| 
 
 | 
25
 | 
+          "*"
  | 
 
| 
 
 | 
26
 | 
+        );
  | 
 
| 
 
 | 
27
 | 
+      </script>
  | 
 
| 
 
 | 
28
 | 
+    </template>
  | 
 
| 
 
 | 
29
 | 
+
  | 
 
| 
 
 | 
30
 | 
+    <script>
  | 
 
| 
 
 | 
31
 | 
+      document.addEventListener("DOMContentLoaded", function () {
 | 
 
| 
 
 | 
32
 | 
+        SimpleTest.waitForExplicitFinish();
  | 
 
| 
 
 | 
33
 | 
+
  | 
 
| 
 
 | 
34
 | 
+        window.addEventListener("message", e => {
 | 
 
| 
 
 | 
35
 | 
+          const data = e.data;
  | 
 
| 
 
 | 
36
 | 
+
  | 
 
| 
 
 | 
37
 | 
+          // Check for outer size
  | 
 
| 
 
 | 
38
 | 
+          SimpleTest.is(
  | 
 
| 
 
 | 
39
 | 
+            data.outerHeight,
  | 
 
| 
 
 | 
40
 | 
+            window.outerHeight,
  | 
 
| 
 
 | 
41
 | 
+            "iframe's window.outerHeight should be equal to window.top.outerHeight"
  | 
 
| 
 
 | 
42
 | 
+          );
  | 
 
| 
 
 | 
43
 | 
+
  | 
 
| 
 
 | 
44
 | 
+          SimpleTest.is(
  | 
 
| 
 
 | 
45
 | 
+            data.outerWidth,
  | 
 
| 
 
 | 
46
 | 
+            window.outerWidth,
  | 
 
| 
 
 | 
47
 | 
+            "iframe's window.outerWidth should be equal to window.top.outerWidth"
  | 
 
| 
 
 | 
48
 | 
+          );
  | 
 
| 
 
 | 
49
 | 
+
  | 
 
| 
 
 | 
50
 | 
+          // Check for screen size
  | 
 
| 
 
 | 
51
 | 
+          SimpleTest.is(
  | 
 
| 
 
 | 
52
 | 
+            data.screen.height,
  | 
 
| 
 
 | 
53
 | 
+            window.screen.height,
  | 
 
| 
 
 | 
54
 | 
+            "iframe's window.screen.height should be equal to window.top.screen.height"
  | 
 
| 
 
 | 
55
 | 
+          );
  | 
 
| 
 
 | 
56
 | 
+
  | 
 
| 
 
 | 
57
 | 
+          SimpleTest.is(
  | 
 
| 
 
 | 
58
 | 
+            data.screen.width,
  | 
 
| 
 
 | 
59
 | 
+            window.screen.width,
  | 
 
| 
 
 | 
60
 | 
+            "iframe's window.screen.width should be equal to window.top.screen.width"
  | 
 
| 
 
 | 
61
 | 
+          );
  | 
 
| 
 
 | 
62
 | 
+
  | 
 
| 
 
 | 
63
 | 
+          // Check for avail size
  | 
 
| 
 
 | 
64
 | 
+          SimpleTest.is(
  | 
 
| 
 
 | 
65
 | 
+            data.screen.availHeight,
  | 
 
| 
 
 | 
66
 | 
+            window.screen.availHeight,
  | 
 
| 
 
 | 
67
 | 
+            "iframe's window.screen.availHeight should be equal to window.top.screen.availHeight"
  | 
 
| 
 
 | 
68
 | 
+          );
  | 
 
| 
 
 | 
69
 | 
+
  | 
 
| 
 
 | 
70
 | 
+          SimpleTest.is(
  | 
 
| 
 
 | 
71
 | 
+            data.screen.availWidth,
  | 
 
| 
 
 | 
72
 | 
+            window.screen.availWidth,
  | 
 
| 
 
 | 
73
 | 
+            "iframe's window.screen.availWidth should be equal to window.top.screen.availWidth"
  | 
 
| 
 
 | 
74
 | 
+          );
  | 
 
| 
 
 | 
75
 | 
+
  | 
 
| 
 
 | 
76
 | 
+          SimpleTest.finish();
  | 
 
| 
 
 | 
77
 | 
+        });
  | 
 
| 
 
 | 
78
 | 
+
  | 
 
| 
 
 | 
79
 | 
+        function setFrameSource() {
 | 
 
| 
 
 | 
80
 | 
+          const frame = document.getElementById("mainFrame");
 | 
 
| 
 
 | 
81
 | 
+          const template = document.getElementById("mainFrameContents");
 | 
 
| 
 
 | 
82
 | 
+          frame.srcdoc = template.innerHTML;
  | 
 
| 
 
 | 
83
 | 
+        }
  | 
 
| 
 
 | 
84
 | 
+
  | 
 
| 
 
 | 
85
 | 
+        SpecialPowers.pushPrefEnv(
  | 
 
| 
 
 | 
86
 | 
+          {
 | 
 
| 
 
 | 
87
 | 
+            set: [
  | 
 
| 
 
 | 
88
 | 
+              ["privacy.fingerprintingProtection", true],
  | 
 
| 
 
 | 
89
 | 
+              [
  | 
 
| 
 
 | 
90
 | 
+                "privacy.fingerprintingProtection.overrides",
  | 
 
| 
 
 | 
91
 | 
+                "+WindowOuterSize,+ScreenRect,+ScreenAvailRect",
  | 
 
| 
 
 | 
92
 | 
+              ],
  | 
 
| 
 
 | 
93
 | 
+            ],
  | 
 
| 
 
 | 
94
 | 
+          },
  | 
 
| 
 
 | 
95
 | 
+          () => setFrameSource()
  | 
 
| 
 
 | 
96
 | 
+        );
  | 
 
| 
 
 | 
97
 | 
+      });
  | 
 
| 
 
 | 
98
 | 
+    </script>
  | 
 
| 
 
 | 
99
 | 
+  </body>
  | 
 
| 
 
 | 
100
 | 
+</html>  | 
 
 
 
browser/components/resistfingerprinting/test/mochitest/test_iframe.html
deleted
 
| 
1
 | 
 
 | 
-<!doctype html>
  | 
 
| 
2
 | 
 
 | 
-<script src="">"/tests/SimpleTest/SimpleTest.js"></script>
  | 
 
| 
3
 | 
 
 | 
-<link rel="stylesheet" href="">"/tests/SimpleTest/test.css"/>
  | 
 
| 
4
 | 
 
 | 
-<body>
  | 
 
| 
5
 | 
 
 | 
-<script>
  | 
 
| 
6
 | 
 
 | 
-  add_task(async function() {
 | 
 
| 
7
 | 
 
 | 
-    await SpecialPowers.pushPrefEnv({
 | 
 
| 
8
 | 
 
 | 
-      "set": [["privacy.resistFingerprinting", true]],
  | 
 
| 
9
 | 
 
 | 
-    });
  | 
 
| 
10
 | 
 
 | 
-    is(screen.width, window.innerWidth, "Width should be spoofed");
  | 
 
| 
11
 | 
 
 | 
-    is(screen.height, window.innerHeight, "Height should be spoofed");
  | 
 
| 
12
 | 
 
 | 
-    let iframe = document.createElement("iframe");
 | 
 
| 
13
 | 
 
 | 
-    document.body.appendChild(iframe);
  | 
 
| 
14
 | 
 
 | 
-    is(iframe.contentWindow.screen.width, iframe.contentWindow.innerWidth, "Width should be spoofed in iframe");
  | 
 
| 
15
 | 
 
 | 
-    is(iframe.contentWindow.screen.height, iframe.contentWindow.innerHeight, "Height should be spoofed in iframe");
  | 
 
| 
16
 | 
 
 | 
-  });
  | 
 
| 
17
 | 
 
 | 
-</script>
  | 
 
| 
18
 | 
 
 | 
-</body>  | 
 
 
 
docshell/base/BrowsingContext.h
 
| ... | 
... | 
@@ -272,7 +272,10 @@ struct EmbedderColorSchemes { | 
 
| 
272
 | 
272
 | 
   /* If true, this browsing context is within a hidden embedded document. */  \
  | 
 
| 
273
 | 
273
 | 
   FIELD(IsUnderHiddenEmbedderElement, bool)                                   \
  | 
 
| 
274
 | 
274
 | 
   /* If true, this browsing context is offline */                             \
  | 
 
| 
275
 | 
 
 | 
-  FIELD(ForceOffline, bool)
  | 
 
| 
 
 | 
275
 | 
+  FIELD(ForceOffline, bool)                                                   \
  | 
 
| 
 
 | 
276
 | 
+  /* Used to propagate window.top's inner size for RFPTarget::Window*         \
  | 
 
| 
 
 | 
277
 | 
+   * protections */                                                           \
  | 
 
| 
 
 | 
278
 | 
+  FIELD(TopInnerSizeForRFP, CSSIntSize)
  | 
 
| 
276
 | 
279
 | 
 
  | 
 
| 
277
 | 
280
 | 
 // BrowsingContext, in this context, is the cross process replicated
  | 
 
| 
278
 | 
281
 | 
 // environment in which information about documents is stored. In
  | 
 
| ... | 
... | 
@@ -1253,6 +1256,10 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache { | 
 
| 
1253
 | 
1256
 | 
   bool CanSet(FieldIndex<IDX_ForceOffline>, bool aNewValue,
  | 
 
| 
1254
 | 
1257
 | 
               ContentParent* aSource);
  | 
 
| 
1255
 | 
1258
 | 
 
  | 
 
| 
 
 | 
1259
 | 
+  bool CanSet(FieldIndex<IDX_TopInnerSizeForRFP>, bool, ContentParent*) {
 | 
 
| 
 
 | 
1260
 | 
+    return IsTop();
  | 
 
| 
 
 | 
1261
 | 
+  }
  | 
 
| 
 
 | 
1262
 | 
+
  | 
 
| 
1256
 | 
1263
 | 
   bool CanSet(FieldIndex<IDX_EmbeddedInContentDocument>, bool,
  | 
 
| 
1257
 | 
1264
 | 
               ContentParent* aSource) {
 | 
 
| 
1258
 | 
1265
 | 
     return CheckOnlyEmbedderCanSet(aSource);
  | 
 
 
 
docshell/base/CanonicalBrowsingContext.cpp
 
| ... | 
... | 
@@ -324,6 +324,7 @@ void CanonicalBrowsingContext::ReplacedBy( | 
 
| 
324
 | 
324
 | 
   txn.SetHasRestoreData(GetHasRestoreData());
  | 
 
| 
325
 | 
325
 | 
   txn.SetShouldDelayMediaFromStart(GetShouldDelayMediaFromStart());
  | 
 
| 
326
 | 
326
 | 
   txn.SetForceOffline(GetForceOffline());
  | 
 
| 
 
 | 
327
 | 
+  txn.SetTopInnerSizeForRFP(GetTopInnerSizeForRFP());
  | 
 
| 
327
 | 
328
 | 
 
  | 
 
| 
328
 | 
329
 | 
   // Propagate some settings on BrowsingContext replacement so they're not lost
  | 
 
| 
329
 | 
330
 | 
   // on bfcached navigations. These are important for GeckoView (see bug
  | 
 
 
 
dom/base/nsGlobalWindowOuter.cpp
 
| ... | 
... | 
@@ -3514,9 +3514,10 @@ CSSIntSize nsGlobalWindowOuter::GetOuterSize(CallerType aCallerType, | 
 
| 
3514
 | 
3514
 | 
                                              ErrorResult& aError) {
 | 
 
| 
3515
 | 
3515
 | 
   if (nsIGlobalObject::ShouldResistFingerprinting(aCallerType,
  | 
 
| 
3516
 | 
3516
 | 
                                                   RFPTarget::WindowOuterSize)) {
 | 
 
| 
3517
 | 
 
 | 
-    CSSSize size;
  | 
 
| 
3518
 | 
 
 | 
-    aError = GetInnerSize(size);
  | 
 
| 
3519
 | 
 
 | 
-    return RoundedToInt(size);
  | 
 
| 
 
 | 
3517
 | 
+    if (BrowsingContext* bc = GetBrowsingContext()) {
 | 
 
| 
 
 | 
3518
 | 
+      return bc->Top()->GetTopInnerSizeForRFP();
  | 
 
| 
 
 | 
3519
 | 
+    }
  | 
 
| 
 
 | 
3520
 | 
+    return {};
 | 
 
| 
3520
 | 
3521
 | 
   }
  | 
 
| 
3521
 | 
3522
 | 
 
  | 
 
| 
3522
 | 
3523
 | 
   // Windows showing documents in RDM panes and any subframes within them
  | 
 
 
 
dom/base/nsScreen.cpp
 
| ... | 
... | 
@@ -62,7 +62,7 @@ nsDeviceContext* nsScreen::GetDeviceContext() const { | 
 
| 
62
 | 
62
 | 
 CSSIntRect nsScreen::GetRect() {
 | 
 
| 
63
 | 
63
 | 
   // Return window inner rect to prevent fingerprinting.
  | 
 
| 
64
 | 
64
 | 
   if (ShouldResistFingerprinting(RFPTarget::ScreenRect)) {
 | 
 
| 
65
 | 
 
 | 
-    return GetWindowInnerRect();
  | 
 
| 
 
 | 
65
 | 
+    return GetTopWindowInnerRectForRFP();
  | 
 
| 
66
 | 
66
 | 
   }
  | 
 
| 
67
 | 
67
 | 
 
  | 
 
| 
68
 | 
68
 | 
   // Here we manipulate the value of aRect to represent the screen size,
  | 
 
| ... | 
... | 
@@ -91,7 +91,7 @@ CSSIntRect nsScreen::GetRect() { | 
 
| 
91
 | 
91
 | 
 CSSIntRect nsScreen::GetAvailRect() {
 | 
 
| 
92
 | 
92
 | 
   // Return window inner rect to prevent fingerprinting.
  | 
 
| 
93
 | 
93
 | 
   if (ShouldResistFingerprinting(RFPTarget::ScreenAvailRect)) {
 | 
 
| 
94
 | 
 
 | 
-    return GetWindowInnerRect();
  | 
 
| 
 
 | 
94
 | 
+    return GetTopWindowInnerRectForRFP();
  | 
 
| 
95
 | 
95
 | 
   }
  | 
 
| 
96
 | 
96
 | 
 
  | 
 
| 
97
 | 
97
 | 
   // Here we manipulate the value of aRect to represent the screen size,
  | 
 
| ... | 
... | 
@@ -165,18 +165,14 @@ JSObject* nsScreen::WrapObject(JSContext* aCx, | 
 
| 
165
 | 
165
 | 
   return Screen_Binding::Wrap(aCx, this, aGivenProto);
  | 
 
| 
166
 | 
166
 | 
 }
  | 
 
| 
167
 | 
167
 | 
 
  | 
 
| 
168
 | 
 
 | 
-CSSIntRect nsScreen::GetWindowInnerRect() {
 | 
 
| 
169
 | 
 
 | 
-  nsCOMPtr<nsPIDOMWindowInner> win = GetOwner();
  | 
 
| 
170
 | 
 
 | 
-  if (!win) {
 | 
 
| 
171
 | 
 
 | 
-    return {};
 | 
 
| 
172
 | 
 
 | 
-  }
  | 
 
| 
173
 | 
 
 | 
-  double width;
  | 
 
| 
174
 | 
 
 | 
-  double height;
  | 
 
| 
175
 | 
 
 | 
-  if (NS_FAILED(win->GetInnerWidth(&width)) ||
  | 
 
| 
176
 | 
 
 | 
-      NS_FAILED(win->GetInnerHeight(&height))) {
 | 
 
| 
177
 | 
 
 | 
-    return {};
 | 
 
| 
 
 | 
168
 | 
+CSSIntRect nsScreen::GetTopWindowInnerRectForRFP() {
 | 
 
| 
 
 | 
169
 | 
+  if (nsPIDOMWindowInner* inner = GetOwner()) {
 | 
 
| 
 
 | 
170
 | 
+    if (BrowsingContext* bc = inner->GetBrowsingContext()) {
 | 
 
| 
 
 | 
171
 | 
+      CSSIntSize size = bc->Top()->GetTopInnerSizeForRFP();
  | 
 
| 
 
 | 
172
 | 
+      return {0, 0, size.width, size.height};
 | 
 
| 
 
 | 
173
 | 
+    }
  | 
 
| 
178
 | 
174
 | 
   }
  | 
 
| 
179
 | 
 
 | 
-  return {0, 0, int32_t(std::round(width)), int32_t(std::round(height))};
 | 
 
| 
 
 | 
175
 | 
+  return {};
 | 
 
| 
180
 | 
176
 | 
 }
  | 
 
| 
181
 | 
177
 | 
 
  | 
 
| 
182
 | 
178
 | 
 bool nsScreen::ShouldResistFingerprinting(RFPTarget aTarget) const {
 | 
 
 
 
dom/base/nsScreen.h
 
| ... | 
... | 
@@ -88,7 +88,7 @@ class nsScreen : public mozilla::DOMEventTargetHelper { | 
 
| 
88
 | 
88
 | 
   nsDeviceContext* GetDeviceContext() const;
  | 
 
| 
89
 | 
89
 | 
   mozilla::CSSIntRect GetRect();
  | 
 
| 
90
 | 
90
 | 
   mozilla::CSSIntRect GetAvailRect();
  | 
 
| 
91
 | 
 
 | 
-  mozilla::CSSIntRect GetWindowInnerRect();
  | 
 
| 
 
 | 
91
 | 
+  mozilla::CSSIntRect GetTopWindowInnerRectForRFP();
  | 
 
| 
92
 | 
92
 | 
 
  | 
 
| 
93
 | 
93
 | 
  private:
  | 
 
| 
94
 | 
94
 | 
   virtual ~nsScreen();
  | 
 
 
 
dom/base/test/chrome/bug418986-1.js
 
| ... | 
... | 
@@ -24,14 +24,14 @@ var test = function (isContent) { | 
 
| 
24
 | 
24
 | 
     ["mozInnerScreenY", 0],
  | 
 
| 
25
 | 
25
 | 
     ["screen.pixelDepth", 24],
  | 
 
| 
26
 | 
26
 | 
     ["screen.colorDepth", 24],
  | 
 
| 
27
 | 
 
 | 
-    ["screen.availWidth", "innerWidth"],
  | 
 
| 
28
 | 
 
 | 
-    ["screen.availHeight", "innerHeight"],
  | 
 
| 
 
 | 
27
 | 
+    ["screen.availWidth", "outerWidth"],
  | 
 
| 
 
 | 
28
 | 
+    ["screen.availHeight", "outerHeight"],
  | 
 
| 
29
 | 
29
 | 
     ["screen.left", 0],
  | 
 
| 
30
 | 
30
 | 
     ["screen.top", 0],
  | 
 
| 
31
 | 
31
 | 
     ["screen.availLeft", 0],
  | 
 
| 
32
 | 
32
 | 
     ["screen.availTop", 0],
  | 
 
| 
33
 | 
 
 | 
-    ["screen.width", "innerWidth"],
  | 
 
| 
34
 | 
 
 | 
-    ["screen.height", "innerHeight"],
  | 
 
| 
 
 | 
33
 | 
+    ["screen.width", "outerWidth"],
  | 
 
| 
 
 | 
34
 | 
+    ["screen.height", "outerHeight"],
  | 
 
| 
35
 | 
35
 | 
     ["screen.orientation.type", "'landscape-primary'"],
  | 
 
| 
36
 | 
36
 | 
     ["screen.orientation.angle", 0],
  | 
 
| 
37
 | 
37
 | 
     ["screen.mozOrientation", "'landscape-primary'"],
  | 
 
 
 
layout/base/nsPresContext.cpp
 
| ... | 
... | 
@@ -1459,6 +1459,32 @@ void nsPresContext::SetOverrideDPPX(float aDPPX) { | 
 
| 
1459
 | 
1459
 | 
                             MediaFeatureChangePropagation::JustThisDocument);
  | 
 
| 
1460
 | 
1460
 | 
 }
  | 
 
| 
1461
 | 
1461
 | 
 
  | 
 
| 
 
 | 
1462
 | 
+void nsPresContext::UpdateTopInnerSizeForRFP() {
 | 
 
| 
 
 | 
1463
 | 
+  if (!mDocument->ShouldResistFingerprinting(RFPTarget::WindowOuterSize) ||
  | 
 
| 
 
 | 
1464
 | 
+      !mDocument->GetBrowsingContext() ||
  | 
 
| 
 
 | 
1465
 | 
+      !mDocument->GetBrowsingContext()->IsTop()) {
 | 
 
| 
 
 | 
1466
 | 
+    return;
  | 
 
| 
 
 | 
1467
 | 
+  }
  | 
 
| 
 
 | 
1468
 | 
+
  | 
 
| 
 
 | 
1469
 | 
+  CSSSize size = CSSPixel::FromAppUnits(GetVisibleArea().Size());
  | 
 
| 
 
 | 
1470
 | 
+
  | 
 
| 
 
 | 
1471
 | 
+  switch (StaticPrefs::dom_innerSize_rounding()) {
 | 
 
| 
 
 | 
1472
 | 
+    case 1:
  | 
 
| 
 
 | 
1473
 | 
+      size.width = std::roundf(size.width);
  | 
 
| 
 
 | 
1474
 | 
+      size.height = std::roundf(size.height);
  | 
 
| 
 
 | 
1475
 | 
+      break;
  | 
 
| 
 
 | 
1476
 | 
+    case 2:
  | 
 
| 
 
 | 
1477
 | 
+      size.width = std::truncf(size.width);
  | 
 
| 
 
 | 
1478
 | 
+      size.height = std::truncf(size.height);
  | 
 
| 
 
 | 
1479
 | 
+      break;
  | 
 
| 
 
 | 
1480
 | 
+    default:
  | 
 
| 
 
 | 
1481
 | 
+      break;
  | 
 
| 
 
 | 
1482
 | 
+  }
  | 
 
| 
 
 | 
1483
 | 
+
  | 
 
| 
 
 | 
1484
 | 
+  Unused << mDocument->GetBrowsingContext()->SetTopInnerSizeForRFP(
  | 
 
| 
 
 | 
1485
 | 
+      CSSIntSize{(int)size.width, (int)size.height});
 | 
 
| 
 
 | 
1486
 | 
+}
  | 
 
| 
 
 | 
1487
 | 
+
  | 
 
| 
1462
 | 
1488
 | 
 gfxSize nsPresContext::ScreenSizeInchesForFontInflation(bool* aChanged) {
 | 
 
| 
1463
 | 
1489
 | 
   if (aChanged) {
 | 
 
| 
1464
 | 
1490
 | 
     *aChanged = false;
  | 
 
| ... | 
... | 
@@ -2972,6 +2998,8 @@ void nsPresContext::SetVisibleArea(const nsRect& r) { | 
 
| 
2972
 | 
2998
 | 
           {mozilla::MediaFeatureChangeReason::ViewportChange},
 | 
 
| 
2973
 | 
2999
 | 
           MediaFeatureChangePropagation::JustThisDocument);
  | 
 
| 
2974
 | 
3000
 | 
     }
  | 
 
| 
 
 | 
3001
 | 
+
  | 
 
| 
 
 | 
3002
 | 
+    UpdateTopInnerSizeForRFP();
  | 
 
| 
2975
 | 
3003
 | 
   }
  | 
 
| 
2976
 | 
3004
 | 
 }
  | 
 
| 
2977
 | 
3005
 | 
 
  | 
 
 
 
layout/base/nsPresContext.h
 
| ... | 
... | 
@@ -540,6 +540,7 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr { | 
 
| 
540
 | 
540
 | 
   void SetFullZoom(float aZoom);
  | 
 
| 
541
 | 
541
 | 
   void SetOverrideDPPX(float);
  | 
 
| 
542
 | 
542
 | 
   void SetInRDMPane(bool aInRDMPane);
  | 
 
| 
 
 | 
543
 | 
+  void UpdateTopInnerSizeForRFP();
  | 
 
| 
543
 | 
544
 | 
 
  | 
 
| 
544
 | 
545
 | 
  public:
  | 
 
| 
545
 | 
546
 | 
   float GetFullZoom() { return mFullZoom; }
 | 
 
 
 
toolkit/components/resistfingerprinting/tests/browser/browser_fingerprintingWebCompat.js
 
| ... | 
... | 
@@ -34,12 +34,12 @@ const TEST_CASES = [ | 
 
| 
34
 | 
34
 | 
       {
 | 
 
| 
35
 | 
35
 | 
         id: "1",
  | 
 
| 
36
 | 
36
 | 
         last_modified: 1000000000000001,
  | 
 
| 
37
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
37
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
38
 | 
38
 | 
         firstPartyDomain: "*",
  | 
 
| 
39
 | 
39
 | 
       },
  | 
 
| 
40
 | 
40
 | 
     ],
  | 
 
| 
41
 | 
41
 | 
     expects: {
 | 
 
| 
42
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
42
 | 
+      screenAvailRect: {
 | 
 
| 
43
 | 
43
 | 
         top: true,
  | 
 
| 
44
 | 
44
 | 
         firstParty: true,
  | 
 
| 
45
 | 
45
 | 
         thirdParty: true,
  | 
 
| ... | 
... | 
@@ -57,12 +57,12 @@ const TEST_CASES = [ | 
 
| 
57
 | 
57
 | 
       {
 | 
 
| 
58
 | 
58
 | 
         id: "1",
  | 
 
| 
59
 | 
59
 | 
         last_modified: 1000000000000001,
  | 
 
| 
60
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
60
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
61
 | 
61
 | 
         firstPartyDomain: "example.com",
  | 
 
| 
62
 | 
62
 | 
       },
  | 
 
| 
63
 | 
63
 | 
     ],
  | 
 
| 
64
 | 
64
 | 
     expects: {
 | 
 
| 
65
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
65
 | 
+      screenAvailRect: {
 | 
 
| 
66
 | 
66
 | 
         top: true,
  | 
 
| 
67
 | 
67
 | 
         firstParty: true,
  | 
 
| 
68
 | 
68
 | 
         thirdParty: false,
  | 
 
| ... | 
... | 
@@ -80,13 +80,13 @@ const TEST_CASES = [ | 
 
| 
80
 | 
80
 | 
       {
 | 
 
| 
81
 | 
81
 | 
         id: "1",
  | 
 
| 
82
 | 
82
 | 
         last_modified: 1000000000000001,
  | 
 
| 
83
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
83
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
84
 | 
84
 | 
         firstPartyDomain: "example.com",
  | 
 
| 
85
 | 
85
 | 
         thirdPartyDomain: "*",
  | 
 
| 
86
 | 
86
 | 
       },
  | 
 
| 
87
 | 
87
 | 
     ],
  | 
 
| 
88
 | 
88
 | 
     expects: {
 | 
 
| 
89
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
89
 | 
+      screenAvailRect: {
 | 
 
| 
90
 | 
90
 | 
         top: true,
  | 
 
| 
91
 | 
91
 | 
         firstParty: true,
  | 
 
| 
92
 | 
92
 | 
         thirdParty: true,
  | 
 
| ... | 
... | 
@@ -104,13 +104,13 @@ const TEST_CASES = [ | 
 
| 
104
 | 
104
 | 
       {
 | 
 
| 
105
 | 
105
 | 
         id: "1",
  | 
 
| 
106
 | 
106
 | 
         last_modified: 1000000000000001,
  | 
 
| 
107
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
107
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
108
 | 
108
 | 
         firstPartyDomain: "example.com",
  | 
 
| 
109
 | 
109
 | 
         thirdPartyDomain: "example.org",
  | 
 
| 
110
 | 
110
 | 
       },
  | 
 
| 
111
 | 
111
 | 
     ],
  | 
 
| 
112
 | 
112
 | 
     expects: {
 | 
 
| 
113
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
113
 | 
+      screenAvailRect: {
 | 
 
| 
114
 | 
114
 | 
         top: false,
  | 
 
| 
115
 | 
115
 | 
         firstParty: false,
  | 
 
| 
116
 | 
116
 | 
         thirdParty: true,
  | 
 
| ... | 
... | 
@@ -128,13 +128,13 @@ const TEST_CASES = [ | 
 
| 
128
 | 
128
 | 
       {
 | 
 
| 
129
 | 
129
 | 
         id: "1",
  | 
 
| 
130
 | 
130
 | 
         last_modified: 1000000000000001,
  | 
 
| 
131
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
131
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
132
 | 
132
 | 
         firstPartyDomain: "*",
  | 
 
| 
133
 | 
133
 | 
         thirdPartyDomain: "example.org",
  | 
 
| 
134
 | 
134
 | 
       },
  | 
 
| 
135
 | 
135
 | 
     ],
  | 
 
| 
136
 | 
136
 | 
     expects: {
 | 
 
| 
137
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
137
 | 
+      screenAvailRect: {
 | 
 
| 
138
 | 
138
 | 
         top: false,
  | 
 
| 
139
 | 
139
 | 
         firstParty: false,
  | 
 
| 
140
 | 
140
 | 
         thirdParty: true,
  | 
 
| ... | 
... | 
@@ -153,12 +153,12 @@ const TEST_CASES = [ | 
 
| 
153
 | 
153
 | 
       {
 | 
 
| 
154
 | 
154
 | 
         id: "1",
  | 
 
| 
155
 | 
155
 | 
         last_modified: 1000000000000001,
  | 
 
| 
156
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
156
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
157
 | 
157
 | 
         firstPartyDomain: "example.net",
  | 
 
| 
158
 | 
158
 | 
       },
  | 
 
| 
159
 | 
159
 | 
     ],
  | 
 
| 
160
 | 
160
 | 
     expects: {
 | 
 
| 
161
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
161
 | 
+      screenAvailRect: {
 | 
 
| 
162
 | 
162
 | 
         top: false,
  | 
 
| 
163
 | 
163
 | 
         firstParty: false,
  | 
 
| 
164
 | 
164
 | 
         thirdParty: false,
  | 
 
| ... | 
... | 
@@ -177,13 +177,13 @@ const TEST_CASES = [ | 
 
| 
177
 | 
177
 | 
       {
 | 
 
| 
178
 | 
178
 | 
         id: "1",
  | 
 
| 
179
 | 
179
 | 
         last_modified: 1000000000000001,
  | 
 
| 
180
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
180
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
181
 | 
181
 | 
         firstPartyDomain: "example.net",
  | 
 
| 
182
 | 
182
 | 
         thirdPartyDomain: "*",
  | 
 
| 
183
 | 
183
 | 
       },
  | 
 
| 
184
 | 
184
 | 
     ],
  | 
 
| 
185
 | 
185
 | 
     expects: {
 | 
 
| 
186
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
186
 | 
+      screenAvailRect: {
 | 
 
| 
187
 | 
187
 | 
         top: false,
  | 
 
| 
188
 | 
188
 | 
         firstParty: false,
  | 
 
| 
189
 | 
189
 | 
         thirdParty: false,
  | 
 
| ... | 
... | 
@@ -202,13 +202,13 @@ const TEST_CASES = [ | 
 
| 
202
 | 
202
 | 
       {
 | 
 
| 
203
 | 
203
 | 
         id: "1",
  | 
 
| 
204
 | 
204
 | 
         last_modified: 1000000000000001,
  | 
 
| 
205
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
205
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
206
 | 
206
 | 
         firstPartyDomain: "example.net",
  | 
 
| 
207
 | 
207
 | 
         thirdPartyDomain: "example.com",
  | 
 
| 
208
 | 
208
 | 
       },
  | 
 
| 
209
 | 
209
 | 
     ],
  | 
 
| 
210
 | 
210
 | 
     expects: {
 | 
 
| 
211
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
211
 | 
+      screenAvailRect: {
 | 
 
| 
212
 | 
212
 | 
         top: false,
  | 
 
| 
213
 | 
213
 | 
         firstParty: false,
  | 
 
| 
214
 | 
214
 | 
         thirdParty: false,
  | 
 
| ... | 
... | 
@@ -221,13 +221,13 @@ const TEST_CASES = [ | 
 
| 
221
 | 
221
 | 
     },
  | 
 
| 
222
 | 
222
 | 
   },
  | 
 
| 
223
 | 
223
 | 
   // Test multiple entries that enable HW concurrency in the first-party context
  | 
 
| 
224
 | 
 
 | 
-  // and WindowOuter in the third-party context.
  | 
 
| 
 
 | 
224
 | 
+  // and ScreenAvailRect in the third-party context.
  | 
 
| 
225
 | 
225
 | 
   {
 | 
 
| 
226
 | 
226
 | 
     entires: [
  | 
 
| 
227
 | 
227
 | 
       {
 | 
 
| 
228
 | 
228
 | 
         id: "1",
  | 
 
| 
229
 | 
229
 | 
         last_modified: 1000000000000001,
  | 
 
| 
230
 | 
 
 | 
-        overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
230
 | 
+        overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
231
 | 
231
 | 
         firstPartyDomain: "example.com",
  | 
 
| 
232
 | 
232
 | 
       },
  | 
 
| 
233
 | 
233
 | 
       {
 | 
 
| ... | 
... | 
@@ -239,7 +239,7 @@ const TEST_CASES = [ | 
 
| 
239
 | 
239
 | 
       },
  | 
 
| 
240
 | 
240
 | 
     ],
  | 
 
| 
241
 | 
241
 | 
     expects: {
 | 
 
| 
242
 | 
 
 | 
-      windowOuter: {
 | 
 
| 
 
 | 
242
 | 
+      screenAvailRect: {
 | 
 
| 
243
 | 
243
 | 
         top: true,
  | 
 
| 
244
 | 
244
 | 
         firstParty: true,
  | 
 
| 
245
 | 
245
 | 
         thirdParty: false,
  | 
 
| ... | 
... | 
@@ -335,22 +335,22 @@ async function openAndSetupTestPageForPopup() { | 
 
| 
335
 | 
335
 | 
 }
  | 
 
| 
336
 | 
336
 | 
 
  | 
 
| 
337
 | 
337
 | 
 async function verifyResultInTab(tab, firstPartyBC, thirdPartyBC, expected) {
 | 
 
| 
338
 | 
 
 | 
-  let testWindowOuter = enabled => {
 | 
 
| 
 
 | 
338
 | 
+  let testScreenAvailRect = enabled => {
 | 
 
| 
339
 | 
339
 | 
     if (enabled) {
 | 
 
| 
340
 | 
340
 | 
       ok(
  | 
 
| 
341
 | 
 
 | 
-        content.wrappedJSObject.outerHeight ==
  | 
 
| 
342
 | 
 
 | 
-          content.wrappedJSObject.innerHeight &&
  | 
 
| 
343
 | 
 
 | 
-          content.wrappedJSObject.outerWidth ==
  | 
 
| 
344
 | 
 
 | 
-            content.wrappedJSObject.innerWidth,
  | 
 
| 
345
 | 
 
 | 
-        "Fingerprinting target WindowOuterSize is enabled for WindowOuterSize."
  | 
 
| 
 
 | 
341
 | 
+        content.wrappedJSObject.screen.availHeight ==
  | 
 
| 
 
 | 
342
 | 
+          content.wrappedJSObject.screen.height &&
  | 
 
| 
 
 | 
343
 | 
+          content.wrappedJSObject.screen.availWidth ==
  | 
 
| 
 
 | 
344
 | 
+            content.wrappedJSObject.screen.width,
  | 
 
| 
 
 | 
345
 | 
+        "Fingerprinting target ScreenAvailRect is enabled for ScreenAvailRect."
  | 
 
| 
346
 | 
346
 | 
       );
  | 
 
| 
347
 | 
347
 | 
     } else {
 | 
 
| 
348
 | 
348
 | 
       ok(
  | 
 
| 
349
 | 
 
 | 
-        content.wrappedJSObject.outerHeight !=
  | 
 
| 
350
 | 
 
 | 
-          content.wrappedJSObject.innerHeight ||
  | 
 
| 
351
 | 
 
 | 
-          content.wrappedJSObject.outerWidth !=
  | 
 
| 
352
 | 
 
 | 
-            content.wrappedJSObject.innerWidth,
  | 
 
| 
353
 | 
 
 | 
-        "Fingerprinting target WindowOuterSize is not enabled for WindowOuterSize."
  | 
 
| 
 
 | 
349
 | 
+        content.wrappedJSObject.screen.availHeight !=
  | 
 
| 
 
 | 
350
 | 
+          content.wrappedJSObject.screen.height ||
  | 
 
| 
 
 | 
351
 | 
+          content.wrappedJSObject.screen.availWidth !=
  | 
 
| 
 
 | 
352
 | 
+            content.wrappedJSObject.screen.width,
  | 
 
| 
 
 | 
353
 | 
+        "Fingerprinting target ScreenAvailRect is not enabled for ScreenAvailRect."
  | 
 
| 
354
 | 
354
 | 
       );
  | 
 
| 
355
 | 
355
 | 
     }
  | 
 
| 
356
 | 
356
 | 
   };
  | 
 
| ... | 
... | 
@@ -370,8 +370,8 @@ async function verifyResultInTab(tab, firstPartyBC, thirdPartyBC, expected) { | 
 
| 
370
 | 
370
 | 
   );
  | 
 
| 
371
 | 
371
 | 
   await SpecialPowers.spawn(
  | 
 
| 
372
 | 
372
 | 
     tab.linkedBrowser,
  | 
 
| 
373
 | 
 
 | 
-    [expected.windowOuter.top],
  | 
 
| 
374
 | 
 
 | 
-    testWindowOuter
  | 
 
| 
 
 | 
373
 | 
+    [expected.screenAvailRect.top],
  | 
 
| 
 
 | 
374
 | 
+    testScreenAvailRect
  | 
 
| 
375
 | 
375
 | 
   );
  | 
 
| 
376
 | 
376
 | 
   let expectHWConcurrencyTop = expected.hwConcurrency.top
  | 
 
| 
377
 | 
377
 | 
     ? SPOOFED_HW_CONCURRENCY
  | 
 
| ... | 
... | 
@@ -401,8 +401,8 @@ async function verifyResultInTab(tab, firstPartyBC, thirdPartyBC, expected) { | 
 
| 
401
 | 
401
 | 
   );
  | 
 
| 
402
 | 
402
 | 
   await SpecialPowers.spawn(
  | 
 
| 
403
 | 
403
 | 
     firstPartyBC,
  | 
 
| 
404
 | 
 
 | 
-    [expected.windowOuter.firstParty],
  | 
 
| 
405
 | 
 
 | 
-    testWindowOuter
  | 
 
| 
 
 | 
404
 | 
+    [expected.screenAvailRect.firstParty],
  | 
 
| 
 
 | 
405
 | 
+    testScreenAvailRect
  | 
 
| 
406
 | 
406
 | 
   );
  | 
 
| 
407
 | 
407
 | 
   let expectHWConcurrencyFirstParty = expected.hwConcurrency.firstParty
  | 
 
| 
408
 | 
408
 | 
     ? SPOOFED_HW_CONCURRENCY
  | 
 
| ... | 
... | 
@@ -432,8 +432,8 @@ async function verifyResultInTab(tab, firstPartyBC, thirdPartyBC, expected) { | 
 
| 
432
 | 
432
 | 
   );
  | 
 
| 
433
 | 
433
 | 
   await SpecialPowers.spawn(
  | 
 
| 
434
 | 
434
 | 
     thirdPartyBC,
  | 
 
| 
435
 | 
 
 | 
-    [expected.windowOuter.thirdParty],
  | 
 
| 
436
 | 
 
 | 
-    testWindowOuter
  | 
 
| 
 
 | 
435
 | 
+    [expected.screenAvailRect.thirdParty],
  | 
 
| 
 
 | 
436
 | 
+    testScreenAvailRect
  | 
 
| 
437
 | 
437
 | 
   );
  | 
 
| 
438
 | 
438
 | 
   let expectHWConcurrencyThirdParty = expected.hwConcurrency.thirdParty
  | 
 
| 
439
 | 
439
 | 
     ? SPOOFED_HW_CONCURRENCY
  | 
 
| ... | 
... | 
@@ -517,7 +517,7 @@ add_task(async function test_popup_inheritance() { | 
 
| 
517
 | 
517
 | 
         {
 | 
 
| 
518
 | 
518
 | 
           id: "1",
  | 
 
| 
519
 | 
519
 | 
           last_modified: 1000000000000001,
  | 
 
| 
520
 | 
 
 | 
-          overrides: "+WindowOuterSize",
  | 
 
| 
 
 | 
520
 | 
+          overrides: "+ScreenRect,+ScreenAvailRect",
  | 
 
| 
521
 | 
521
 | 
           firstPartyDomain: "example.com",
  | 
 
| 
522
 | 
522
 | 
           thirdPartyDomain: "example.org",
  | 
 
| 
523
 | 
523
 | 
         },
  | 
 
| ... | 
... | 
@@ -532,22 +532,22 @@ add_task(async function test_popup_inheritance() { | 
 
| 
532
 | 
532
 | 
   // Ensure the third-party iframe has the correct overrides.
  | 
 
| 
533
 | 
533
 | 
   await SpecialPowers.spawn(thirdPartyFrameBC, [], _ => {
 | 
 
| 
534
 | 
534
 | 
     ok(
  | 
 
| 
535
 | 
 
 | 
-      content.wrappedJSObject.outerHeight ==
  | 
 
| 
536
 | 
 
 | 
-        content.wrappedJSObject.innerHeight &&
  | 
 
| 
537
 | 
 
 | 
-        content.wrappedJSObject.outerWidth ==
  | 
 
| 
538
 | 
 
 | 
-          content.wrappedJSObject.innerWidth,
  | 
 
| 
539
 | 
 
 | 
-      "Fingerprinting target WindowOuterSize is enabled for third-party iframe."
  | 
 
| 
 
 | 
535
 | 
+      content.wrappedJSObject.screen.availHeight ==
  | 
 
| 
 
 | 
536
 | 
+        content.wrappedJSObject.screen.height &&
  | 
 
| 
 
 | 
537
 | 
+        content.wrappedJSObject.screen.availWidth ==
  | 
 
| 
 
 | 
538
 | 
+          content.wrappedJSObject.screen.width,
  | 
 
| 
 
 | 
539
 | 
+      "Fingerprinting target ScreenAvailRect is enabled for third-party iframe."
  | 
 
| 
540
 | 
540
 | 
     );
  | 
 
| 
541
 | 
541
 | 
   });
  | 
 
| 
542
 | 
542
 | 
 
  | 
 
| 
543
 | 
543
 | 
   // Verify the popup inherits overrides from the opener.
  | 
 
| 
544
 | 
544
 | 
   await SpecialPowers.spawn(popupBC, [], _ => {
 | 
 
| 
545
 | 
545
 | 
     ok(
  | 
 
| 
546
 | 
 
 | 
-      content.wrappedJSObject.outerHeight ==
  | 
 
| 
547
 | 
 
 | 
-        content.wrappedJSObject.innerHeight &&
  | 
 
| 
548
 | 
 
 | 
-        content.wrappedJSObject.outerWidth ==
  | 
 
| 
549
 | 
 
 | 
-          content.wrappedJSObject.innerWidth,
  | 
 
| 
550
 | 
 
 | 
-      "Fingerprinting target WindowOuterSize is enabled for the pop-up."
  | 
 
| 
 
 | 
546
 | 
+      content.wrappedJSObject.screen.availHeight ==
  | 
 
| 
 
 | 
547
 | 
+        content.wrappedJSObject.screen.height &&
  | 
 
| 
 
 | 
548
 | 
+        content.wrappedJSObject.screen.availWidth ==
  | 
 
| 
 
 | 
549
 | 
+          content.wrappedJSObject.screen.width,
  | 
 
| 
 
 | 
550
 | 
+      "Fingerprinting target ScreenAvailRect is enabled for the pop-up."
  | 
 
| 
551
 | 
551
 | 
     );
  | 
 
| 
552
 | 
552
 | 
 
  | 
 
| 
553
 | 
553
 | 
     content.close();
  | 
 
 
 
 
 |