Skip to content

Commit

Permalink
{M103 PICK} [Fix UserAgentReduction Policy] (2) Fix GetProductAndVersion
Browse files Browse the repository at this point in the history
This resolves an issue where the user agent reduction enterprise policy
is not respected due to GetProductAndVersion only checking the feature.
The policy is propagated from
ChromeContentBrowserClient::GetUserAgentBasedOnPolicy downward.
The specific issue is tested in UserAgentUtilsTest::GetProductAndVersion
under item 4c (policy force disabled overrides the feature being
enabled).

This CL is part of a series:
(1) Make ForceMajorVersionToMinorPosition a class enum
(2) Fix GetProductAndVersion

(cherry picked from commit 8bb92c3)

Bug: 1330588
Change-Id: I6f2dfcf8ea9e9c217c1562f4efca2df24de613f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3684269
Auto-Submit: Ari Chivukula <arichiv@chromium.org>
Reviewed-by: Victor Tan <victortan@chromium.org>
Commit-Queue: Ari Chivukula <arichiv@chromium.org>
Quick-Run: Ari Chivukula <arichiv@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1010140}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3687390
Cr-Commit-Position: refs/branch-heads/5060@{#636}
Cr-Branched-From: b83393d-refs/heads/main@{#1002911}
  • Loading branch information
arichiv authored and Chromium LUCI CQ committed Jun 7, 2022
1 parent 372115c commit 6aa377d
Show file tree
Hide file tree
Showing 8 changed files with 250 additions and 77 deletions.
44 changes: 18 additions & 26 deletions chrome/browser/chrome_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1364,7 +1364,8 @@ void ChromeContentBrowserClient::RegisterProfilePrefs(
enterprise::content::kCopyPreventionSettings);
registry->RegisterIntegerPref(
prefs::kUserAgentReduction,
UserAgentReductionEnterprisePolicyState::kDefault);
static_cast<int>(
embedder_support::UserAgentReductionEnterprisePolicyState::kDefault));
registry->RegisterBooleanPref(prefs::kOriginAgentClusterDefaultEnabled, true);
registry->RegisterIntegerPref(
prefs::kForceMajorVersionToMinorPositionInUserAgent,
Expand Down Expand Up @@ -5913,18 +5914,26 @@ std::string ChromeContentBrowserClient::GetUserAgent() {

std::string ChromeContentBrowserClient::GetUserAgentBasedOnPolicy(
content::BrowserContext* context) {
const PrefService* prefs = Profile::FromBrowserContext(context)->GetPrefs();
embedder_support::ForceMajorVersionToMinorPosition
force_major_version_to_minor = embedder_support::GetMajorToMinorFromPrefs(
Profile::FromBrowserContext(context)->GetPrefs());
switch (GetUserAgentReductionEnterprisePolicyState(context)) {
case UserAgentReductionEnterprisePolicyState::kForceDisabled:
return embedder_support::GetFullUserAgent(force_major_version_to_minor);
case UserAgentReductionEnterprisePolicyState::kForceEnabled:
force_major_version_to_minor =
embedder_support::GetMajorToMinorFromPrefs(prefs);
embedder_support::UserAgentReductionEnterprisePolicyState
user_agent_reduction =
embedder_support::GetUserAgentReductionFromPrefs(prefs);
switch (user_agent_reduction) {
case embedder_support::UserAgentReductionEnterprisePolicyState::
kForceDisabled:
return embedder_support::GetFullUserAgent(force_major_version_to_minor,
user_agent_reduction);
case embedder_support::UserAgentReductionEnterprisePolicyState::
kForceEnabled:
return embedder_support::GetReducedUserAgent(
force_major_version_to_minor);
case UserAgentReductionEnterprisePolicyState::kDefault:
case embedder_support::UserAgentReductionEnterprisePolicyState::kDefault:
default:
return embedder_support::GetUserAgent(force_major_version_to_minor);
return embedder_support::GetUserAgent(force_major_version_to_minor,
user_agent_reduction);
}
}

Expand Down Expand Up @@ -6477,23 +6486,6 @@ bool ChromeContentBrowserClient::ShouldPreconnectNavigation(
*Profile::FromBrowserContext(browser_context)->GetPrefs());
}

ChromeContentBrowserClient::UserAgentReductionEnterprisePolicyState
ChromeContentBrowserClient::GetUserAgentReductionEnterprisePolicyState(
content::BrowserContext* context) {
int policy = Profile::FromBrowserContext(context)->GetPrefs()->GetInteger(
prefs::kUserAgentReduction);
switch (policy) {
case 0:
return UserAgentReductionEnterprisePolicyState::kDefault;
case 1:
return UserAgentReductionEnterprisePolicyState::kForceDisabled;
case 2:
return UserAgentReductionEnterprisePolicyState::kForceEnabled;
}

return UserAgentReductionEnterprisePolicyState::kDefault;
}

bool ChromeContentBrowserClient::ShouldDisableOriginAgentClusterDefault(
content::BrowserContext* browser_context) {
// The enterprise policy for kOriginAgentClusterDefaultEnabled defaults to
Expand Down
9 changes: 0 additions & 9 deletions chrome/browser/chrome_content_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -784,12 +784,6 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
bool ShouldPreconnectNavigation(
content::BrowserContext* browser_context) override;

enum UserAgentReductionEnterprisePolicyState {
kDefault = 0,
kForceDisabled = 1,
kForceEnabled = 2,
};

bool ShouldDisableOriginAgentClusterDefault(
content::BrowserContext* browser_context) override;

Expand Down Expand Up @@ -889,9 +883,6 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
std::unique_ptr<ScopedKeepAlive> keep_alive_handle);
#endif

UserAgentReductionEnterprisePolicyState
GetUserAgentReductionEnterprisePolicyState(content::BrowserContext* context);

// Vector of additional ChromeContentBrowserClientParts.
// Parts are deleted in the reverse order they are added.
std::vector<ChromeContentBrowserClientParts*> extra_parts_;
Expand Down
19 changes: 12 additions & 7 deletions chrome/browser/user_agent/user_agent_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
namespace policy {

using ReductionPolicyState =
ChromeContentBrowserClient::UserAgentReductionEnterprisePolicyState;
embedder_support::UserAgentReductionEnterprisePolicyState;
using ForceMajorVersionToMinorPolicyState =
embedder_support::ForceMajorVersionToMinorPosition;

Expand All @@ -48,14 +48,15 @@ class UserAgentBrowserTest : public InProcessBrowserTest,
InProcessBrowserTest::SetUp();
}

void set_user_agent_reduction_policy(int policy) {
void set_user_agent_reduction_policy(ReductionPolicyState policy) {
browser()->profile()->GetPrefs()->SetInteger(prefs::kUserAgentReduction,
policy);
static_cast<int>(policy));
}

int user_agent_reduction_policy() {
return browser()->profile()->GetPrefs()->GetInteger(
prefs::kUserAgentReduction);
ReductionPolicyState user_agent_reduction_policy() {
return static_cast<ReductionPolicyState>(
browser()->profile()->GetPrefs()->GetInteger(
prefs::kUserAgentReduction));
}

void set_force_major_version_to_minor_policy(
Expand Down Expand Up @@ -90,7 +91,11 @@ IN_PROC_BROWSER_TEST_P(UserAgentBrowserTest, EnterprisePolicyInitialized) {
IN_PROC_BROWSER_TEST_P(UserAgentBrowserTest, ReductionPolicyDisabled) {
set_user_agent_reduction_policy(ReductionPolicyState::kForceDisabled);
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), empty_url()));
EXPECT_EQ(observed_user_agent(), embedder_support::GetFullUserAgent());
EXPECT_EQ(observed_user_agent(),
embedder_support::GetFullUserAgent(
embedder_support::ForceMajorVersionToMinorPosition::kDefault,
embedder_support::UserAgentReductionEnterprisePolicyState::
kForceDisabled));
}

IN_PROC_BROWSER_TEST_P(UserAgentBrowserTest, ReductionPolicyEnabled) {
Expand Down
4 changes: 4 additions & 0 deletions components/embedder_support/pref_names.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ const char kAlternateErrorPagesEnabled[] = "alternate_error_pages.enabled";
const char kForceMajorVersionToMinorPosition[] =
"force_major_version_to_minor_position_in_user_agent";

// Enum indicating if the user agent reduction feature should be forced enabled
// or disabled. Defaults to blink::features::kReduceUserAgentMinorVersion trial.
const char kReduceUserAgentMinorVersion[] = "user_agent_reduction";

} // namespace embedder_support
1 change: 1 addition & 0 deletions components/embedder_support/pref_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ namespace embedder_support {

extern const char kAlternateErrorPagesEnabled[];
extern const char kForceMajorVersionToMinorPosition[];
extern const char kReduceUserAgentMinorVersion[];

} // namespace embedder_support

Expand Down
47 changes: 38 additions & 9 deletions components/embedder_support/user_agent_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,18 @@ bool ShouldForceMajorVersionToMinorPosition(
force_major_to_minor == ForceMajorVersionToMinorPosition::kForceEnabled);
}

// Returns true if the user agent reduction should be forced (or prevented).
// TODO(crbug.com/1330890): Remove this method along with policy.
bool ShouldReduceUserAgentMinorVersion(
UserAgentReductionEnterprisePolicyState user_agent_reduction) {
return ((user_agent_reduction !=
UserAgentReductionEnterprisePolicyState::kForceDisabled &&
base::FeatureList::IsEnabled(
blink::features::kReduceUserAgentMinorVersion)) ||
user_agent_reduction ==
UserAgentReductionEnterprisePolicyState::kForceEnabled);
}

const std::string& GetMajorInMinorVersionNumber() {
static const base::NoDestructor<std::string> version_number([] {
base::Version version(version_info::GetVersionNumber());
Expand Down Expand Up @@ -330,18 +342,17 @@ std::string GetMajorVersionForUserAgentString(
} // namespace

std::string GetProductAndVersion(
ForceMajorVersionToMinorPosition force_major_to_minor) {
ForceMajorVersionToMinorPosition force_major_to_minor,
UserAgentReductionEnterprisePolicyState user_agent_reduction) {
if (ShouldForceMajorVersionToMinorPosition(force_major_to_minor)) {
// Force major version to 99 and major version to minor version position.
if (base::FeatureList::IsEnabled(
blink::features::kReduceUserAgentMinorVersion)) {
if (ShouldReduceUserAgentMinorVersion(user_agent_reduction)) {
return "Chrome/" + GetReducedMajorInMinorVersionNumber();
} else {
return "Chrome/" + GetMajorInMinorVersionNumber();
}
} else {
if (base::FeatureList::IsEnabled(
blink::features::kReduceUserAgentMinorVersion)) {
if (ShouldReduceUserAgentMinorVersion(user_agent_reduction)) {
return version_info::GetProductNameAndVersionForReducedUserAgent(
blink::features::kUserAgentFrozenBuildVersion.Get().data());
} else {
Expand All @@ -351,7 +362,8 @@ std::string GetProductAndVersion(
}

std::string GetUserAgent(
ForceMajorVersionToMinorPosition force_major_to_minor) {
ForceMajorVersionToMinorPosition force_major_to_minor,
UserAgentReductionEnterprisePolicyState user_agent_reduction) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(kUserAgent)) {
std::string ua = command_line->GetSwitchValueASCII(kUserAgent);
Expand All @@ -366,7 +378,7 @@ std::string GetUserAgent(
if (base::FeatureList::IsEnabled(blink::features::kReduceUserAgent))
return GetReducedUserAgent(force_major_to_minor);

return GetFullUserAgent(force_major_to_minor);
return GetFullUserAgent(force_major_to_minor, user_agent_reduction);
}

std::string GetReducedUserAgent(
Expand All @@ -378,8 +390,10 @@ std::string GetReducedUserAgent(
}

std::string GetFullUserAgent(
ForceMajorVersionToMinorPosition force_major_to_minor) {
std::string product = GetProductAndVersion(force_major_to_minor);
ForceMajorVersionToMinorPosition force_major_to_minor,
UserAgentReductionEnterprisePolicyState user_agent_reduction) {
std::string product =
GetProductAndVersion(force_major_to_minor, user_agent_reduction);
#if BUILDFLAG(IS_ANDROID)
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUseMobileUserAgent))
Expand Down Expand Up @@ -615,4 +629,19 @@ embedder_support::ForceMajorVersionToMinorPosition GetMajorToMinorFromPrefs(
}
}

embedder_support::UserAgentReductionEnterprisePolicyState
GetUserAgentReductionFromPrefs(const PrefService* pref_service) {
if (!pref_service->HasPrefPath(kReduceUserAgentMinorVersion))
return UserAgentReductionEnterprisePolicyState::kDefault;
switch (pref_service->GetInteger(kReduceUserAgentMinorVersion)) {
case 1:
return UserAgentReductionEnterprisePolicyState::kForceDisabled;
case 2:
return UserAgentReductionEnterprisePolicyState::kForceEnabled;
case 0:
default:
return UserAgentReductionEnterprisePolicyState::kDefault;
}
}

} // namespace embedder_support
28 changes: 24 additions & 4 deletions components/embedder_support/user_agent_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ enum class ForceMajorVersionToMinorPosition {
kForceEnabled = 2,
};

// TODO(crbug.com/1330890): Remove this enum along with policy.
enum class UserAgentReductionEnterprisePolicyState {
kDefault = 0,
kForceDisabled = 1,
kForceEnabled = 2,
};

struct UserAgentOptions {
bool force_major_version_100 = false;
ForceMajorVersionToMinorPosition force_major_to_minor =
Expand All @@ -43,13 +50,17 @@ struct UserAgentOptions {
// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
std::string GetProductAndVersion(
ForceMajorVersionToMinorPosition force_major_to_minor =
ForceMajorVersionToMinorPosition::kDefault);
ForceMajorVersionToMinorPosition::kDefault,
UserAgentReductionEnterprisePolicyState user_agent_reduction =
UserAgentReductionEnterprisePolicyState::kDefault);

// Returns the user agent string for Chrome.
// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
std::string GetFullUserAgent(
ForceMajorVersionToMinorPosition force_major_to_minor =
ForceMajorVersionToMinorPosition::kDefault);
ForceMajorVersionToMinorPosition::kDefault,
UserAgentReductionEnterprisePolicyState user_agent_reduction =
UserAgentReductionEnterprisePolicyState::kDefault);

// Returns the reduced user agent string for Chrome.
// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
Expand All @@ -60,8 +71,11 @@ std::string GetReducedUserAgent(
// Returns the full or "reduced" user agent string, depending on the
// UserAgentReduction enterprise policy and blink::features::kReduceUserAgent
// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
std::string GetUserAgent(ForceMajorVersionToMinorPosition force_major_to_minor =
ForceMajorVersionToMinorPosition::kDefault);
std::string GetUserAgent(
ForceMajorVersionToMinorPosition force_major_to_minor =
ForceMajorVersionToMinorPosition::kDefault,
UserAgentReductionEnterprisePolicyState user_agent_reduction =
UserAgentReductionEnterprisePolicyState::kDefault);

// Returns UserAgentMetadata per the default policy.
// This override is currently used in fuchsia, where the enterprise policy
Expand Down Expand Up @@ -114,6 +128,12 @@ int GetHighestKnownUniversalApiContractVersionForTesting();
embedder_support::ForceMajorVersionToMinorPosition GetMajorToMinorFromPrefs(
const PrefService* pref_service);

// Returns the UserAgentReductionEnterprisePolicyState enum value corresponding
// to the provided integer policy value for UserAgentReduction.
// TODO(crbug.com/1330890): Remove this function with policy.
embedder_support::UserAgentReductionEnterprisePolicyState
GetUserAgentReductionFromPrefs(const PrefService* pref_service);

} // namespace embedder_support

#endif // COMPONENTS_EMBEDDER_SUPPORT_USER_AGENT_UTILS_H_

0 comments on commit 6aa377d

Please sign in to comment.