blob: 3ae1b2b2bb3bef49ebe2fe1b02f927e3c67734d3 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/memory/raw_ptr.h"
#include "base/metrics/field_trial_params.h"
#include "base/test/scoped_feature_list.h"
#include "content/browser/host_zoom_map_impl.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/shell/browser/shell.h"
#include "net/dns/mock_host_resolver.h"
#include "url/gurl.h"
namespace content {
class HostZoomMapImplBrowserTest : public ContentBrowserTest {
protected:
void SetUpOnMainThread() override {
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->Start());
// We must navigate so the WebContents has a committed entry.
url_ = GURL(embedded_test_server()->GetURL("abc.com", "/title1.html"));
EXPECT_TRUE(NavigateToURL(shell(), url_));
host_zoom_map_impl_ = static_cast<HostZoomMapImpl*>(
HostZoomMap::GetForWebContents(shell()->web_contents()));
}
void RunTestForURL(double host_zoom_level, double temp_zoom_level) {
WebContents* web_contents = shell()->web_contents();
GlobalRenderFrameHostId rfh_id =
web_contents->GetPrimaryMainFrame()->GetGlobalId();
// Assume caller has set the zoom level to |host_zoom_level| using
// either a host or host+scheme entry in the HostZoomMap prior to
// calling this function.
EXPECT_DOUBLE_EQ(host_zoom_level,
host_zoom_map_impl_->GetZoomLevel(web_contents));
// Make sure that GetZoomLevel() works for temporary zoom levels.
host_zoom_map_impl_->SetTemporaryZoomLevel(rfh_id, temp_zoom_level);
EXPECT_DOUBLE_EQ(temp_zoom_level,
host_zoom_map_impl_->GetZoomLevel(web_contents));
// Clear the temporary zoom level in case subsequent test calls use the same
// web_contents.
host_zoom_map_impl_->ClearTemporaryZoomLevel(rfh_id);
}
// Placeholder GURL to give WebContents instances a committed entry.
GURL url_;
// Customizable set of Features used for Android-specific tests.
base::test::ScopedFeatureList feature_list_;
// Instance of HostZoomMapImpl for convenience in tests.
raw_ptr<HostZoomMapImpl, DanglingUntriaged> host_zoom_map_impl_;
};
#if BUILDFLAG(IS_ANDROID)
// For Android, there are experimental features that affect the value of zoom.
// These classes allow easy testing of the combination of enabled features.
class HostZoomMapImplBrowserTestWithPageZoom
: public HostZoomMapImplBrowserTest {
public:
HostZoomMapImplBrowserTestWithPageZoom() {
feature_list_.InitAndEnableFeature(features::kAccessibilityPageZoom);
}
};
class HostZoomMapImplBrowserTestWithRDS : public HostZoomMapImplBrowserTest {
public:
HostZoomMapImplBrowserTestWithRDS() {
base::FieldTrialParams params{{"desktop_site_zoom_scale", "1.3"}};
feature_list_.InitAndEnableFeatureWithParameters(
features::kRequestDesktopSiteZoom, params);
}
};
class HostZoomMapImplBrowserTestWithPageZoomAndRDS
: public HostZoomMapImplBrowserTest {
public:
HostZoomMapImplBrowserTestWithPageZoomAndRDS() {
base::FieldTrialParams params{{"desktop_site_zoom_scale", "1.3"}};
base::test::FeatureRefAndParams rds{features::kRequestDesktopSiteZoom,
params};
base::test::FeatureRefAndParams page_zoom{features::kAccessibilityPageZoom,
{}};
feature_list_.InitWithFeaturesAndParameters({rds, page_zoom}, {});
}
};
#endif
// Test to make sure that GetZoomLevel() works properly for zoom levels
// stored by host value, and can distinguish temporary zoom levels from
// these.
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTest, GetZoomForView_Host) {
double default_zoom_level = host_zoom_map_impl_->GetDefaultZoomLevel();
double host_zoom_level = default_zoom_level + 1.0;
double temp_zoom_level = default_zoom_level + 2.0;
host_zoom_map_impl_->SetZoomLevelForHost(url_.host(), host_zoom_level);
RunTestForURL(host_zoom_level, temp_zoom_level);
}
// Test to make sure that GetZoomLevel() works properly for zoom levels
// stored by host and scheme values, and can distinguish temporary zoom levels
// from these.
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTest,
GetZoomForView_HostAndScheme) {
double default_zoom_level = host_zoom_map_impl_->GetDefaultZoomLevel();
double host_zoom_level = default_zoom_level + 1.0;
double temp_zoom_level = default_zoom_level + 2.0;
host_zoom_map_impl_->SetZoomLevelForHostAndScheme(url_.scheme(), url_.host(),
host_zoom_level);
RunTestForURL(host_zoom_level, temp_zoom_level);
}
#if BUILDFLAG(IS_ANDROID)
// Test to make sure that GetZoomLevelForHostAndScheme() adjusts zoom level
// when there is a non-default OS-level font size setting on Android.
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTestWithPageZoom,
GetZoomLevelForHostAndScheme) {
// At the default level, there should be no adjustment.
bool is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
EXPECT_DOUBLE_EQ(host_zoom_map_impl_->GetDefaultZoomLevel(),
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
// Test various levels of system font size.
// A scale of 1.3 is equivalent to an Android OS font size of XL.
// Zoom level will be 1.44 for exponential scale: 1.2 ^ 1.44 = 1.30.
host_zoom_map_impl_->SetSystemFontScaleForTesting(1.30);
EXPECT_DOUBLE_EQ(1.44,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
host_zoom_map_impl_->SetSystemFontScaleForTesting(0.85);
EXPECT_DOUBLE_EQ(-0.89,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
host_zoom_map_impl_->SetSystemFontScaleForTesting(1.15);
EXPECT_DOUBLE_EQ(0.77,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
}
// Test to make sure that GetZoomLevelForHostAndScheme() adjusts zoom level
// when there is an overriding user agent and the RDS zoom feature is enabled.
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTestWithRDS,
GetZoomLevelForHostAndScheme) {
// By default, the feature should not result in any adjustments.
bool is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
EXPECT_DOUBLE_EQ(host_zoom_map_impl_->GetDefaultZoomLevel(),
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
// Simulate the web contents to use the desktop user agent.
shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->SetIsOverridingUserAgent(true);
is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
// Once a desktop user agent is set, adjustments should be made. With the Page
// Zoom feature off, the value of system font size should have no impact.
EXPECT_DOUBLE_EQ(1.44,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
host_zoom_map_impl_->SetSystemFontScaleForTesting(0.85);
EXPECT_DOUBLE_EQ(1.44,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
host_zoom_map_impl_->SetSystemFontScaleForTesting(1.15);
EXPECT_DOUBLE_EQ(1.44,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
}
// Test to make sure that GetZoomLevelForHostAndScheme() adjusts zoom level
// when both Page Zoom and an overriding user agent with RDS are enabled.
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTestWithPageZoomAndRDS,
GetZoomLevelForHostAndScheme) {
bool is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
// By default, the features should not result in any adjustments.
EXPECT_DOUBLE_EQ(host_zoom_map_impl_->GetDefaultZoomLevel(),
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
// Simulate the web contents to use the desktop user agent.
shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->SetIsOverridingUserAgent(true);
is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
// Simulate a system font scale factor of 1.3.
host_zoom_map_impl_->SetSystemFontScaleForTesting(1.3);
// These values should be multiplied, so 1.3 * 1.3 = 1.69, which gives a
// zoom level of 2.88, since 1.2 ^ 2.88 = 1.69.
EXPECT_DOUBLE_EQ(2.88,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
host_zoom_map_impl_->SetSystemFontScaleForTesting(0.85);
EXPECT_DOUBLE_EQ(0.55,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
host_zoom_map_impl_->SetSystemFontScaleForTesting(1.15);
EXPECT_DOUBLE_EQ(2.21,
host_zoom_map_impl_->GetZoomLevelForHostAndScheme(
url_.scheme(), url_.host(), is_overriding_user_agent));
}
#endif
} // namespace content