Commits:
-
0c49d19c
by Fatih at 2024-10-02T19:27:24+00:00
Bug 1607032: Spoof screen orientation and angle to primary values. r=tjr,geckoview-reviewers,owlish
Differential Revision: https://phabricator.services.mozilla.com/D220904
-
0fb83408
by Fatih at 2024-10-02T19:27:24+00:00
Bug 1918202: Spoof orientation based on screen size. r=tjr
Differential Revision: https://phabricator.services.mozilla.com/D221863
6 changed files:
Changes:
dom/base/ScreenOrientation.cpp
... |
... |
@@ -626,7 +626,13 @@ void ScreenOrientation::CleanupFullscreenListener() { |
626
|
626
|
OrientationType ScreenOrientation::DeviceType(CallerType aCallerType) const {
|
627
|
627
|
if (nsContentUtils::ShouldResistFingerprinting(
|
628
|
628
|
aCallerType, GetOwnerGlobal(), RFPTarget::ScreenOrientation)) {
|
629
|
|
- return OrientationType::Landscape_primary;
|
|
629
|
+ Document* doc = GetResponsibleDocument();
|
|
630
|
+ BrowsingContext* bc = doc ? doc->GetBrowsingContext() : nullptr;
|
|
631
|
+ if (!bc) {
|
|
632
|
+ return nsRFPService::GetDefaultOrientationType();
|
|
633
|
+ }
|
|
634
|
+ CSSIntSize size = bc->GetTopInnerSizeForRFP();
|
|
635
|
+ return nsRFPService::ViewportSizeToOrientationType(size.width, size.height);
|
630
|
636
|
}
|
631
|
637
|
return mType;
|
632
|
638
|
}
|
... |
... |
@@ -634,18 +640,19 @@ OrientationType ScreenOrientation::DeviceType(CallerType aCallerType) const { |
634
|
640
|
uint16_t ScreenOrientation::DeviceAngle(CallerType aCallerType) const {
|
635
|
641
|
if (nsContentUtils::ShouldResistFingerprinting(
|
636
|
642
|
aCallerType, GetOwnerGlobal(), RFPTarget::ScreenOrientation)) {
|
637
|
|
- return 0;
|
|
643
|
+ Document* doc = GetResponsibleDocument();
|
|
644
|
+ BrowsingContext* bc = doc ? doc->GetBrowsingContext() : nullptr;
|
|
645
|
+ if (!bc) {
|
|
646
|
+ return 0;
|
|
647
|
+ }
|
|
648
|
+ CSSIntSize size = bc->GetTopInnerSizeForRFP();
|
|
649
|
+ return nsRFPService::ViewportSizeToAngle(size.width, size.height);
|
638
|
650
|
}
|
639
|
651
|
return mAngle;
|
640
|
652
|
}
|
641
|
653
|
|
642
|
654
|
OrientationType ScreenOrientation::GetType(CallerType aCallerType,
|
643
|
655
|
ErrorResult& aRv) const {
|
644
|
|
- if (nsContentUtils::ShouldResistFingerprinting(
|
645
|
|
- aCallerType, GetOwnerGlobal(), RFPTarget::ScreenOrientation)) {
|
646
|
|
- return OrientationType::Landscape_primary;
|
647
|
|
- }
|
648
|
|
-
|
649
|
656
|
Document* doc = GetResponsibleDocument();
|
650
|
657
|
BrowsingContext* bc = doc ? doc->GetBrowsingContext() : nullptr;
|
651
|
658
|
if (!bc) {
|
... |
... |
@@ -653,16 +660,17 @@ OrientationType ScreenOrientation::GetType(CallerType aCallerType, |
653
|
660
|
return OrientationType::Portrait_primary;
|
654
|
661
|
}
|
655
|
662
|
|
656
|
|
- return bc->GetCurrentOrientationType();
|
657
|
|
-}
|
658
|
|
-
|
659
|
|
-uint16_t ScreenOrientation::GetAngle(CallerType aCallerType,
|
660
|
|
- ErrorResult& aRv) const {
|
|
663
|
+ OrientationType orientation = bc->GetCurrentOrientationType();
|
661
|
664
|
if (nsContentUtils::ShouldResistFingerprinting(
|
662
|
665
|
aCallerType, GetOwnerGlobal(), RFPTarget::ScreenOrientation)) {
|
663
|
|
- return 0;
|
|
666
|
+ CSSIntSize size = bc->GetTopInnerSizeForRFP();
|
|
667
|
+ return nsRFPService::ViewportSizeToOrientationType(size.width, size.height);
|
664
|
668
|
}
|
|
669
|
+ return orientation;
|
|
670
|
+}
|
665
|
671
|
|
|
672
|
+uint16_t ScreenOrientation::GetAngle(CallerType aCallerType,
|
|
673
|
+ ErrorResult& aRv) const {
|
666
|
674
|
Document* doc = GetResponsibleDocument();
|
667
|
675
|
BrowsingContext* bc = doc ? doc->GetBrowsingContext() : nullptr;
|
668
|
676
|
if (!bc) {
|
... |
... |
@@ -670,7 +678,13 @@ uint16_t ScreenOrientation::GetAngle(CallerType aCallerType, |
670
|
678
|
return 0;
|
671
|
679
|
}
|
672
|
680
|
|
673
|
|
- return bc->GetCurrentOrientationAngle();
|
|
681
|
+ uint16_t angle = static_cast<uint16_t>(bc->GetCurrentOrientationAngle());
|
|
682
|
+ if (nsContentUtils::ShouldResistFingerprinting(
|
|
683
|
+ aCallerType, GetOwnerGlobal(), RFPTarget::ScreenOrientation)) {
|
|
684
|
+ CSSIntSize size = bc->GetTopInnerSizeForRFP();
|
|
685
|
+ return nsRFPService::ViewportSizeToAngle(size.width, size.height);
|
|
686
|
+ }
|
|
687
|
+ return angle;
|
674
|
688
|
}
|
675
|
689
|
|
676
|
690
|
ScreenOrientation::LockPermission
|
dom/base/nsGlobalWindowInner.cpp
... |
... |
@@ -7306,11 +7306,13 @@ void nsGlobalWindowInner::InitWasOffline() { mWasOffline = NS_IsOffline(); } |
7306
|
7306
|
int16_t nsGlobalWindowInner::Orientation(CallerType aCallerType) {
|
7307
|
7307
|
// GetOrientationAngle() returns 0, 90, 180 or 270.
|
7308
|
7308
|
// window.orientation returns -90, 0, 90 or 180.
|
|
7309
|
+ uint16_t screenAngle = Screen()->GetOrientationAngle();
|
7309
|
7310
|
if (nsIGlobalObject::ShouldResistFingerprinting(
|
7310
|
7311
|
aCallerType, RFPTarget::ScreenOrientation)) {
|
7311
|
|
- return 0;
|
|
7312
|
+ CSSIntSize size = mBrowsingContext->GetTopInnerSizeForRFP();
|
|
7313
|
+ screenAngle = nsRFPService::ViewportSizeToAngle(size.width, size.height);
|
7312
|
7314
|
}
|
7313
|
|
- int16_t angle = AssertedCast<int16_t>(Screen()->GetOrientationAngle());
|
|
7315
|
+ int16_t angle = AssertedCast<int16_t>(screenAngle);
|
7314
|
7316
|
return angle <= 180 ? angle : angle - 360;
|
7315
|
7317
|
}
|
7316
|
7318
|
|
dom/base/test/chrome/bug418986-1.js
... |
... |
@@ -32,9 +32,6 @@ var test = function (isContent) { |
32
|
32
|
["screen.availTop", 0],
|
33
|
33
|
["screen.width", "outerWidth"],
|
34
|
34
|
["screen.height", "outerHeight"],
|
35
|
|
- ["screen.orientation.type", "'landscape-primary'"],
|
36
|
|
- ["screen.orientation.angle", 0],
|
37
|
|
- ["screen.mozOrientation", "'landscape-primary'"],
|
38
|
35
|
["devicePixelRatio", 2],
|
39
|
36
|
];
|
40
|
37
|
|
hal/android/AndroidHal.cpp
... |
... |
@@ -79,19 +79,20 @@ void GetCurrentNetworkInformation(hal::NetworkInformation* aNetworkInfo) { |
79
|
79
|
|
80
|
80
|
static bool IsSupportedScreenOrientation(hal::ScreenOrientation aOrientation) {
|
81
|
81
|
// The Android backend only supports these orientations.
|
82
|
|
- static constexpr ScreenOrientation kSupportedOrientations[] = {
|
83
|
|
- ScreenOrientation::PortraitPrimary,
|
84
|
|
- ScreenOrientation::PortraitSecondary,
|
85
|
|
- ScreenOrientation::PortraitPrimary | ScreenOrientation::PortraitSecondary,
|
86
|
|
- ScreenOrientation::LandscapePrimary,
|
87
|
|
- ScreenOrientation::LandscapeSecondary,
|
88
|
|
- ScreenOrientation::LandscapePrimary |
|
89
|
|
- ScreenOrientation::LandscapeSecondary,
|
90
|
|
- ScreenOrientation::PortraitPrimary |
|
91
|
|
- ScreenOrientation::PortraitSecondary |
|
92
|
|
- ScreenOrientation::LandscapePrimary |
|
93
|
|
- ScreenOrientation::LandscapeSecondary,
|
94
|
|
- ScreenOrientation::Default,
|
|
82
|
+ static constexpr hal::ScreenOrientation kSupportedOrientations[] = {
|
|
83
|
+ hal::ScreenOrientation::PortraitPrimary,
|
|
84
|
+ hal::ScreenOrientation::PortraitSecondary,
|
|
85
|
+ hal::ScreenOrientation::PortraitPrimary |
|
|
86
|
+ hal::ScreenOrientation::PortraitSecondary,
|
|
87
|
+ hal::ScreenOrientation::LandscapePrimary,
|
|
88
|
+ hal::ScreenOrientation::LandscapeSecondary,
|
|
89
|
+ hal::ScreenOrientation::LandscapePrimary |
|
|
90
|
+ hal::ScreenOrientation::LandscapeSecondary,
|
|
91
|
+ hal::ScreenOrientation::PortraitPrimary |
|
|
92
|
+ hal::ScreenOrientation::PortraitSecondary |
|
|
93
|
+ hal::ScreenOrientation::LandscapePrimary |
|
|
94
|
+ hal::ScreenOrientation::LandscapeSecondary,
|
|
95
|
+ hal::ScreenOrientation::Default,
|
95
|
96
|
};
|
96
|
97
|
for (auto supportedOrientation : kSupportedOrientations) {
|
97
|
98
|
if (aOrientation == supportedOrientation) {
|
toolkit/components/resistfingerprinting/nsRFPService.cpp
... |
... |
@@ -2284,3 +2284,34 @@ Maybe<RFPTarget> nsRFPService::GetOverriddenFingerprintingSettingsForURI( |
2284
|
2284
|
|
2285
|
2285
|
return result;
|
2286
|
2286
|
}
|
|
2287
|
+
|
|
2288
|
+/* static */
|
|
2289
|
+uint16_t nsRFPService::ViewportSizeToAngle(int32_t aWidth, int32_t aHeight) {
|
|
2290
|
+#ifdef MOZ_WIDGET_ANDROID
|
|
2291
|
+ bool neutral = aHeight >= aWidth;
|
|
2292
|
+#else
|
|
2293
|
+ bool neutral = aWidth >= aHeight;
|
|
2294
|
+#endif
|
|
2295
|
+ if (neutral) {
|
|
2296
|
+ return 0;
|
|
2297
|
+ }
|
|
2298
|
+ return 90;
|
|
2299
|
+}
|
|
2300
|
+
|
|
2301
|
+/* static */
|
|
2302
|
+dom::OrientationType nsRFPService::ViewportSizeToOrientationType(
|
|
2303
|
+ int32_t aWidth, int32_t aHeight) {
|
|
2304
|
+ if (aWidth >= aHeight) {
|
|
2305
|
+ return dom::OrientationType::Landscape_primary;
|
|
2306
|
+ }
|
|
2307
|
+ return dom::OrientationType::Portrait_primary;
|
|
2308
|
+}
|
|
2309
|
+
|
|
2310
|
+/* static */
|
|
2311
|
+dom::OrientationType nsRFPService::GetDefaultOrientationType() {
|
|
2312
|
+#ifdef MOZ_WIDGET_ANDROID
|
|
2313
|
+ return dom::OrientationType::Portrait_primary;
|
|
2314
|
+#else
|
|
2315
|
+ return dom::OrientationType::Landscape_primary;
|
|
2316
|
+#endif
|
|
2317
|
+} |
toolkit/components/resistfingerprinting/nsRFPService.h
... |
... |
@@ -14,6 +14,7 @@ |
14
|
14
|
#include "mozilla/ContentBlockingLog.h"
|
15
|
15
|
#include "mozilla/gfx/Types.h"
|
16
|
16
|
#include "mozilla/TypedEnumBits.h"
|
|
17
|
+#include "mozilla/dom/ScreenOrientationBinding.h"
|
17
|
18
|
#include "js/RealmOptions.h"
|
18
|
19
|
#include "nsHashtablesFwd.h"
|
19
|
20
|
#include "nsICookieJarSettings.h"
|
... |
... |
@@ -368,6 +369,16 @@ class nsRFPService final : public nsIObserver, public nsIRFPService { |
368
|
369
|
static bool CheckSuspiciousFingerprintingActivity(
|
369
|
370
|
nsTArray<ContentBlockingLog::LogEntry>& aLogs);
|
370
|
371
|
|
|
372
|
+ // Converts the viewport size to the angle.
|
|
373
|
+ static uint16_t ViewportSizeToAngle(int32_t aWidth, int32_t aHeight);
|
|
374
|
+
|
|
375
|
+ // Converts the viewport size to the orientation type.
|
|
376
|
+ static dom::OrientationType ViewportSizeToOrientationType(int32_t aWidth,
|
|
377
|
+ int32_t aHeight);
|
|
378
|
+
|
|
379
|
+ // Returns the default orientation type for the given platform.
|
|
380
|
+ static dom::OrientationType GetDefaultOrientationType();
|
|
381
|
+
|
371
|
382
|
private:
|
372
|
383
|
nsresult Init();
|
373
|
384
|
|
|