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

Unified Diff: content/browser/iframe_zoom_browsertest.cc

Issue 2608213003: Add browsertest that zoom is preserved on reload (Closed)
Patch Set: Created 3 years, 12 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
« no previous file with comments | « no previous file | content/browser/zoom_browsertest.cc » ('j') | content/browser/zoom_browsertest.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/iframe_zoom_browsertest.cc
diff --git a/content/browser/iframe_zoom_browsertest.cc b/content/browser/iframe_zoom_browsertest.cc
deleted file mode 100644
index 857b6f71fb1b5a3ee18f48e4a8b7b4efd092f729..0000000000000000000000000000000000000000
--- a/content/browser/iframe_zoom_browsertest.cc
+++ /dev/null
@@ -1,481 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/strings/string_util.h"
-#include "content/browser/frame_host/frame_tree_node.h"
-#include "content/browser/frame_host/render_frame_host_impl.h"
-#include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/browser/host_zoom_map.h"
-#include "content/public/browser/navigation_entry.h"
-#include "content/public/common/page_zoom.h"
-#include "content/public/test/browser_test_utils.h"
-#include "content/public/test/content_browser_test.h"
-#include "content/public/test/content_browser_test_utils.h"
-#include "content/public/test/test_navigation_observer.h"
-#include "content/shell/browser/shell.h"
-#include "content/test/content_browser_test_utils_internal.h"
-#include "net/dns/mock_host_resolver.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-namespace content {
-
-// This file contains tests to make sure that subframes zoom in a manner
-// consistent with the top-level frame, even when the subframes are cross-site.
-// Particular things we want to make sure of:
-//
-// * Subframes should always have the same zoom level as their main frame, even
-// if the subframe's domain has a different zoom level stored in HostZoomMap.
-//
-// * The condition above should continue to hold after a navigation of the
-// subframe.
-//
-// * Zoom changes applied to the mainframe should propagate to all subframes,
-// regardless of whether they are same site or cross-site to the frame they are
-// children of.
-//
-// The tests in this file rely on the notion that, when a page zooms, that
-// subframes have both (1) a change in their frame rect, and (2) a change in
-// their frame's scale. Since the page should scale as a unit, this means the
-// innerWidth value of any subframe should be the same before and after the
-// zoom (though it may transiently take on a different value). The
-// FrameSizeObserver serves to watch for onresize events, and observes when
-// the innerWidth is correctly set.
-class IFrameZoomBrowserTest : public ContentBrowserTest {
- public:
- IFrameZoomBrowserTest() {}
-
- protected:
- void SetUpOnMainThread() override {
- host_resolver()->AddRule("*", "127.0.0.1");
- SetupCrossSiteRedirector(embedded_test_server());
- ASSERT_TRUE(embedded_test_server()->Start());
- }
-
- WebContentsImpl* web_contents() {
- return static_cast<WebContentsImpl*>(shell()->web_contents());
- }
-};
-
-namespace {
-
-const double kTolerance = 0.1; // In CSS pixels.
-
-double GetMainframeWindowBorder(const ToRenderFrameHost& adapter) {
- double border;
- const char kGetMainframeBorder[] = "window.domAutomationController.send("
- "window.outerWidth - window.innerWidth"
- ");";
- EXPECT_TRUE(
- ExecuteScriptAndExtractDouble(adapter, kGetMainframeBorder, &border));
- return border;
-}
-
-double GetMainFrameZoomFactor(const ToRenderFrameHost& adapter, double border) {
- const char kGetMainFrameZoomLevel[] =
- "window.domAutomationController.send("
- "(window.outerWidth - %f)/window.innerWidth"
- ");";
- double zoom_factor;
- EXPECT_TRUE(ExecuteScriptAndExtractDouble(
- adapter, base::StringPrintf(kGetMainFrameZoomLevel, border),
- &zoom_factor));
- return zoom_factor;
-}
-
-double GetSubframeWidth(const ToRenderFrameHost& adapter) {
- double width;
- EXPECT_TRUE(ExecuteScriptAndExtractDouble(
- adapter, "window.domAutomationController.send(window.innerWidth);",
- &width));
- return width;
-}
-
-// This struct is used to track changes to subframes after a main frame zoom
-// change, so that we can test subframe inner widths with assurance that all the
-// changes have finished propagating.
-struct FrameResizeObserver {
- FrameResizeObserver(RenderFrameHost* host,
- std::string label,
- double inner_width,
- double tolerance)
- : frame_host(host),
- msg_label(std::move(label)),
- zoomed_correctly(false),
- expected_inner_width(inner_width),
- tolerance(tolerance) {
- SetupOnResizeCallback(host, msg_label);
- }
-
- void SetupOnResizeCallback(const ToRenderFrameHost& adapter,
- const std::string& label) {
- const char kOnResizeCallbackSetup[] =
- "document.body.onresize = function(){"
- " window.domAutomationController.setAutomationId(0);"
- " window.domAutomationController.send('%s ' + window.innerWidth);"
- "};";
- EXPECT_TRUE(ExecuteScript(
- adapter, base::StringPrintf(kOnResizeCallbackSetup, label.c_str())));
- }
-
- void Check(const std::string& status_msg) {
- if (!base::StartsWith(status_msg, msg_label, base::CompareCase::SENSITIVE))
- return;
-
- double inner_width = std::stod(status_msg.substr(msg_label.length() + 1));
- zoomed_correctly = std::abs(expected_inner_width - inner_width) < tolerance;
- }
-
- FrameResizeObserver* toThis() {return this;}
-
- RenderFrameHost* frame_host;
- std::string msg_label;
- bool zoomed_correctly;
- double expected_inner_width;
- double tolerance;
-};
-
-void WaitAndCheckFrameZoom(
- DOMMessageQueue& msg_queue,
- std::vector<FrameResizeObserver>& frame_observers) {
- std::string status;
- while (msg_queue.WaitForMessage(&status)) {
- // Strip the double quotes from the message.
- status = status.substr(1, status.length() -2);
-
- bool all_zoomed_correctly = true;
-
- // Use auto& to operate on a reference, and not a copy.
- for (auto& observer : frame_observers) {
- observer.Check(status);
- all_zoomed_correctly = all_zoomed_correctly && observer.zoomed_correctly;
- }
-
- if (all_zoomed_correctly)
- break;
- }
-}
-
-} // namespace
-
-IN_PROC_BROWSER_TEST_F(IFrameZoomBrowserTest, SubframesZoomProperly) {
- std::string top_level_host("a.com");
- GURL main_url(embedded_test_server()->GetURL(
- top_level_host, "/cross_site_iframe_factory.html?a(b(a))"));
- EXPECT_TRUE(NavigateToURL(shell(), main_url));
- NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- ASSERT_TRUE(entry);
- GURL loaded_url = HostZoomMap::GetURLFromEntry(entry);
- EXPECT_EQ(top_level_host, loaded_url.host());
-
- FrameTreeNode* root =
- static_cast<WebContentsImpl*>(web_contents())->GetFrameTree()->root();
- RenderFrameHostImpl* child = root->child_at(0)->current_frame_host();
- RenderFrameHostImpl* grandchild =
- root->child_at(0)->child_at(0)->current_frame_host();
-
- // The following calls must be made when the page's scale factor = 1.0.
- double scale_one_child_width = GetSubframeWidth(child);
- double scale_one_grandchild_width = GetSubframeWidth(grandchild);
- double main_frame_window_border = GetMainframeWindowBorder(web_contents());
-
- HostZoomMap* host_zoom_map = HostZoomMap::GetForWebContents(web_contents());
- double default_zoom_level = host_zoom_map->GetDefaultZoomLevel();
- EXPECT_EQ(0.0, default_zoom_level);
-
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-
- const double new_zoom_factor = 2.5;
- {
- DOMMessageQueue msg_queue;
-
- std::vector<FrameResizeObserver> frame_observers;
- frame_observers.emplace_back(child, "child",
- scale_one_child_width, kTolerance);
- frame_observers.emplace_back(grandchild, "grandchild",
- scale_one_grandchild_width, kTolerance);
-
- const double new_zoom_level =
- default_zoom_level + ZoomFactorToZoomLevel(new_zoom_factor);
- host_zoom_map->SetZoomLevelForHost(top_level_host, new_zoom_level);
-
- WaitAndCheckFrameZoom(msg_queue, frame_observers);
- }
-
- // Make this comparison approximate for Nexus5X test;
- // https://crbug.com/622858.
- EXPECT_NEAR(
- new_zoom_factor,
- GetMainFrameZoomFactor(web_contents(), main_frame_window_border),
- 0.01);
-}
-
-IN_PROC_BROWSER_TEST_F(IFrameZoomBrowserTest, SubframesDontZoomIndependently) {
- std::string top_level_host("a.com");
- GURL main_url(embedded_test_server()->GetURL(
- top_level_host, "/cross_site_iframe_factory.html?a(b(a))"));
- EXPECT_TRUE(NavigateToURL(shell(), main_url));
- NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- ASSERT_TRUE(entry);
- GURL loaded_url = HostZoomMap::GetURLFromEntry(entry);
- EXPECT_EQ(top_level_host, loaded_url.host());
-
- FrameTreeNode* root =
- static_cast<WebContentsImpl*>(web_contents())->GetFrameTree()->root();
- RenderFrameHostImpl* child = root->child_at(0)->current_frame_host();
- RenderFrameHostImpl* grandchild =
- root->child_at(0)->child_at(0)->current_frame_host();
-
- // The following calls must be made when the page's scale factor = 1.0.
- double scale_one_child_width = GetSubframeWidth(child);
- double scale_one_grandchild_width = GetSubframeWidth(grandchild);
- double main_frame_window_border = GetMainframeWindowBorder(web_contents());
-
- HostZoomMap* host_zoom_map = HostZoomMap::GetForWebContents(web_contents());
- double default_zoom_level = host_zoom_map->GetDefaultZoomLevel();
- EXPECT_EQ(0.0, default_zoom_level);
-
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-
- const double new_zoom_factor = 2.0;
- const double new_zoom_level =
- default_zoom_level + ZoomFactorToZoomLevel(new_zoom_factor);
-
- // This should not cause the nested iframe to change its zoom.
- host_zoom_map->SetZoomLevelForHost("b.com", new_zoom_level);
-
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
- EXPECT_EQ(scale_one_child_width, GetSubframeWidth(child));
- EXPECT_EQ(scale_one_grandchild_width, GetSubframeWidth(grandchild));
-
- // We exclude the remainder of this test on Android since Android does not
- // set page zoom levels for loading pages.
- // See RenderViewImpl::OnSetZoomLevelForLoadingURL().
-#if !defined(OS_ANDROID)
- // When we navigate so that b.com is the top-level site, then it has the
- // expected zoom.
- GURL new_url = embedded_test_server()->GetURL("b.com", "/title1.html");
- EXPECT_TRUE(NavigateToURL(shell(), new_url));
- EXPECT_DOUBLE_EQ(
- new_zoom_factor,
- GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-#endif
-}
-
-IN_PROC_BROWSER_TEST_F(IFrameZoomBrowserTest, AllFramesGetDefaultZoom) {
- std::string top_level_host("a.com");
- GURL main_url(embedded_test_server()->GetURL(
- top_level_host, "/cross_site_iframe_factory.html?a(b(a))"));
- EXPECT_TRUE(NavigateToURL(shell(), main_url));
- NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- ASSERT_TRUE(entry);
- GURL loaded_url = HostZoomMap::GetURLFromEntry(entry);
- EXPECT_EQ(top_level_host, loaded_url.host());
-
- FrameTreeNode* root =
- static_cast<WebContentsImpl*>(web_contents())->GetFrameTree()->root();
- RenderFrameHostImpl* child = root->child_at(0)->current_frame_host();
- RenderFrameHostImpl* grandchild =
- root->child_at(0)->child_at(0)->current_frame_host();
-
- // The following calls must be made when the page's scale factor = 1.0.
- double scale_one_child_width = GetSubframeWidth(child);
- double scale_one_grandchild_width = GetSubframeWidth(grandchild);
- double main_frame_window_border = GetMainframeWindowBorder(web_contents());
-
- HostZoomMap* host_zoom_map = HostZoomMap::GetForWebContents(web_contents());
- double default_zoom_level = host_zoom_map->GetDefaultZoomLevel();
- EXPECT_EQ(0.0, default_zoom_level);
-
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-
- const double new_default_zoom_factor = 2.0;
- {
- DOMMessageQueue msg_queue;
-
- std::vector<FrameResizeObserver> frame_observers;
- frame_observers.emplace_back(child, "child",
- scale_one_child_width, kTolerance);
- frame_observers.emplace_back(grandchild, "grandchild",
- scale_one_grandchild_width, kTolerance);
-
- const double new_default_zoom_level =
- default_zoom_level + ZoomFactorToZoomLevel(new_default_zoom_factor);
-
- host_zoom_map->SetZoomLevelForHost("b.com", new_default_zoom_level + 1.0);
- host_zoom_map->SetDefaultZoomLevel(new_default_zoom_level);
-
- WaitAndCheckFrameZoom(msg_queue, frame_observers);
- }
- // Make this comparison approximate for Nexus5X test;
- // https://crbug.com/622858.
- EXPECT_NEAR(
- new_default_zoom_factor,
- GetMainFrameZoomFactor(web_contents(), main_frame_window_border),
- 0.01
- );
-}
-
-IN_PROC_BROWSER_TEST_F(IFrameZoomBrowserTest, SiblingFramesZoom) {
- std::string top_level_host("a.com");
- GURL main_url(embedded_test_server()->GetURL(
- top_level_host, "/cross_site_iframe_factory.html?a(b,b)"));
- EXPECT_TRUE(NavigateToURL(shell(), main_url));
- NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- ASSERT_TRUE(entry);
- GURL loaded_url = HostZoomMap::GetURLFromEntry(entry);
- EXPECT_EQ(top_level_host, loaded_url.host());
-
- FrameTreeNode* root =
- static_cast<WebContentsImpl*>(web_contents())->GetFrameTree()->root();
- RenderFrameHostImpl* child1 = root->child_at(0)->current_frame_host();
- RenderFrameHostImpl* child2 = root->child_at(1)->current_frame_host();
-
- // The following calls must be made when the page's scale factor = 1.0.
- double scale_one_child1_width = GetSubframeWidth(child1);
- double scale_one_child2_width = GetSubframeWidth(child2);
- double main_frame_window_border = GetMainframeWindowBorder(web_contents());
-
- HostZoomMap* host_zoom_map = HostZoomMap::GetForWebContents(web_contents());
- double default_zoom_level = host_zoom_map->GetDefaultZoomLevel();
- EXPECT_EQ(0.0, default_zoom_level);
-
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-
- const double new_zoom_factor = 2.5;
- {
- DOMMessageQueue msg_queue;
-
- std::vector<FrameResizeObserver> frame_observers;
- frame_observers.emplace_back(child1, "child1",
- scale_one_child1_width, kTolerance);
- frame_observers.emplace_back(child2, "child2",
- scale_one_child2_width, kTolerance);
-
- const double new_zoom_level =
- default_zoom_level + ZoomFactorToZoomLevel(new_zoom_factor);
- host_zoom_map->SetZoomLevelForHost(top_level_host, new_zoom_level);
-
- WaitAndCheckFrameZoom(msg_queue, frame_observers);
- }
-
- // Make this comparison approximate for Nexus5X test;
- // https://crbug.com/622858.
- EXPECT_NEAR(
- new_zoom_factor,
- GetMainFrameZoomFactor(web_contents(), main_frame_window_border),
- 0.01);
-}
-
-IN_PROC_BROWSER_TEST_F(IFrameZoomBrowserTest, SubframeRetainsZoomOnNavigation) {
- std::string top_level_host("a.com");
- GURL main_url(embedded_test_server()->GetURL(
- top_level_host, "/cross_site_iframe_factory.html?a(b)"));
- EXPECT_TRUE(NavigateToURL(shell(), main_url));
- NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- ASSERT_TRUE(entry);
- GURL loaded_url = HostZoomMap::GetURLFromEntry(entry);
- EXPECT_EQ(top_level_host, loaded_url.host());
-
- FrameTreeNode* root =
- static_cast<WebContentsImpl*>(web_contents())->GetFrameTree()->root();
- RenderFrameHostImpl* child = root->child_at(0)->current_frame_host();
-
- // The following calls must be made when the page's scale factor = 1.0.
- double scale_one_child_width = GetSubframeWidth(child);
- double main_frame_window_border = GetMainframeWindowBorder(web_contents());
-
- HostZoomMap* host_zoom_map = HostZoomMap::GetForWebContents(web_contents());
- double default_zoom_level = host_zoom_map->GetDefaultZoomLevel();
- EXPECT_EQ(0.0, default_zoom_level);
-
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-
- const double new_zoom_factor = 0.5;
- {
- DOMMessageQueue msg_queue;
-
- std::vector<FrameResizeObserver> frame_observers;
- frame_observers.emplace_back(child, "child",
- scale_one_child_width, kTolerance);
-
- const double new_zoom_level =
- default_zoom_level + ZoomFactorToZoomLevel(new_zoom_factor);
- host_zoom_map->SetZoomLevelForHost(top_level_host, new_zoom_level);
-
- WaitAndCheckFrameZoom(msg_queue, frame_observers);
- }
-
- // Make this comparison approximate for Nexus5X test;
- // https://crbug.com/622858.
- EXPECT_NEAR(
- new_zoom_factor,
- GetMainFrameZoomFactor(web_contents(), main_frame_window_border),
- 0.01
- );
-
- // Navigate child frame cross site, and make sure zoom is the same.
- TestNavigationObserver observer(web_contents());
- GURL url = embedded_test_server()->GetURL("c.com", "/title1.html");
- NavigateFrameToURL(root->child_at(0), url);
- EXPECT_TRUE(observer.last_navigation_succeeded());
- EXPECT_EQ(url, observer.last_navigation_url());
-
- // Check that the child frame maintained the same scale after navigating
- // cross-site.
- double new_child_width =
- GetSubframeWidth(root->child_at(0)->current_frame_host());
- EXPECT_EQ(scale_one_child_width, new_child_width);
-}
-
-// http://crbug.com/609213
-#if !defined(OS_ANDROID)
-IN_PROC_BROWSER_TEST_F(IFrameZoomBrowserTest,
- RedirectToPageWithSubframeZoomsCorrectly) {
- std::string initial_host("a.com");
- std::string redirected_host("b.com");
- EXPECT_TRUE(NavigateToURL(shell(), GURL(embedded_test_server()->GetURL(
- initial_host, "/title2.html"))));
- double main_frame_window_border = GetMainframeWindowBorder(web_contents());
- EXPECT_DOUBLE_EQ(
- 1.0, GetMainFrameZoomFactor(web_contents(), main_frame_window_border));
-
- // Set a zoom level for b.com before we navigate to it.
- const double kZoomFactorForRedirectedHost = 1.5;
- HostZoomMap* host_zoom_map = HostZoomMap::GetForWebContents(web_contents());
- host_zoom_map->SetZoomLevelForHost(
- redirected_host, ZoomFactorToZoomLevel(kZoomFactorForRedirectedHost));
-
- // Navigation to a.com doesn't change the zoom level, but when it redirects
- // to b.com, and then a subframe loads, the zoom should change.
- GURL redirect_url(embedded_test_server()->GetURL(
- redirected_host, "/cross_site_iframe_factory.html?b(b)"));
- GURL url(embedded_test_server()->GetURL(
- initial_host, "/client-redirect?" + redirect_url.spec()));
-
- NavigateToURLBlockUntilNavigationsComplete(shell(), url, 2);
- EXPECT_TRUE(IsLastCommittedEntryOfPageType(web_contents(), PAGE_TYPE_NORMAL));
- EXPECT_EQ(redirect_url, web_contents()->GetLastCommittedURL());
-
- EXPECT_NEAR(
- kZoomFactorForRedirectedHost,
- GetMainFrameZoomFactor(web_contents(), main_frame_window_border),
- 0.001);
-}
-#endif
-
-} // namespace content
« no previous file with comments | « no previous file | content/browser/zoom_browsertest.cc » ('j') | content/browser/zoom_browsertest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698