#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());
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();
EXPECT_DOUBLE_EQ(host_zoom_level,
host_zoom_map_impl_->GetZoomLevel(web_contents));
host_zoom_map_impl_->SetTemporaryZoomLevel(rfh_id, temp_zoom_level);
EXPECT_DOUBLE_EQ(temp_zoom_level,
host_zoom_map_impl_->GetZoomLevel(web_contents));
host_zoom_map_impl_->ClearTemporaryZoomLevel(rfh_id);
}
GURL url_;
base::test::ScopedFeatureList feature_list_;
raw_ptr<HostZoomMapImpl, DanglingUntriaged> host_zoom_map_impl_;
};
#if BUILDFLAG(IS_ANDROID)
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
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);
}
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)
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTestWithPageZoom,
GetZoomLevelForHostAndScheme) {
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));
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));
}
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTestWithRDS,
GetZoomLevelForHostAndScheme) {
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));
shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->SetIsOverridingUserAgent(true);
is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
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));
}
IN_PROC_BROWSER_TEST_F(HostZoomMapImplBrowserTestWithPageZoomAndRDS,
GetZoomLevelForHostAndScheme) {
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));
shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->SetIsOverridingUserAgent(true);
is_overriding_user_agent = shell()
->web_contents()
->GetController()
.GetLastCommittedEntry()
->GetIsOverridingUserAgent();
host_zoom_map_impl_->SetSystemFontScaleForTesting(1.3);
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
}