Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(528)

Unified Diff: content/browser/site_per_process_browsertest.cc

Issue 2122023002: Cross-process frames should be notified of device scale factor changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add Mac DSF update. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/site_per_process_browsertest.cc
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 82125646ac4fa50758b58fafa5da3c3cb5029ab3..eefbcae6451cce2ebed2bb51431fcc3494113433 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -61,6 +61,7 @@
#include "third_party/WebKit/public/web/WebInputEvent.h"
#include "third_party/WebKit/public/web/WebSandboxFlags.h"
#include "ui/display/display_switches.h"
+#include "ui/display/screen.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/gfx/geometry/point.h"
@@ -589,13 +590,16 @@ void SitePerProcessBrowserTest::SetUpOnMainThread() {
class SitePerProcessHighDPIBrowserTest : public SitePerProcessBrowserTest {
public:
+ const double kDeviceScaleFactor = 2.0;
+
SitePerProcessHighDPIBrowserTest() {}
protected:
void SetUpCommandLine(base::CommandLine* command_line) override {
SitePerProcessBrowserTest::SetUpCommandLine(command_line);
- command_line->AppendSwitchASCII(switches::kForceDeviceScaleFactor,
- base::StringPrintf("2"));
+ command_line->AppendSwitchASCII(
+ switches::kForceDeviceScaleFactor,
+ base::StringPrintf("%f", kDeviceScaleFactor));
}
};
@@ -613,6 +617,93 @@ class SitePerProcessIgnoreCertErrorsBrowserTest
}
};
+double GetFrameDeviceScaleFactor(const ToRenderFrameHost& adapter) {
+ double device_scale_factor;
+ const char kGetFrameDeviceScaleFactor[] =
+ "window.domAutomationController.send(window.devicePixelRatio);";
+ EXPECT_TRUE(ExecuteScriptAndExtractDouble(adapter, kGetFrameDeviceScaleFactor,
+ &device_scale_factor));
+ return device_scale_factor;
+}
+
+IN_PROC_BROWSER_TEST_F(SitePerProcessHighDPIBrowserTest,
+ SubframeLoadsWithCorrectDeviceScaleFactor) {
+ GURL main_url(embedded_test_server()->GetURL(
+ "a.com", "/cross_site_iframe_factory.html?a(b)"));
+ NavigateToURL(shell(), main_url);
+
+ EXPECT_EQ(SitePerProcessHighDPIBrowserTest::kDeviceScaleFactor,
+ GetFrameDeviceScaleFactor(web_contents()));
+
+ FrameTreeNode* root = web_contents()->GetFrameTree()->root();
+ FrameTreeNode* child = root->child_at(0);
+ EXPECT_EQ(SitePerProcessHighDPIBrowserTest::kDeviceScaleFactor,
+ GetFrameDeviceScaleFactor(child));
+}
+
+class DisplayMetricsChangedObserver : public display::DisplayObserver {
+ public:
+ DisplayMetricsChangedObserver(uint32_t metrics_flags)
+ : metrics_flags_(metrics_flags), device_scale_factor_changed_(false) {}
+
+ void OnDisplayAdded(const display::Display&) override {}
+ void OnDisplayRemoved(const display::Display&) override {}
+
+ void OnDisplayMetricsChanged(const display::Display& display,
+ uint32_t changed_metrics) override {
+ if ((changed_metrics & metrics_flags_) == metrics_flags_) {
+ device_scale_factor_changed_ = true;
+
+ if (!message_loop_runner_)
+ return;
+
+ message_loop_runner_->Quit();
+ }
+ }
+
+ void WaitForDeviceScaleFactorChanged() {
+ if (device_scale_factor_changed_)
+ return;
+
+ message_loop_runner_ = new MessageLoopRunner;
+ message_loop_runner_->Run();
+ }
+
+ private:
+ uint32_t metrics_flags_;
+ bool device_scale_factor_changed_;
+ scoped_refptr<MessageLoopRunner> message_loop_runner_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayMetricsChangedObserver);
+};
+
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+ DeviceScaleFactorChangePropagatesToAllFrames) {
+ GURL main_url(embedded_test_server()->GetURL(
+ "a.com", "/cross_site_iframe_factory.html?a(b)"));
+ NavigateToURL(shell(), main_url);
+
+ EXPECT_EQ(1.0, GetFrameDeviceScaleFactor(web_contents()));
+
+ FrameTreeNode* root = web_contents()->GetFrameTree()->root();
+ FrameTreeNode* child = root->child_at(0);
+ EXPECT_EQ(1.0, GetFrameDeviceScaleFactor(child));
+
+ display::Screen* screen = display::Screen::GetScreen();
+
+ float new_device_scale_factor = 2.5f;
+ {
+ DisplayMetricsChangedObserver observer(
+ display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR);
+ screen->AddObserver(&observer);
+ screen->SetDeviceScaleFactorForTest(new_device_scale_factor);
+ observer.WaitForDeviceScaleFactorChanged();
+ screen->RemoveObserver(&observer);
+ }
+ EXPECT_EQ(new_device_scale_factor, GetFrameDeviceScaleFactor(web_contents()));
+ EXPECT_EQ(new_device_scale_factor, GetFrameDeviceScaleFactor(child));
+}
+
// Ensure that navigating subframes in --site-per-process mode works and the
// correct documents are committed.
#if defined(OS_WIN)

Powered by Google App Engine
This is Rietveld 408576698