| 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
|
|
|