Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / bookmarks / enhanced_bookmarks_features.cc
index 777ac07..aad3817 100644 (file)
@@ -5,10 +5,14 @@
 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h"
 
 #include "base/command_line.h"
-#include "base/metrics/field_trial.h"
+#include "base/metrics/histogram.h"
+#include "base/prefs/pref_service.h"
+#include "base/prefs/scoped_user_pref_update.h"
 #include "base/sha1.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/pref_names.h"
+#include "components/sync_driver/pref_names.h"
 #include "components/variations/variations_associated_data.h"
 #include "extensions/common/features/feature.h"
 #include "extensions/common/features/feature_provider.h"
@@ -17,52 +21,185 @@ namespace {
 
 const char kFieldTrialName[] = "EnhancedBookmarks";
 
-bool IsBookmarksExtensionHash(const std::string& sha1_hex) {
-    return sha1_hex == "D5736E4B5CF695CB93A2FB57E4FDC6E5AFAB6FE2" ||
-           sha1_hex == "D57DE394F36DC1C3220E7604C575D29C51A6C495";
+// Get extension id from Finch EnhancedBookmarks group parameters.
+std::string GetEnhancedBookmarksExtensionIdFromFinch() {
+  return variations::GetVariationParamValue(kFieldTrialName, "id");
+}
+
+// Returns true if enhanced bookmarks experiment is enabled from Finch.
+bool IsEnhancedBookmarksExperimentEnabledFromFinch() {
+  const std::string ext_id = GetEnhancedBookmarksExtensionIdFromFinch();
+#if defined(OS_ANDROID)
+  return !ext_id.empty();
+#else
+  const extensions::FeatureProvider* feature_provider =
+      extensions::FeatureProvider::GetPermissionFeatures();
+  extensions::Feature* feature = feature_provider->GetFeature("metricsPrivate");
+  return feature && feature->IsIdInWhitelist(ext_id);
+#endif
 }
 
 };  // namespace
 
-bool OptInIntoBookmarksExperimentIfHasExtension(
-    const extensions::ExtensionIdSet& extension_ids) {
-  if (base::FieldTrialList::FindFullName(kFieldTrialName) != "Default")
-    return false;
-
-  // Compare installed extension ids with ones we expect.
-  for (extensions::ExtensionIdSet::const_iterator iter = extension_ids.begin();
-       iter != extension_ids.end(); ++iter) {
-    const std::string id_hash = base::SHA1HashString(*iter);
-    DCHECK_EQ(id_hash.length(), base::kSHA1Length);
-    std::string hash = base::HexEncode(id_hash.c_str(), id_hash.length());
-
-    if (IsBookmarksExtensionHash(hash)) {
-      // Enable features bookmarks depends on and opt-in user into Finch group
-      // for reporting.
-      CommandLine* command_line = CommandLine::ForCurrentProcess();
-      command_line->AppendSwitch(switches::kManualEnhancedBookmarks);
-      command_line->AppendSwitch(switches::kEnableSyncArticles);
-      command_line->AppendSwitch(switches::kEnableDomDistiller);
-      return true;
-    }
+bool GetBookmarksExperimentExtensionID(const PrefService* user_prefs,
+                                       std::string* extension_id) {
+  BookmarksExperimentState bookmarks_experiment_state =
+      static_cast<BookmarksExperimentState>(user_prefs->GetInteger(
+          sync_driver::prefs::kEnhancedBookmarksExperimentEnabled));
+  if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED_FROM_FINCH) {
+    *extension_id = GetEnhancedBookmarksExtensionIdFromFinch();
+    return !extension_id->empty();
+  }
+  if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED) {
+    *extension_id = user_prefs->GetString(
+        sync_driver::prefs::kEnhancedBookmarksExtensionId);
+    return !extension_id->empty();
   }
+
   return false;
 }
 
+void UpdateBookmarksExperimentState(
+    PrefService* user_prefs,
+    PrefService* local_state,
+    bool user_signed_in,
+    BookmarksExperimentState experiment_enabled_from_sync) {
+ PrefService* flags_storage = local_state;
+#if defined(OS_CHROMEOS)
+  // Chrome OS is using user prefs for flags storage.
+  flags_storage = user_prefs;
+#endif
+
+  BookmarksExperimentState bookmarks_experiment_state_before =
+      static_cast<BookmarksExperimentState>(user_prefs->GetInteger(
+          sync_driver::prefs::kEnhancedBookmarksExperimentEnabled));
+  // If user signed out, clear possible previous state.
+  if (!user_signed_in) {
+    bookmarks_experiment_state_before = BOOKMARKS_EXPERIMENT_NONE;
+    ForceFinchBookmarkExperimentIfNeeded(flags_storage,
+        BOOKMARKS_EXPERIMENT_NONE);
+  }
+
+  // kEnhancedBookmarksExperiment flag could have values "", "1" and "0".
+  // "0" - user opted out.
+  bool opt_out = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+                     switches::kEnhancedBookmarksExperiment) == "0";
+
+  BookmarksExperimentState bookmarks_experiment_new_state =
+      BOOKMARKS_EXPERIMENT_NONE;
+
+  if (IsEnhancedBookmarksExperimentEnabledFromFinch() && !user_signed_in) {
+    if (opt_out) {
+      // Experiment enabled but user opted out.
+      bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_OPT_OUT_FROM_FINCH;
+    } else {
+      // Experiment enabled.
+      bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED_FROM_FINCH;
+    }
+  } else if (experiment_enabled_from_sync == BOOKMARKS_EXPERIMENT_ENABLED) {
+    // Experiment enabled from Chrome sync.
+    if (opt_out) {
+      // Experiment enabled but user opted out.
+      bookmarks_experiment_new_state =
+          BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT;
+    } else {
+      // Experiment enabled.
+      bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED;
+    }
+  } else if (experiment_enabled_from_sync == BOOKMARKS_EXPERIMENT_NONE) {
+    // Experiment is not enabled from Chrome sync.
+    bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_NONE;
+  } else if (bookmarks_experiment_state_before ==
+             BOOKMARKS_EXPERIMENT_ENABLED) {
+    if (opt_out) {
+      // Experiment enabled but user opted out.
+      bookmarks_experiment_new_state =
+          BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT;
+    } else {
+      bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED;
+    }
+  } else if (bookmarks_experiment_state_before ==
+             BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT) {
+    if (opt_out) {
+      bookmarks_experiment_new_state =
+          BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT;
+    } else {
+      // User opted in again.
+      bookmarks_experiment_new_state = BOOKMARKS_EXPERIMENT_ENABLED;
+    }
+  }
+
+  UMA_HISTOGRAM_ENUMERATION("EnhancedBookmarks.SyncExperimentState",
+                            bookmarks_experiment_new_state,
+                            BOOKMARKS_EXPERIMENT_ENUM_SIZE);
+  user_prefs->SetInteger(
+      sync_driver::prefs::kEnhancedBookmarksExperimentEnabled,
+      bookmarks_experiment_new_state);
+  ForceFinchBookmarkExperimentIfNeeded(flags_storage,
+                                       bookmarks_experiment_new_state);
+}
+
+void ForceFinchBookmarkExperimentIfNeeded(
+    PrefService* flags_storage,
+    BookmarksExperimentState bookmarks_experiment_state) {
+  if (!flags_storage)
+    return;
+  ListPrefUpdate update(flags_storage, prefs::kEnabledLabsExperiments);
+  base::ListValue* experiments_list = update.Get();
+  if (!experiments_list)
+    return;
+  size_t index;
+  if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_NONE) {
+    experiments_list->Remove(
+        base::StringValue(switches::kManualEnhancedBookmarks), &index);
+    experiments_list->Remove(
+        base::StringValue(switches::kManualEnhancedBookmarksOptout), &index);
+  } else if (bookmarks_experiment_state == BOOKMARKS_EXPERIMENT_ENABLED) {
+    experiments_list->Remove(
+        base::StringValue(switches::kManualEnhancedBookmarksOptout), &index);
+    experiments_list->AppendIfNotPresent(
+        new base::StringValue(switches::kManualEnhancedBookmarks));
+  } else if (bookmarks_experiment_state ==
+                 BOOKMARKS_EXPERIMENT_ENABLED_USER_OPT_OUT) {
+    experiments_list->Remove(
+        base::StringValue(switches::kManualEnhancedBookmarks), &index);
+    experiments_list->AppendIfNotPresent(
+        new base::StringValue(switches::kManualEnhancedBookmarksOptout));
+  }
+}
+
 bool IsEnhancedBookmarksExperimentEnabled() {
-  std::string ext_id = GetEnhancedBookmarksExtensionId();
-  extensions::FeatureProvider* feature_provider =
-      extensions::FeatureProvider::GetPermissionFeatures();
-  extensions::Feature* feature = feature_provider->GetFeature("metricsPrivate");
-  return feature && feature->IsIdInWhitelist(ext_id);
+  CommandLine* command_line = CommandLine::ForCurrentProcess();
+  if (command_line->HasSwitch(switches::kManualEnhancedBookmarks) ||
+      command_line->HasSwitch(switches::kManualEnhancedBookmarksOptout)) {
+    return true;
+  }
+
+  return IsEnhancedBookmarksExperimentEnabledFromFinch();
 }
 
+#if defined(OS_ANDROID)
+bool IsEnhancedBookmarkImageFetchingEnabled() {
+  if (IsEnhancedBookmarksExperimentEnabled())
+    return true;
+
+  // Salient images are collected from visited bookmarked pages even if the
+  // enhanced bookmark feature is turned off. This is to have some images
+  // available so that in the future, when the feature is turned on, the user
+  // experience is not a big list of flat colors. However as a precautionary
+  // measure it is possible to disable this collection of images from finch.
+  std::string disable_fetching = variations::GetVariationParamValue(
+      kFieldTrialName, "DisableImagesFetching");
+  return disable_fetching.empty();
+}
+#endif
+
 bool IsEnableDomDistillerSet() {
   if (CommandLine::ForCurrentProcess()->
       HasSwitch(switches::kEnableDomDistiller)) {
     return true;
   }
-  if (chrome_variations::GetVariationParamValue(
+  if (variations::GetVariationParamValue(
           kFieldTrialName, "enable-dom-distiller") == "1")
     return true;
 
@@ -74,13 +211,9 @@ bool IsEnableSyncArticlesSet() {
       HasSwitch(switches::kEnableSyncArticles)) {
     return true;
   }
-  if (chrome_variations::GetVariationParamValue(
+  if (variations::GetVariationParamValue(
           kFieldTrialName, "enable-sync-articles") == "1")
     return true;
 
   return false;
 }
-
-std::string GetEnhancedBookmarksExtensionId() {
-  return chrome_variations::GetVariationParamValue(kFieldTrialName, "id");
-}