Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" | 5 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "base/prefs/scoped_user_pref_update.h" | 10 #include "base/prefs/scoped_user_pref_update.h" |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "extensions/common/features/feature_provider.h" | 23 #include "extensions/common/features/feature_provider.h" |
| 24 | 24 |
| 25 #if defined(OS_ANDROID) | 25 #if defined(OS_ANDROID) |
| 26 #include "base/android/build_info.h" | 26 #include "base/android/build_info.h" |
| 27 #endif | 27 #endif |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 const char kFieldTrialName[] = "EnhancedBookmarks"; | 31 const char kFieldTrialName[] = "EnhancedBookmarks"; |
| 32 | 32 |
| 33 // Get extension id from Finch EnhancedBookmarks group parameters. | 33 } // namespace |
| 34 std::string GetEnhancedBookmarksExtensionIdFromFinch() { | |
| 35 return variations::GetVariationParamValue(kFieldTrialName, "id"); | |
| 36 } | |
| 37 | 34 |
| 38 // Returns true if enhanced bookmarks experiment is enabled from Finch. | 35 bool GetBookmarksExperimentExtensionID(std::string* extension_id) { |
| 39 bool IsEnhancedBookmarksExperimentEnabledFromFinch() { | 36 *extension_id = variations::GetVariationParamValue(kFieldTrialName, "id"); |
| 40 const std::string ext_id = GetEnhancedBookmarksExtensionIdFromFinch(); | 37 if (extension_id->empty()) |
| 38 return false; | |
| 39 | |
| 40 // kEnhancedBookmarksExperiment flag could have values "", "1" and "0". | |
| 41 // "0" - user opted out. | |
| 42 bool opt_out = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 43 switches::kEnhancedBookmarksExperiment) == "0"; | |
|
Ted C
2015/03/17 22:58:11
This seems like it removed the ability to opt into
danduong
2015/03/17 23:03:55
Ah, that's right. On mobile, the extension_id is n
Mike Wittman
2015/03/17 23:11:59
Yes. We'd have to continue to force the Finch expe
danduong
2015/03/17 23:15:44
Talked to Ian about it. He'll provide the fix. Thi
| |
| 44 | |
| 45 if (opt_out) | |
| 46 return false; | |
| 47 | |
| 41 #if defined(OS_ANDROID) | 48 #if defined(OS_ANDROID) |
| 42 return !ext_id.empty(); | 49 return base::android::BuildInfo::GetInstance()->sdk_int() > |
| 50 base::android::SdkVersion::SDK_VERSION_ICE_CREAM_SANDWICH_MR1; | |
| 43 #else | 51 #else |
| 44 const extensions::FeatureProvider* feature_provider = | 52 const extensions::FeatureProvider* feature_provider = |
| 45 extensions::FeatureProvider::GetPermissionFeatures(); | 53 extensions::FeatureProvider::GetPermissionFeatures(); |
| 46 extensions::Feature* feature = feature_provider->GetFeature("metricsPrivate"); | 54 extensions::Feature* feature = feature_provider->GetFeature("metricsPrivate"); |
| 47 return feature && feature->IsIdInWhitelist(ext_id); | 55 return feature && feature->IsIdInWhitelist(*extension_id); |
| 48 #endif | 56 #endif |
| 49 } | 57 } |
| 50 | 58 |
| 51 }; // namespace | |
| 52 | |
| 53 bool GetBookmarksExperimentExtensionID(const PrefService* user_prefs, | |
| 54 std::string* extension_id) { | |
| 55 BookmarksExperimentState bookmarks_experiment_state = | |
| 56 static_cast<BookmarksExperimentState>(user_prefs->GetInteger( | |
| 57 sync_driver::prefs::kEnhancedBookmarksExperimentEnabled)); | |
| 58 if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED_FROM_FINCH) { | |
| 59 *extension_id = GetEnhancedBookmarksExtensionIdFromFinch(); | |
| 60 return !extension_id->empty(); | |
| 61 } | |
| 62 if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED) { | |
| 63 *extension_id = user_prefs->GetString( | |
| 64 sync_driver::prefs::kEnhancedBookmarksExtensionId); | |
| 65 return !extension_id->empty(); | |
| 66 } | |
| 67 | |
| 68 return false; | |
| 69 } | |
| 70 | |
| 71 void UpdateBookmarksExperimentState( | |
| 72 PrefService* user_prefs, | |
| 73 PrefService* local_state, | |
| 74 bool user_signed_in, | |
| 75 BookmarksExperimentState experiment_enabled_from_sync) { | |
| 76 PrefService* flags_storage = local_state; | |
| 77 #if defined(OS_CHROMEOS) | |
| 78 // Chrome OS is using user prefs for flags storage. | |
| 79 flags_storage = user_prefs; | |
| 80 #endif | |
| 81 | |
| 82 BookmarksExperimentState bookmarks_experiment_state_before = | |
| 83 static_cast<BookmarksExperimentState>(user_prefs->GetInteger( | |
| 84 sync_driver::prefs::kEnhancedBookmarksExperimentEnabled)); | |
| 85 // If user signed out, clear possible previous state. | |
| 86 if (!user_signed_in) { | |
| 87 bookmarks_experiment_state_before = BOOKMARKS_EXPERIMENT_NONE; | |
| 88 ForceFinchBookmarkExperimentIfNeeded(flags_storage, | |
| 89 BOOKMARKS_EXPERIMENT_NONE); | |
| 90 } | |
| 91 | |
| 92 // kEnhancedBookmarksExperiment flag could have values "", "1" and "0". | |
| 93 // "0" - user opted out. | |
| 94 bool opt_out = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 95 switches::kEnhancedBookmarksExperiment) == "0"; | |
| 96 | |
| 97 BookmarksExperimentState bookmarks_experiment_new_state = | |
| 98 BOOKMARKS_EXPERIMENT_NONE; | |
| 99 | |
| 100 if (IsEnhancedBookmarksExperimentEnabledFromFinch() && !user_signed_in) { | |
| 101 if (opt_out) { | |
| 102 // Experiment enabled but user opted out. | |
| 103 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_OPT_OUT_FROM_FINCH; | |
| 104 } else { | |
| 105 // Experiment enabled. | |
| 106 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED_FROM_FINCH; | |
| 107 } | |
| 108 } else if (experiment_enabled_from_sync == BOOKMARKS_EXPERIMENT_ENABLED) { | |
| 109 // Experiment enabled from Chrome sync. | |
| 110 if (opt_out) { | |
| 111 // Experiment enabled but user opted out. | |
| 112 bookmarks_experiment_new_state = | |
| 113 BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT; | |
| 114 } else { | |
| 115 // Experiment enabled. | |
| 116 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED; | |
| 117 } | |
| 118 } else if (experiment_enabled_from_sync == BOOKMARKS_EXPERIMENT_NONE) { | |
| 119 // Experiment is not enabled from Chrome sync. | |
| 120 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_NONE; | |
| 121 } else if (bookmarks_experiment_state_before == | |
| 122 BOOKMARKS_EXPERIMENT_ENABLED) { | |
| 123 if (opt_out) { | |
| 124 // Experiment enabled but user opted out. | |
| 125 bookmarks_experiment_new_state = | |
| 126 BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT; | |
| 127 } else { | |
| 128 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED; | |
| 129 } | |
| 130 } else if (bookmarks_experiment_state_before == | |
| 131 BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT) { | |
| 132 if (opt_out) { | |
| 133 bookmarks_experiment_new_state = | |
| 134 BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT; | |
| 135 } else { | |
| 136 // User opted in again. | |
| 137 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED; | |
| 138 } | |
| 139 } | |
| 140 | |
| 141 #if defined(OS_ANDROID) | |
| 142 if (base::android::BuildInfo::GetInstance()->sdk_int() <= | |
| 143 base::android::SdkVersion::SDK_VERSION_ICE_CREAM_SANDWICH_MR1) { | |
| 144 opt_out = true; | |
| 145 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_NONE; | |
| 146 } | |
| 147 bool opt_in = !opt_out && | |
| 148 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 149 switches::kEnhancedBookmarksExperiment) == "1"; | |
| 150 if (opt_in && bookmarks_experiment_new_state == BOOKMARKS_EXPERIMENT_NONE) | |
| 151 bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED; | |
| 152 #endif | |
| 153 | |
| 154 UMA_HISTOGRAM_ENUMERATION("EnhancedBookmarks.SyncExperimentState", | |
| 155 bookmarks_experiment_new_state, | |
| 156 BOOKMARKS_EXPERIMENT_ENUM_SIZE); | |
| 157 user_prefs->SetInteger( | |
| 158 sync_driver::prefs::kEnhancedBookmarksExperimentEnabled, | |
| 159 bookmarks_experiment_new_state); | |
| 160 ForceFinchBookmarkExperimentIfNeeded(flags_storage, | |
| 161 bookmarks_experiment_new_state); | |
| 162 } | |
| 163 | |
| 164 void InitBookmarksExperimentState(Profile* profile) { | |
| 165 SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile); | |
| 166 bool is_signed_in = signin && signin->IsAuthenticated(); | |
| 167 UpdateBookmarksExperimentState( | |
| 168 profile->GetPrefs(), | |
| 169 g_browser_process->local_state(), | |
| 170 is_signed_in, | |
| 171 BOOKMARKS_EXPERIMENT_ENABLED_FROM_SYNC_UNKNOWN); | |
| 172 } | |
| 173 | |
| 174 void ForceFinchBookmarkExperimentIfNeeded( | |
| 175 PrefService* flags_storage, | |
| 176 BookmarksExperimentState bookmarks_experiment_state) { | |
| 177 if (!flags_storage) | |
| 178 return; | |
| 179 ListPrefUpdate update(flags_storage, prefs::kEnabledLabsExperiments); | |
| 180 base::ListValue* experiments_list = update.Get(); | |
| 181 if (!experiments_list) | |
| 182 return; | |
| 183 size_t index; | |
| 184 if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_NONE) { | |
| 185 experiments_list->Remove( | |
| 186 base::StringValue(switches::kManualEnhancedBookmarks), &index); | |
| 187 experiments_list->Remove( | |
| 188 base::StringValue(switches::kManualEnhancedBookmarksOptout), &index); | |
| 189 } else if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED) { | |
| 190 experiments_list->Remove( | |
| 191 base::StringValue(switches::kManualEnhancedBookmarksOptout), &index); | |
| 192 experiments_list->AppendIfNotPresent( | |
| 193 new base::StringValue(switches::kManualEnhancedBookmarks)); | |
| 194 } else if (bookmarks_experiment_state == | |
| 195 BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT) { | |
| 196 experiments_list->Remove( | |
| 197 base::StringValue(switches::kManualEnhancedBookmarks), &index); | |
| 198 experiments_list->AppendIfNotPresent( | |
| 199 new base::StringValue(switches::kManualEnhancedBookmarksOptout)); | |
| 200 } | |
| 201 } | |
| 202 | |
| 203 bool IsEnhancedBookmarksExperimentEnabled( | |
| 204 about_flags::FlagsStorage* flags_storage) { | |
| 205 #if defined(OS_CHROMEOS) | |
| 206 // We are not setting command line flags on Chrome OS to avoid browser restart | |
| 207 // but still have flags in flags_storage. So check flags_storage instead. | |
| 208 const std::set<std::string> flags = flags_storage->GetFlags(); | |
| 209 if (flags.find(switches::kManualEnhancedBookmarks) != flags.end()) | |
| 210 return true; | |
| 211 if (flags.find(switches::kManualEnhancedBookmarksOptout) != flags.end()) | |
| 212 return true; | |
| 213 #else | |
| 214 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | |
| 215 if (command_line->HasSwitch(switches::kManualEnhancedBookmarks) || | |
| 216 command_line->HasSwitch(switches::kManualEnhancedBookmarksOptout)) { | |
| 217 return true; | |
| 218 } | |
| 219 #endif | |
| 220 | |
| 221 return IsEnhancedBookmarksExperimentEnabledFromFinch(); | |
| 222 } | |
| 223 | |
| 224 #if defined(OS_ANDROID) | 59 #if defined(OS_ANDROID) |
| 225 bool IsEnhancedBookmarkImageFetchingEnabled(const PrefService* user_prefs) { | 60 bool IsEnhancedBookmarkImageFetchingEnabled(const PrefService* user_prefs) { |
| 226 if (IsEnhancedBookmarksEnabled(user_prefs)) | 61 if (IsEnhancedBookmarksEnabled()) |
| 227 return true; | 62 return true; |
| 228 | 63 |
| 229 // Salient images are collected from visited bookmarked pages even if the | 64 // Salient images are collected from visited bookmarked pages even if the |
| 230 // enhanced bookmark feature is turned off. This is to have some images | 65 // enhanced bookmark feature is turned off. This is to have some images |
| 231 // available so that in the future, when the feature is turned on, the user | 66 // available so that in the future, when the feature is turned on, the user |
| 232 // experience is not a big list of flat colors. However as a precautionary | 67 // experience is not a big list of flat colors. However as a precautionary |
| 233 // measure it is possible to disable this collection of images from finch. | 68 // measure it is possible to disable this collection of images from finch. |
| 234 std::string disable_fetching = variations::GetVariationParamValue( | 69 std::string disable_fetching = variations::GetVariationParamValue( |
| 235 kFieldTrialName, "DisableImagesFetching"); | 70 kFieldTrialName, "DisableImagesFetching"); |
| 236 return disable_fetching.empty(); | 71 return disable_fetching.empty(); |
| 237 } | 72 } |
| 238 | 73 |
| 239 bool IsEnhancedBookmarksEnabled(const PrefService* user_prefs) { | 74 bool IsEnhancedBookmarksEnabled() { |
| 240 BookmarksExperimentState bookmarks_experiment_state = | 75 std::string extension_id; |
| 241 static_cast<BookmarksExperimentState>(user_prefs->GetInteger( | 76 return GetBookmarksExperimentExtensionID(&extension_id); |
| 242 sync_driver::prefs::kEnhancedBookmarksExperimentEnabled)); | |
| 243 return bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED || | |
| 244 bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED_FROM_FINCH; | |
| 245 } | 77 } |
| 246 #endif | 78 #endif |
| 247 | 79 |
| 248 bool IsEnableDomDistillerSet() { | 80 bool IsEnableDomDistillerSet() { |
| 249 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 81 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 250 switches::kEnableDomDistiller)) { | 82 switches::kEnableDomDistiller)) { |
| 251 return true; | 83 return true; |
| 252 } | 84 } |
| 253 if (variations::GetVariationParamValue( | 85 if (variations::GetVariationParamValue( |
| 254 kFieldTrialName, "enable-dom-distiller") == "1") | 86 kFieldTrialName, "enable-dom-distiller") == "1") |
| 255 return true; | 87 return true; |
| 256 | 88 |
| 257 return false; | 89 return false; |
| 258 } | 90 } |
| 259 | 91 |
| 260 bool IsEnableSyncArticlesSet() { | 92 bool IsEnableSyncArticlesSet() { |
| 261 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 93 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 262 switches::kEnableSyncArticles)) { | 94 switches::kEnableSyncArticles)) { |
| 263 return true; | 95 return true; |
| 264 } | 96 } |
| 265 if (variations::GetVariationParamValue( | 97 if (variations::GetVariationParamValue( |
| 266 kFieldTrialName, "enable-sync-articles") == "1") | 98 kFieldTrialName, "enable-sync-articles") == "1") |
| 267 return true; | 99 return true; |
| 268 | 100 |
| 269 return false; | 101 return false; |
| 270 } | 102 } |
| OLD | NEW |