Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 41c05550 authored by Carmelo Messina's avatar Carmelo Messina
Browse files

final version

parent c7e04c56
Loading
Loading
Loading
Loading
+78 −10
Original line number Diff line number Diff line
@@ -2,6 +2,10 @@ From: uazo <uazo@users.noreply.github.com>
Date: Thu, 30 Jun 2022 12:47:17 +0000
Subject: Viewport Protection

Scale the viewport by a random factor to prevent coordinate-based fingerprinting scripts.
The factor is changed at each change of origin.
It acts on the javascript api to prevent the possibility of value recovery.
The feature is controlled by a site setting (default disabled)
---
 .../browser_ui/site_settings/android/BUILD.gn |  3 +
 .../BromiteCustomContentSettingImpl.java      |  1 +
@@ -21,18 +25,19 @@ Subject: Viewport Protection
 .../renderer/content_settings_agent_impl.cc   |  9 ++
 .../renderer/content_settings_agent_impl.h    |  1 +
 .../platform/web_content_settings_client.h    |  2 +
 .../blink/renderer/core/css/media_values.cc   | 10 +++
 .../blink/renderer/core/css/media_values.cc   | 22 ++++-
 .../core/frame/dom_visual_viewport.cc         |  4 +-
 .../renderer/core/frame/local_dom_window.cc   |  6 ++
 .../renderer/core/frame/local_frame_view.cc   |  3 +
 .../blink/renderer/core/frame/screen.cc       | 17 +++-
 .../renderer/core/frame/visual_viewport.cc    |  4 +
 .../renderer/core/frame/visual_viewport.h     |  5 ++
 .../renderer/core/html/html_meta_element.cc   | 28 +++++-
 .../renderer/core/loader/frame_loader.cc      |  7 +-
 .../renderer/core/loader/frame_loader.cc      | 15 +++-
 third_party/blink/renderer/core/page/page.cc  |  8 ++
 third_party/blink/renderer/core/page/page.h   |  3 +
 .../screen_enumeration/screen_detailed.cc     | 15 ++++
 29 files changed, 250 insertions(+), 13 deletions(-)
 30 files changed, 275 insertions(+), 14 deletions(-)
 create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteViewportContentSetting.java
 create mode 100644 components/browser_ui/strings/android/viewport.grdp

@@ -341,7 +346,7 @@ diff --git a/components/content_settings/core/common/content_settings_types.h b/
diff --git a/components/content_settings/renderer/content_settings_agent_impl.cc b/components/content_settings/renderer/content_settings_agent_impl.cc
--- a/components/content_settings/renderer/content_settings_agent_impl.cc
+++ b/components/content_settings/renderer/content_settings_agent_impl.cc
@@ -473,6 +473,15 @@ bool ContentSettingsAgentImpl::AllowWebRTC(bool enabled_per_settings) {
@@ -467,6 +467,15 @@ bool ContentSettingsAgentImpl::AllowWebRTC(bool enabled_per_settings) {
              url::Origin(frame->GetDocument().GetSecurityOrigin()).GetURL());
 }
 
@@ -360,7 +365,7 @@ diff --git a/components/content_settings/renderer/content_settings_agent_impl.cc
diff --git a/components/content_settings/renderer/content_settings_agent_impl.h b/components/content_settings/renderer/content_settings_agent_impl.h
--- a/components/content_settings/renderer/content_settings_agent_impl.h
+++ b/components/content_settings/renderer/content_settings_agent_impl.h
@@ -96,6 +96,7 @@ class ContentSettingsAgentImpl
@@ -101,6 +101,7 @@ class ContentSettingsAgentImpl
   bool ShouldAutoupgradeMixedContent() override;
   bool AllowWebgl(bool enabled_per_settings) override;
   bool AllowWebRTC(bool enabled_per_settings) override;
@@ -383,7 +388,32 @@ diff --git a/third_party/blink/public/platform/web_content_settings_client.h b/t
diff --git a/third_party/blink/renderer/core/css/media_values.cc b/third_party/blink/renderer/core/css/media_values.cc
--- a/third_party/blink/renderer/core/css/media_values.cc
+++ b/third_party/blink/renderer/core/css/media_values.cc
@@ -193,6 +193,11 @@ int MediaValues::CalculateDeviceWidth(LocalFrame* frame) {
@@ -132,13 +132,23 @@ double MediaValues::CalculateViewportWidth(LocalFrame* frame) {
   DCHECK(frame);
   DCHECK(frame->View());
   DCHECK(frame->GetDocument());
-  return frame->View()->ViewportSizeForMediaQueries().width();
+  float width_override = frame->GetPage()->PageWidthOverride();
+  double width = frame->View()->ViewportSizeForMediaQueries().width();
+  if (width_override) {
+    width = width * (1.0 - (width_override / 100.0));
+  }
+  return width;
 }
 
 double MediaValues::CalculateViewportHeight(LocalFrame* frame) {
   DCHECK(frame);
   DCHECK(frame->View());
   DCHECK(frame->GetDocument());
+  float width_override = frame->GetPage()->PageWidthOverride();
+  double height = frame->View()->ViewportSizeForMediaQueries().height();
+  if (width_override) {
+    height = height * (1.0 - (width_override / 100.0));
+  }
   return frame->View()->ViewportSizeForMediaQueries().height();
 }
 
@@ -193,6 +203,11 @@ int MediaValues::CalculateDeviceWidth(LocalFrame* frame) {
     device_width = static_cast<int>(
         lroundf(device_width * screen_info.device_scale_factor));
   }
@@ -395,7 +425,7 @@ diff --git a/third_party/blink/renderer/core/css/media_values.cc b/third_party/b
   return device_width;
 }
 
@@ -205,6 +210,11 @@ int MediaValues::CalculateDeviceHeight(LocalFrame* frame) {
@@ -205,6 +220,11 @@ int MediaValues::CalculateDeviceHeight(LocalFrame* frame) {
     device_height = static_cast<int>(
         lroundf(device_height * screen_info.device_scale_factor));
   }
@@ -422,6 +452,29 @@ diff --git a/third_party/blink/renderer/core/frame/dom_visual_viewport.cc b/thir
 
   return 0;
 }
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1400,6 +1400,9 @@ int LocalDOMWindow::outerHeight() const {
   if (!page)
     return 0;
 
+  float width_override = page->PageWidthOverride();
+  if (width_override) return innerHeight();
+
   ChromeClient& chrome_client = page->GetChromeClient();
   if (page->GetSettings().GetReportScreenSizeInPhysicalPixelsQuirk()) {
     return static_cast<int>(
@@ -1425,6 +1428,9 @@ int LocalDOMWindow::outerWidth() const {
   if (!page)
     return 0;
 
+  float width_override = page->PageWidthOverride();
+  if (width_override) return innerWidth();
+
   ChromeClient& chrome_client = page->GetChromeClient();
   if (page->GetSettings().GetReportScreenSizeInPhysicalPixelsQuirk()) {
     return static_cast<int>(
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -565,7 +618,7 @@ diff --git a/third_party/blink/renderer/core/html/html_meta_element.cc b/third_p
+
+    if (settings->AllowViewportChange(false)) {
+      if (page->PageWidthOverride() == 0) {
+        page->SetPageWidthOverride(base::RandInt(-5, 15));
+        page->SetPageWidthOverride(base::RandInt(-30, 150) / 100.0);
+      }
+
+      float device_width = 1.0 + (page->PageWidthOverride() / 100.0);
@@ -596,7 +649,7 @@ diff --git a/third_party/blink/renderer/core/html/html_meta_element.cc b/third_p
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -371,8 +371,11 @@ void FrameLoader::SaveScrollState() {
@@ -371,8 +371,13 @@ void FrameLoader::SaveScrollState() {
   history_item->SetVisualViewportScrollOffset(
       frame_->GetPage()->GetVisualViewport().VisibleRect().OffsetFromOrigin());
 
@@ -604,12 +657,27 @@ diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_part
-    history_item->SetPageScaleFactor(frame_->GetPage()->PageScaleFactor());
+  if (frame_->IsMainFrame()) {
+    int page_width_override = frame_->GetPage()->PageWidthOverride();
+    if (page_width_override == 0)
+    if (page_width_override == 0) {
+      // set the scale factor only if the feature is not active
+      history_item->SetPageScaleFactor(frame_->GetPage()->PageScaleFactor());
+    }
+  }
 
   Client()->DidUpdateCurrentHistoryItem();
 }
@@ -1326,6 +1331,12 @@ void FrameLoader::RestoreScrollPositionAndViewState() {
       !GetDocumentLoader()->NavigationScrollAllowed()) {
     return;
   }
+  int page_width_override = frame_->GetPage()->PageWidthOverride();
+  if (page_width_override != 0) {
+    // we need to reset the page scale because, if the user activates
+    // the feature, it could be non-zero from the previous navigation
+    GetDocumentLoader()->GetHistoryItem()->SetPageScaleFactor(0);
+  }
   RestoreScrollPositionAndViewState(
       GetDocumentLoader()->LoadType(),
       *GetDocumentLoader()->GetHistoryItem()->GetViewState(),
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc