Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / external_pref_loader.h
index c4508c2..dca6dad 100644 (file)
@@ -5,13 +5,17 @@
 #ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_PREF_LOADER_H_
 #define CHROME_BROWSER_EXTENSIONS_EXTERNAL_PREF_LOADER_H_
 
-#include "chrome/browser/extensions/external_loader.h"
-
 #include <string>
 
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/scoped_observer.h"
 #include "base/values.h"
+#include "chrome/browser/extensions/external_loader.h"
+#include "chrome/browser/prefs/pref_service_syncable_observer.h"
+
+class PrefServiceSyncable;
+class Profile;
 
 namespace extensions {
 
@@ -19,7 +23,8 @@ namespace extensions {
 // look up which external extensions are registered.
 // Instances of this class are expected to be created and destroyed on the UI
 // thread and they are expecting public method calls from the UI thread.
-class ExternalPrefLoader : public ExternalLoader {
+class ExternalPrefLoader : public ExternalLoader,
+                           public PrefServiceSyncableObserver {
  public:
   enum Options {
     NONE = 0,
@@ -27,20 +32,25 @@ class ExternalPrefLoader : public ExternalLoader {
     // Ensure that only root can force an external install by checking
     // that all components of the path to external extensions files are
     // owned by root and not writable by any non-root user.
-    ENSURE_PATH_CONTROLLED_BY_ADMIN = 1 << 0
+    ENSURE_PATH_CONTROLLED_BY_ADMIN = 1 << 0,
+
+    // Delay external preference load. It delays default apps installation
+    // to not overload the system on first time user login.
+    DELAY_LOAD_UNTIL_PRIORITY_SYNC = 1 << 1,
   };
 
   // |base_path_id| is the directory containing the external_extensions.json
   // file or the standalone extension manifest files. Relative file paths to
-  // extension files are resolved relative to this path.
-  ExternalPrefLoader(int base_path_id, Options options);
+  // extension files are resolved relative to this path. |profile| is used to
+  // wait priority sync if DELAY_LOAD_UNTIL_PRIORITY_SYNC set.
+  ExternalPrefLoader(int base_path_id, Options options, Profile* profile);
 
-  virtual const base::FilePath GetBaseCrxFilePath() OVERRIDE;
+  const base::FilePath GetBaseCrxFilePath() override;
 
  protected:
-  virtual ~ExternalPrefLoader() {}
+  ~ExternalPrefLoader() override;
 
-  virtual void StartLoading() OVERRIDE;
+  void StartLoading() override;
   bool IsOptionSet(Options option) {
     return (options_ & option) != 0;
   }
@@ -54,6 +64,12 @@ class ExternalPrefLoader : public ExternalLoader {
  private:
   friend class base::RefCountedThreadSafe<ExternalLoader>;
 
+  // PrefServiceSyncableObserver:
+  void OnIsSyncingChanged() override;
+
+  // If priority sync ready posts LoadOnFileThread and return true.
+  bool PostLoadIfPrioritySyncReady();
+
   // Actually searches for and loads candidate standalone extension preference
   // files in the path corresponding to |base_path_id|.
   // Must be called on the file thread.
@@ -76,6 +92,14 @@ class ExternalPrefLoader : public ExternalLoader {
   // describing which extensions to load.
   base::FilePath base_path_;
 
+  // Profile that loads these external prefs.
+  // Needed for waiting for waiting priority sync.
+  Profile* profile_;
+
+  // Used for registering observer for PrefServiceSyncable.
+  ScopedObserver<PrefServiceSyncable, PrefServiceSyncableObserver>
+      syncable_pref_observer_;
+
   DISALLOW_COPY_AND_ASSIGN(ExternalPrefLoader);
 };
 
@@ -86,15 +110,15 @@ class ExternalTestingLoader : public ExternalLoader {
   ExternalTestingLoader(const std::string& json_data,
                         const base::FilePath& fake_base_path);
 
-  virtual const base::FilePath GetBaseCrxFilePath() OVERRIDE;
+  const base::FilePath GetBaseCrxFilePath() override;
 
  protected:
-  virtual void StartLoading() OVERRIDE;
+  void StartLoading() override;
 
  private:
   friend class base::RefCountedThreadSafe<ExternalLoader>;
 
-  virtual ~ExternalTestingLoader();
+  ~ExternalTestingLoader() override;
 
   base::FilePath fake_base_path_;
   scoped_ptr<base::DictionaryValue> testing_prefs_;