blob: 9c1d91389722648645dd4baa8de3d1cf78706058 [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.
// This file can be empty. Its purpose is to contain the relatively short lived
// definitions required for experimental flags.
#import "ios/chrome/browser/shared/public/features/system_flags.h"
#import <Foundation/Foundation.h>
#import "base/command_line.h"
#import "base/feature_list.h"
#import "base/metrics/field_trial.h"
#import "base/strings/sys_string_conversions.h"
#import "components/autofill/core/common/autofill_switches.h"
#import "components/password_manager/core/common/password_manager_features.h"
#import "components/segmentation_platform/public/constants.h"
#import "components/variations/variations_associated_data.h"
#import "ios/chrome/browser/browsing_data/model/browsing_data_features.h"
#import "ios/chrome/browser/flags/chrome_switches.h"
#import "ios/chrome/browser/memory/model/features.h"
#import "ios/chrome/browser/safety_check/model/ios_chrome_safety_check_manager_constants.h"
#import "ios/chrome/browser/shared/public/features/features.h"
namespace {
NSString* const kAlternateDiscoverFeedServerURL =
@"AlternateDiscoverFeedServerURL";
NSString* const kEnableStartupCrash = @"EnableStartupCrash";
NSString* const kFirstRunForceEnabled = @"FirstRunForceEnabled";
NSString* const kUpgradePromoForceEnabled = @"UpgradePromoForceEnabled";
NSString* const kOriginServerHost = @"AlternateOriginServerHost";
NSString* const kWhatsNewPromoStatus = @"WhatsNewPromoStatus";
NSString* const kClearApplicationGroup = @"ClearApplicationGroup";
NSString* const kNextPromoForDisplayOverride = @"NextPromoForDisplayOverride";
NSString* const kFirstRunRecency = @"FirstRunRecency";
NSString* const kForceExperienceForDeviceSwitcherExperimentalSettings =
@"ForceExperienceForDeviceSwitcher";
NSString* const kForceExperienceForShopperExperimentalSettings =
@"ForceExperienceForShopper";
NSString* const kSafetyCheckUpdateChromeStateOverride =
@"SafetyCheckUpdateChromeStateOverride";
NSString* const kSafetyCheckPasswordStateOverride =
@"SafetyCheckPasswordStateOverride";
NSString* const kSafetyCheckSafeBrowsingStateOverride =
@"SafetyCheckSafeBrowsingStateOverride";
NSString* const kSafetyCheckWeakPasswordsCountOverride =
@"SafetyCheckWeakPasswordsCountOverride";
NSString* const kSafetyCheckReusedPasswordsCountOverride =
@"SafetyCheckReusedPasswordsCountOverride";
NSString* const kSafetyCheckCompromisedPasswordsCountOverride =
@"SafetyCheckCompromisedPasswordsCountOverride";
NSString* const kSimulatePostDeviceRestore = @"SimulatePostDeviceRestore";
NSString* const kShouldIgnoreHistorySyncDeclineLimits =
@"ShouldIgnoreHistorySyncDeclineLimits";
NSString* const kSafetyCheckNotificationsInactivityThreshold =
@"SafetyCheckNotificationsInactivityThreshold";
BASE_FEATURE(kEnableThirdPartyKeyboardWorkaround,
"EnableThirdPartyKeyboardWorkaround",
base::FEATURE_ENABLED_BY_DEFAULT);
NSString* const kTabResumptionDecorationOverride =
@"TabResumptionDecorationOverride";
NSString* const kTipsMagicStackLensShopWithImage =
@"TipsMagicStackLensShopWithImage";
NSString* const kTipsMagicStackStateOverride = @"TipsMagicStackStateOverride";
NSString* const kInactiveTabsDemoMode = @"InactiveTabsDemoMode";
NSString* const kInactiveTabsTestMode = @"InactiveTabsTestMode";
NSString* const kAsyncStartupOverrideResponse = @"AsyncStartupOverrideResponse";
} // namespace
namespace experimental_flags {
bool AlwaysDisplayFirstRun() {
return
[[NSUserDefaults standardUserDefaults] boolForKey:kFirstRunForceEnabled];
}
bool AlwaysDisplayUpgradePromo() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:kUpgradePromoForceEnabled];
}
NSString* GetOriginServerHost() {
return [[NSUserDefaults standardUserDefaults] stringForKey:kOriginServerHost];
}
NSString* GetAlternateDiscoverFeedServerURL() {
return [[NSUserDefaults standardUserDefaults]
stringForKey:kAlternateDiscoverFeedServerURL];
}
bool ShouldResetNoticeCardOnFeedStart() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ResetNoticeCard"];
}
bool ShouldResetFirstFollowCount() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ResetFirstFollow"];
}
bool ShouldForceContentNotificationsPromo() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"ForceContentNotificationsPromo"];
}
bool ShouldForceFeedSigninPromo() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"ForceFeedSigninPromo"];
}
bool ShouldIgnoreTileAblationConditions() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"IgnoreTileAblationConditions"];
}
void DidResetFirstFollowCount() {
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"ResetFirstFollow"];
}
bool ShouldAlwaysShowFirstFollow() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"AlwaysShowFirstFollow"];
}
bool ShouldAlwaysShowFollowIPH() {
return
[[NSUserDefaults standardUserDefaults] boolForKey:@"AlwaysShowFollowIPH"];
}
bool IsMemoryDebuggingEnabled() {
#if BUILDFLAG(IOS_ENABLE_MEMORY_DEBUGGING)
return true;
#else
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"EnableMemoryDebugging"];
#endif
}
bool IsOmniboxDebuggingEnabled() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"EnableOmniboxDebugging"];
}
bool IsSpotlightDebuggingEnabled() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"EnableSpotlightDebugging"];
}
bool IsStartupCrashEnabled() {
return [[NSUserDefaults standardUserDefaults] boolForKey:kEnableStartupCrash];
}
bool MustClearApplicationGroupSandbox() {
bool value =
[[NSUserDefaults standardUserDefaults] boolForKey:kClearApplicationGroup];
[[NSUserDefaults standardUserDefaults] setBool:NO
forKey:kClearApplicationGroup];
return value;
}
bool IsThirdPartyKeyboardWorkaroundEnabled() {
// Check if the experimental flag is forced on or off.
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(switches::kEnableThirdPartyKeyboardWorkaround)) {
return true;
} else if (command_line->HasSwitch(
switches::kDisableThirdPartyKeyboardWorkaround)) {
return false;
}
// Check if the Finch experiment is turned on.
return base::FeatureList::IsEnabled(kEnableThirdPartyKeyboardWorkaround);
}
NSString* GetForcedPromoToDisplay() {
return [[NSUserDefaults standardUserDefaults]
stringForKey:kNextPromoForDisplayOverride];
}
std::optional<UpdateChromeSafetyCheckState> GetUpdateChromeSafetyCheckState() {
std::string state =
base::SysNSStringToUTF8([[NSUserDefaults standardUserDefaults]
stringForKey:kSafetyCheckUpdateChromeStateOverride]);
return UpdateChromeSafetyCheckStateForName(state);
}
std::optional<PasswordSafetyCheckState> GetPasswordSafetyCheckState() {
std::string state =
base::SysNSStringToUTF8([[NSUserDefaults standardUserDefaults]
stringForKey:kSafetyCheckPasswordStateOverride]);
return PasswordSafetyCheckStateForName(state);
}
std::optional<SafeBrowsingSafetyCheckState> GetSafeBrowsingSafetyCheckState() {
std::string state =
base::SysNSStringToUTF8([[NSUserDefaults standardUserDefaults]
stringForKey:kSafetyCheckSafeBrowsingStateOverride]);
return SafeBrowsingSafetyCheckStateForName(state);
}
std::optional<int> GetSafetyCheckWeakPasswordsCount() {
int weakPasswordsCount = [[NSUserDefaults standardUserDefaults]
integerForKey:kSafetyCheckWeakPasswordsCountOverride];
if (weakPasswordsCount == 0) {
return std::nullopt;
}
return weakPasswordsCount;
}
std::optional<int> GetFirstRunRecency() {
int first_run_recency =
[[NSUserDefaults standardUserDefaults] integerForKey:kFirstRunRecency];
if (first_run_recency == 0) {
return std::nullopt;
}
return first_run_recency;
}
std::optional<int> GetSafetyCheckReusedPasswordsCount() {
int reusedPasswordsCount = [[NSUserDefaults standardUserDefaults]
integerForKey:kSafetyCheckReusedPasswordsCountOverride];
if (reusedPasswordsCount == 0) {
return std::nullopt;
}
return reusedPasswordsCount;
}
std::optional<int> GetSafetyCheckCompromisedPasswordsCount() {
int compromisedPasswordsCount = [[NSUserDefaults standardUserDefaults]
integerForKey:kSafetyCheckCompromisedPasswordsCountOverride];
if (compromisedPasswordsCount == 0) {
return std::nullopt;
}
return compromisedPasswordsCount;
}
std::string GetSegmentForForcedDeviceSwitcherExperience() {
// Checks iOS Experimental Settings.
std::string segment =
base::SysNSStringToUTF8([[NSUserDefaults standardUserDefaults]
stringForKey:kForceExperienceForDeviceSwitcherExperimentalSettings]);
if (segment.empty()) {
// Checks command line flag.
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(
switches::kForceDeviceSwitcherExperienceCommandLineFlag)) {
segment = command_line->GetSwitchValueNative(
switches::kForceDeviceSwitcherExperienceCommandLineFlag);
}
}
return segment;
}
std::string GetSegmentForForcedShopperExperience() {
// Checks iOS Experimental Settings.
std::string segment =
[[NSUserDefaults standardUserDefaults]
boolForKey:kForceExperienceForShopperExperimentalSettings]
? segmentation_platform::kShoppingUserUmaName
: segmentation_platform::kLegacyNegativeLabel;
if (segment.empty()) {
// Checks command line flag.
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(switches::kForceShopperExperience)) {
segment =
command_line->GetSwitchValueNative(switches::kForceShopperExperience);
}
}
return segment;
}
bool SimulatePostDeviceRestore() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:kSimulatePostDeviceRestore];
}
bool ShouldIgnoreHistorySyncDeclineLimits() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:kShouldIgnoreHistorySyncDeclineLimits];
}
std::optional<int> GetForcedInactivityThresholdForSafetyCheckNotifications() {
int threshold = [[NSUserDefaults standardUserDefaults]
integerForKey:kSafetyCheckNotificationsInactivityThreshold];
if (threshold == 0) {
return std::nullopt;
}
return threshold;
}
std::optional<int> GetForcedTipsMagicStackState() {
int tipsIdentifier = [[NSUserDefaults standardUserDefaults]
integerForKey:kTipsMagicStackStateOverride];
if (tipsIdentifier == 0) {
return std::nullopt;
}
return tipsIdentifier;
}
bool ShouldDisplayLensShopTipWithImage() {
return [[NSUserDefaults standardUserDefaults]
boolForKey:kTipsMagicStackLensShopWithImage];
}
bool ShouldUseInactiveTabsDemoThreshold() {
return
[[NSUserDefaults standardUserDefaults] boolForKey:kInactiveTabsDemoMode];
}
bool ShouldUseInactiveTabsTestThreshold() {
return
[[NSUserDefaults standardUserDefaults] boolForKey:kInactiveTabsTestMode];
}
NSString* GetTabResumptionDecorationOverride() {
NSString* override_value = [[NSUserDefaults standardUserDefaults]
stringForKey:kTabResumptionDecorationOverride];
if ([override_value length]) {
return override_value;
}
return nil;
}
bool ShouldOpenInIncognitoOverride() {
NSString* value = [[NSUserDefaults standardUserDefaults]
stringForKey:kAsyncStartupOverrideResponse];
return ([value isEqualToString:@"FirstPartyIncognitoNoDelay"] ||
[value isEqualToString:@"FirstPartyIncognito500Delay"] ||
[value isEqualToString:@"AlwaysShowTheUI"]);
}
bool ShouldDelayAsyncStartup() {
NSString* value = [[NSUserDefaults standardUserDefaults]
stringForKey:kAsyncStartupOverrideResponse];
return ([value isEqualToString:@"FirstPartyIncognito500Delay"] ||
[value isEqualToString:@"500ms"]);
}
bool AlwaysShowTheFirstPartyIncognitoUI() {
NSString* value = [[NSUserDefaults standardUserDefaults]
stringForKey:kAsyncStartupOverrideResponse];
return [value isEqualToString:@"AlwaysShowTheUI"];
}
} // namespace experimental_flags