Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / local / local_file_sync_service.cc
index 8666fb3..a5cafcb 100644 (file)
@@ -4,9 +4,10 @@
 
 #include "chrome/browser/sync_file_system/local/local_file_sync_service.h"
 
+#include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_system.h"
+#include "base/thread_task_runner_handle.h"
+#include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync_file_system/file_change.h"
 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h"
@@ -19,6 +20,8 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/site_instance.h"
 #include "content/public/browser/storage_partition.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension_set.h"
 #include "url/gurl.h"
 #include "webkit/browser/fileapi/file_system_context.h"
 #include "webkit/browser/fileapi/file_system_url.h"
@@ -39,6 +42,12 @@ void PrepareForProcessRemoteChangeCallbackAdapter(
   callback.Run(status, sync_file_info.metadata, sync_file_info.changes);
 }
 
+void InvokeCallbackOnNthInvocation(int* count, const base::Closure& callback) {
+  --*count;
+  if (*count <= 0)
+    callback.Run();
+}
+
 }  // namespace
 
 LocalFileSyncService::OriginChangeMap::OriginChangeMap()
@@ -96,16 +105,18 @@ void LocalFileSyncService::OriginChangeMap::SetOriginEnabled(
 
 // LocalFileSyncService -------------------------------------------------------
 
-LocalFileSyncService::LocalFileSyncService(Profile* profile)
-    : profile_(profile),
-      sync_context_(new LocalFileSyncContext(
-          profile_->GetPath(),
-          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(),
-          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)
-              .get())),
-      local_change_processor_(NULL) {
-  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  sync_context_->AddOriginChangeObserver(this);
+scoped_ptr<LocalFileSyncService> LocalFileSyncService::Create(
+    Profile* profile) {
+  return make_scoped_ptr(new LocalFileSyncService(profile, NULL));
+}
+
+scoped_ptr<LocalFileSyncService> LocalFileSyncService::CreateForTesting(
+    Profile* profile,
+    leveldb::Env* env) {
+  scoped_ptr<LocalFileSyncService> sync_service(
+      new LocalFileSyncService(profile, env));
+  sync_service->sync_context_->set_mock_notify_changes_duration_in_sec(0);
+  return sync_service.Pass();
 }
 
 LocalFileSyncService::~LocalFileSyncService() {
@@ -175,7 +186,7 @@ void LocalFileSyncService::HasPendingLocalChanges(
     const FileSystemURL& url,
     const HasPendingLocalChangeCallback& callback) {
   if (!ContainsKey(origin_to_contexts_, url.origin())) {
-    base::MessageLoopProxy::current()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::Bind(callback, SYNC_FILE_ERROR_INVALID_URL, false));
     return;
@@ -184,10 +195,20 @@ void LocalFileSyncService::HasPendingLocalChanges(
       origin_to_contexts_[url.origin()], url, callback);
 }
 
-void LocalFileSyncService::PromoteDemotedChanges() {
+void LocalFileSyncService::PromoteDemotedChanges(
+    const base::Closure& callback) {
+  if (origin_to_contexts_.empty()) {
+    callback.Run();
+    return;
+  }
+
+  base::Closure completion_callback =
+      base::Bind(&InvokeCallbackOnNthInvocation,
+                 base::Owned(new int(origin_to_contexts_.size())), callback);
   for (OriginToContext::iterator iter = origin_to_contexts_.begin();
        iter != origin_to_contexts_.end(); ++iter)
-    sync_context_->PromoteDemotedChanges(iter->first, iter->second);
+    sync_context_->PromoteDemotedChanges(iter->first, iter->second,
+                                         completion_callback);
 }
 
 void LocalFileSyncService::GetLocalFileMetadata(
@@ -207,10 +228,9 @@ void LocalFileSyncService::PrepareForProcessRemoteChange(
     // been initialized in this service.
     DCHECK(profile_);
     // The given url.origin() must be for valid installed app.
-    ExtensionService* extension_service =
-        extensions::ExtensionSystem::Get(profile_)->extension_service();
-    const extensions::Extension* extension = extension_service->GetInstalledApp(
-        url.origin());
+    const extensions::Extension* extension =
+        extensions::ExtensionRegistry::Get(profile_)
+            ->enabled_extensions().GetAppByURL(url.origin());
     if (!extension) {
       util::Log(
           logging::LOG_WARNING,
@@ -224,7 +244,8 @@ void LocalFileSyncService::PrepareForProcessRemoteChange(
                    SyncFileMetadata(), FileChangeList());
       return;
     }
-    GURL site_url = extension_service->GetSiteForExtensionId(extension->id());
+    GURL site_url =
+        extensions::util::GetSiteForExtensionId(extension->id(), profile_);
     DCHECK(!site_url.is_empty());
     scoped_refptr<fileapi::FileSystemContext> file_system_context =
         content::BrowserContext::GetStoragePartitionForSite(
@@ -320,6 +341,20 @@ void LocalFileSyncService::SetOriginEnabled(const GURL& origin, bool enabled) {
   origin_change_map_.SetOriginEnabled(origin, enabled);
 }
 
+LocalFileSyncService::LocalFileSyncService(Profile* profile,
+                                           leveldb::Env* env_override)
+    : profile_(profile),
+      sync_context_(new LocalFileSyncContext(
+          profile_->GetPath(),
+          env_override,
+          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(),
+          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)
+              .get())),
+      local_change_processor_(NULL) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  sync_context_->AddOriginChangeObserver(this);
+}
+
 void LocalFileSyncService::DidInitializeFileSystemContext(
     const GURL& app_origin,
     fileapi::FileSystemContext* file_system_context,