OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/tools/test_shell/simple_file_system.h" | 5 #include "webkit/tools/test_shell/simple_file_system.h" |
6 | 6 |
7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
8 #include "base/message_loop_proxy.h" | 8 #include "base/message_loop_proxy.h" |
9 #include "base/scoped_callback_factory.h" | 9 #include "base/scoped_callback_factory.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 : public FileSystemCallbackDispatcher { | 47 : public FileSystemCallbackDispatcher { |
48 public: | 48 public: |
49 SimpleFileSystemCallbackDispatcher( | 49 SimpleFileSystemCallbackDispatcher( |
50 const WeakPtr<SimpleFileSystem>& file_system, | 50 const WeakPtr<SimpleFileSystem>& file_system, |
51 WebFileSystemCallbacks* callbacks) | 51 WebFileSystemCallbacks* callbacks) |
52 : file_system_(file_system), | 52 : file_system_(file_system), |
53 callbacks_(callbacks) { | 53 callbacks_(callbacks) { |
54 } | 54 } |
55 | 55 |
56 ~SimpleFileSystemCallbackDispatcher() { | 56 ~SimpleFileSystemCallbackDispatcher() { |
57 DCHECK(!operation_.get()); | |
58 } | |
59 | |
60 void set_operation(SandboxedFileSystemOperation* operation) { | |
61 operation_.reset(operation); | |
62 } | 57 } |
63 | 58 |
64 virtual void DidSucceed() { | 59 virtual void DidSucceed() { |
65 if (file_system_) | 60 DCHECK(file_system_); |
66 callbacks_->didSucceed(); | 61 callbacks_->didSucceed(); |
67 RemoveOperation(); | |
68 } | 62 } |
69 | 63 |
70 virtual void DidReadMetadata(const base::PlatformFileInfo& info) { | 64 virtual void DidReadMetadata(const base::PlatformFileInfo& info) { |
71 DCHECK(file_system_); | 65 DCHECK(file_system_); |
72 WebFileInfo web_file_info; | 66 WebFileInfo web_file_info; |
73 web_file_info.length = info.size; | 67 web_file_info.length = info.size; |
74 web_file_info.modificationTime = info.last_modified.ToDoubleT(); | 68 web_file_info.modificationTime = info.last_modified.ToDoubleT(); |
75 web_file_info.type = info.is_directory ? | 69 web_file_info.type = info.is_directory ? |
76 WebFileInfo::TypeDirectory : WebFileInfo::TypeFile; | 70 WebFileInfo::TypeDirectory : WebFileInfo::TypeFile; |
77 callbacks_->didReadMetadata(web_file_info); | 71 callbacks_->didReadMetadata(web_file_info); |
78 RemoveOperation(); | |
79 } | 72 } |
80 | 73 |
81 virtual void DidReadDirectory( | 74 virtual void DidReadDirectory( |
82 const std::vector<base::FileUtilProxy::Entry>& entries, | 75 const std::vector<base::FileUtilProxy::Entry>& entries, |
83 bool has_more) { | 76 bool has_more) { |
84 DCHECK(file_system_); | 77 DCHECK(file_system_); |
85 std::vector<WebFileSystemEntry> web_entries_vector; | 78 std::vector<WebFileSystemEntry> web_entries_vector; |
86 for (std::vector<base::FileUtilProxy::Entry>::const_iterator it = | 79 for (std::vector<base::FileUtilProxy::Entry>::const_iterator it = |
87 entries.begin(); it != entries.end(); ++it) { | 80 entries.begin(); it != entries.end(); ++it) { |
88 WebFileSystemEntry entry; | 81 WebFileSystemEntry entry; |
89 entry.name = webkit_glue::FilePathStringToWebString(it->name); | 82 entry.name = webkit_glue::FilePathStringToWebString(it->name); |
90 entry.isDirectory = it->is_directory; | 83 entry.isDirectory = it->is_directory; |
91 web_entries_vector.push_back(entry); | 84 web_entries_vector.push_back(entry); |
92 } | 85 } |
93 WebVector<WebKit::WebFileSystemEntry> web_entries = | 86 WebVector<WebKit::WebFileSystemEntry> web_entries = |
94 web_entries_vector; | 87 web_entries_vector; |
95 callbacks_->didReadDirectory(web_entries, has_more); | 88 callbacks_->didReadDirectory(web_entries, has_more); |
96 RemoveOperation(); | |
97 } | 89 } |
98 | 90 |
99 virtual void DidOpenFileSystem( | 91 virtual void DidOpenFileSystem( |
100 const std::string& name, const FilePath& path) { | 92 const std::string& name, const FilePath& path) { |
101 DCHECK(file_system_); | 93 DCHECK(file_system_); |
102 if (path.empty()) | 94 if (path.empty()) |
103 callbacks_->didFail(WebKit::WebFileErrorSecurity); | 95 callbacks_->didFail(WebKit::WebFileErrorSecurity); |
104 else | 96 else |
105 callbacks_->didOpenFileSystem( | 97 callbacks_->didOpenFileSystem( |
106 UTF8ToUTF16(name), webkit_glue::FilePathToWebString(path)); | 98 UTF8ToUTF16(name), webkit_glue::FilePathToWebString(path)); |
107 RemoveOperation(); | |
108 } | 99 } |
109 | 100 |
110 virtual void DidFail(base::PlatformFileError error_code) { | 101 virtual void DidFail(base::PlatformFileError error_code) { |
111 DCHECK(file_system_); | 102 DCHECK(file_system_); |
112 callbacks_->didFail( | 103 callbacks_->didFail( |
113 webkit_glue::PlatformFileErrorToWebFileError(error_code)); | 104 webkit_glue::PlatformFileErrorToWebFileError(error_code)); |
114 RemoveOperation(); | |
115 } | 105 } |
116 | 106 |
117 virtual void DidWrite(int64, bool) { | 107 virtual void DidWrite(int64, bool) { |
118 NOTREACHED(); | 108 NOTREACHED(); |
119 } | 109 } |
120 | 110 |
121 private: | 111 private: |
122 void RemoveOperation() { | |
123 // We need to make sure operation_ is null when we delete the operation | |
124 // (which in turn deletes this dispatcher instance). | |
125 scoped_ptr<SandboxedFileSystemOperation> operation; | |
126 operation.swap(operation_); | |
127 operation.reset(); | |
128 } | |
129 | |
130 WeakPtr<SimpleFileSystem> file_system_; | 112 WeakPtr<SimpleFileSystem> file_system_; |
131 WebFileSystemCallbacks* callbacks_; | 113 WebFileSystemCallbacks* callbacks_; |
132 scoped_ptr<SandboxedFileSystemOperation> operation_; | |
133 }; | 114 }; |
134 | 115 |
135 } // namespace | 116 } // namespace |
136 | 117 |
137 SimpleFileSystem::SimpleFileSystem() { | 118 SimpleFileSystem::SimpleFileSystem() { |
138 if (file_system_dir_.CreateUniqueTempDir()) { | 119 if (file_system_dir_.CreateUniqueTempDir()) { |
139 sandboxed_context_.reset(new SandboxedFileSystemContext( | 120 sandboxed_context_.reset(new SandboxedFileSystemContext( |
140 base::MessageLoopProxy::CreateForCurrentThread(), | 121 base::MessageLoopProxy::CreateForCurrentThread(), |
141 file_system_dir_.path(), | 122 file_system_dir_.path(), |
142 false /* incognito */, | 123 false /* incognito */, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 return new SimpleFileWriter(path, client); | 236 return new SimpleFileWriter(path, client); |
256 } | 237 } |
257 | 238 |
258 SandboxedFileSystemOperation* SimpleFileSystem::GetNewOperation( | 239 SandboxedFileSystemOperation* SimpleFileSystem::GetNewOperation( |
259 WebFileSystemCallbacks* callbacks) { | 240 WebFileSystemCallbacks* callbacks) { |
260 SimpleFileSystemCallbackDispatcher* dispatcher = | 241 SimpleFileSystemCallbackDispatcher* dispatcher = |
261 new SimpleFileSystemCallbackDispatcher(AsWeakPtr(), callbacks); | 242 new SimpleFileSystemCallbackDispatcher(AsWeakPtr(), callbacks); |
262 SandboxedFileSystemOperation* operation = new SandboxedFileSystemOperation( | 243 SandboxedFileSystemOperation* operation = new SandboxedFileSystemOperation( |
263 dispatcher, base::MessageLoopProxy::CreateForCurrentThread(), | 244 dispatcher, base::MessageLoopProxy::CreateForCurrentThread(), |
264 sandboxed_context_.get()); | 245 sandboxed_context_.get()); |
265 dispatcher->set_operation(operation); | |
266 return operation; | 246 return operation; |
267 } | 247 } |
OLD | NEW |