Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / local_to_remote_syncer.cc
index e786edc..f6d6719 100644 (file)
@@ -370,6 +370,11 @@ void LocalToRemoteSyncer::DidDeleteRemoteFile(
   // For PRECONDITION / CONFLICT case, the remote file is modified since the
   // last sync completed.  As our policy for deletion-modification conflict
   // resolution, ignore the local deletion.
+  if (error == google_apis::HTTP_NOT_FOUND) {
+    metadata_database()->UpdateByDeletedRemoteFile(
+        remote_file_tracker_->file_id(), callback);
+    return;
+  }
   callback.Run(SYNC_STATUS_OK);
 }
 
@@ -628,18 +633,29 @@ void LocalToRemoteSyncer::DidCreateRemoteFolder(
     return;
   }
 
-  if (metadata_database()->TryNoSideEffectActivation(
+  MetadataDatabase::ActivationStatus activation_status =
+      metadata_database()->TryActivateTracker(
           remote_parent_folder_tracker_->tracker_id(),
-          file_id, callback)) {
-    // |callback| will be invoked by MetadataDatabase in this case.
-    return;
+          file_id, callback);
+  switch (activation_status) {
+    case MetadataDatabase::ACTIVATION_PENDING:
+      // |callback| will be invoked by MetadataDatabase later in this case.
+      return;
+    case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER:
+      // The activation failed due to another tracker that has another parent.
+      // Detach the folder from the current parent to avoid using this folder as
+      // active folder.
+      drive_service()->RemoveResourceFromDirectory(
+          remote_parent_folder_tracker_->file_id(), file_id,
+          base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     callback));
+      return;
   }
 
-  drive_service()->RemoveResourceFromDirectory(
-      remote_parent_folder_tracker_->file_id(), file_id,
-      base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 callback));
+  NOTREACHED();
+  callback.Run(SYNC_STATUS_FAILED);
+  return;
 }
 
 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict(