root_delete_helper.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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
3// found in the LICENSE file.
4
5#include "chrome/browser/sync_file_system/local/root_delete_helper.h"
6
7#include "base/sequenced_task_runner.h"
8#include "chrome/browser/sync_file_system/local/local_file_change_tracker.h"
9#include "chrome/browser/sync_file_system/local/local_file_sync_status.h"
10#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
11#include "chrome/browser/sync_file_system/logger.h"
12#include "chrome/browser/sync_file_system/sync_callbacks.h"
13#include "webkit/browser/fileapi/file_system_context.h"
14#include "webkit/browser/fileapi/file_system_url.h"
15#include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
16#include "webkit/common/fileapi/file_system_util.h"
17
18namespace sync_file_system {
19
20namespace {
21
22// This runs on FileSystemContext's default_file_task_runner.
23void ResetFileChangeTracker(storage::FileSystemContext* file_system_context,
24                            const storage::FileSystemURL& url) {
25  DCHECK(file_system_context->default_file_task_runner()->
26             RunsTasksOnCurrentThread());
27  SyncFileSystemBackend* backend =
28      SyncFileSystemBackend::GetBackend(file_system_context);
29  DCHECK(backend);
30  DCHECK(backend->change_tracker());
31  backend->change_tracker()->ResetForFileSystem(url.origin(), url.type());
32}
33
34}  // namespace
35
36RootDeleteHelper::RootDeleteHelper(
37    storage::FileSystemContext* file_system_context,
38    LocalFileSyncStatus* sync_status,
39    const storage::FileSystemURL& url,
40    const FileStatusCallback& callback)
41    : file_system_context_(file_system_context),
42      url_(url),
43      callback_(callback),
44      sync_status_(sync_status),
45      weak_factory_(this) {
46  DCHECK(file_system_context_);
47  DCHECK(url_.is_valid());
48  DCHECK(!callback_.is_null());
49  DCHECK(sync_status_);
50  // This is expected to run on the filesystem root.
51  DCHECK(storage::VirtualPath::IsRootPath(url.path()));
52}
53
54RootDeleteHelper::~RootDeleteHelper() {
55}
56
57void RootDeleteHelper::Run() {
58  util::Log(logging::LOG_VERBOSE, FROM_HERE,
59            "Deleting the entire local filesystem for remote root deletion: "
60            "%s", url_.DebugString().c_str());
61
62  file_system_context_->DeleteFileSystem(
63      url_.origin(), url_.type(),
64      base::Bind(&RootDeleteHelper::DidDeleteFileSystem,
65                 weak_factory_.GetWeakPtr()));
66}
67
68void RootDeleteHelper::DidDeleteFileSystem(base::File::Error error) {
69  // Ignore errors, no idea how to deal with it.
70
71  DCHECK(!sync_status_->IsWritable(url_));
72  DCHECK(!sync_status_->IsWriting(url_));
73
74  // All writes to the entire file system must be now blocked, so we have
75  // to be able to safely reset the local changes and sync statuses for it.
76  // TODO(kinuko): This should be probably automatically handled in
77  // DeleteFileSystem via QuotaUtil::DeleteOriginDataOnFileThread.
78  file_system_context_->default_file_task_runner()->PostTaskAndReply(
79      FROM_HERE,
80      base::Bind(&ResetFileChangeTracker, file_system_context_, url_),
81      base::Bind(&RootDeleteHelper::DidResetFileChangeTracker,
82                 weak_factory_.GetWeakPtr()));
83}
84
85void RootDeleteHelper::DidResetFileChangeTracker() {
86  DCHECK(!sync_status_->IsWritable(url_));
87  DCHECK(!sync_status_->IsWriting(url_));
88
89  // Reopening the filesystem.
90  file_system_context_->sandbox_delegate()->OpenFileSystem(
91      url_.origin(),
92      url_.type(),
93      storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
94      base::Bind(&RootDeleteHelper::DidOpenFileSystem,
95                 weak_factory_.GetWeakPtr()),
96      GURL());
97}
98
99void RootDeleteHelper::DidOpenFileSystem(const GURL& /* root */,
100                                         const std::string& /* name */,
101                                         base::File::Error error) {
102  FileStatusCallback callback = callback_;
103  callback.Run(error);
104}
105
106}  // namespace sync_file_system
107