OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h
" | 5 #include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h
" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "content/public/browser/browser_ppapi_host.h" | 9 #include "content/public/browser/browser_ppapi_host.h" |
10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 void PepperFileSystemBrowserHost::OpenExisting(const GURL& root_url, | 65 void PepperFileSystemBrowserHost::OpenExisting(const GURL& root_url, |
66 const base::Closure& callback) { | 66 const base::Closure& callback) { |
67 root_url_ = root_url; | 67 root_url_ = root_url; |
68 int render_process_id = 0; | 68 int render_process_id = 0; |
69 int unused; | 69 int unused; |
70 if (!browser_ppapi_host_->GetRenderViewIDsForInstance( | 70 if (!browser_ppapi_host_->GetRenderViewIDsForInstance( |
71 pp_instance(), &render_process_id, &unused)) { | 71 pp_instance(), &render_process_id, &unused)) { |
72 NOTREACHED(); | 72 NOTREACHED(); |
73 } | 73 } |
74 called_open_ = true; | 74 called_open_ = true; |
75 // Get the file system context asynchronously, and then complete the Open | 75 // Get the file system context asynchronously, set up the file system context, |
76 // operation by calling |callback|. | 76 // and then complete the Open operation by calling |callback|. |
77 BrowserThread::PostTaskAndReplyWithResult( | 77 BrowserThread::PostTaskAndReplyWithResult( |
78 BrowserThread::UI, | 78 BrowserThread::UI, |
79 FROM_HERE, | 79 FROM_HERE, |
80 base::Bind(&GetFileSystemContextFromRenderId, render_process_id), | 80 base::Bind(&GetFileSystemContextFromRenderId, render_process_id), |
81 base::Bind(&PepperFileSystemBrowserHost::OpenExistingWithContext, | 81 base::Bind(&PepperFileSystemBrowserHost::GotFileSystemContext, |
82 weak_factory_.GetWeakPtr(), callback)); | 82 weak_factory_.GetWeakPtr(), |
| 83 base::Bind( |
| 84 &PepperFileSystemBrowserHost::OpenExistingFileSystem, |
| 85 weak_factory_.GetWeakPtr(), |
| 86 callback))); |
83 } | 87 } |
84 | 88 |
85 int32_t PepperFileSystemBrowserHost::OnResourceMessageReceived( | 89 int32_t PepperFileSystemBrowserHost::OnResourceMessageReceived( |
86 const IPC::Message& msg, | 90 const IPC::Message& msg, |
87 ppapi::host::HostMessageContext* context) { | 91 ppapi::host::HostMessageContext* context) { |
88 IPC_BEGIN_MESSAGE_MAP(PepperFileSystemBrowserHost, msg) | 92 IPC_BEGIN_MESSAGE_MAP(PepperFileSystemBrowserHost, msg) |
89 PPAPI_DISPATCH_HOST_RESOURCE_CALL( | 93 PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
90 PpapiHostMsg_FileSystem_Open, | 94 PpapiHostMsg_FileSystem_Open, |
91 OnHostMsgOpen) | 95 OnHostMsgOpen) |
92 PPAPI_DISPATCH_HOST_RESOURCE_CALL( | 96 PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
(...skipping 30 matching lines...) Expand all Loading... |
123 &unused)) { | 127 &unused)) { |
124 return PP_ERROR_FAILED; | 128 return PP_ERROR_FAILED; |
125 } | 129 } |
126 | 130 |
127 BrowserThread::PostTaskAndReplyWithResult( | 131 BrowserThread::PostTaskAndReplyWithResult( |
128 BrowserThread::UI, | 132 BrowserThread::UI, |
129 FROM_HERE, | 133 FROM_HERE, |
130 base::Bind(&GetFileSystemContextFromRenderId, render_process_id), | 134 base::Bind(&GetFileSystemContextFromRenderId, render_process_id), |
131 base::Bind(&PepperFileSystemBrowserHost::GotFileSystemContext, | 135 base::Bind(&PepperFileSystemBrowserHost::GotFileSystemContext, |
132 weak_factory_.GetWeakPtr(), | 136 weak_factory_.GetWeakPtr(), |
133 context->MakeReplyMessageContext(), | 137 base::Bind(&PepperFileSystemBrowserHost::OpenFileSystem, |
134 file_system_type)); | 138 weak_factory_.GetWeakPtr(), |
| 139 context->MakeReplyMessageContext(), |
| 140 file_system_type))); |
135 return PP_OK_COMPLETIONPENDING; | 141 return PP_OK_COMPLETIONPENDING; |
136 } | 142 } |
137 | 143 |
138 void PepperFileSystemBrowserHost::OpenExistingWithContext( | 144 void PepperFileSystemBrowserHost::OpenExistingFileSystem( |
139 const base::Closure& callback, | 145 const base::Closure& callback) { |
140 scoped_refptr<fileapi::FileSystemContext> file_system_context) { | 146 if (file_system_context_.get()) { |
141 if (file_system_context.get()) { | |
142 opened_ = true; | 147 opened_ = true; |
143 } else { | 148 } else { |
144 // If there is no file system context, we log a warning and continue with an | 149 // If there is no file system context, we log a warning and continue with an |
145 // invalid resource (which will produce errors when used), since we have no | 150 // invalid resource (which will produce errors when used), since we have no |
146 // way to communicate the error to the caller. | 151 // way to communicate the error to the caller. |
147 LOG(WARNING) << "Could not retrieve file system context."; | 152 LOG(WARNING) << "Could not retrieve file system context."; |
148 } | 153 } |
149 SetFileSystemContext(file_system_context); | |
150 callback.Run(); | 154 callback.Run(); |
151 } | 155 } |
152 | 156 |
153 void PepperFileSystemBrowserHost::GotFileSystemContext( | 157 void PepperFileSystemBrowserHost::OpenFileSystem( |
154 ppapi::host::ReplyMessageContext reply_context, | 158 ppapi::host::ReplyMessageContext reply_context, |
155 fileapi::FileSystemType file_system_type, | 159 fileapi::FileSystemType file_system_type) { |
156 scoped_refptr<fileapi::FileSystemContext> file_system_context) { | 160 if (!file_system_context_.get()) { |
157 if (!file_system_context.get()) { | |
158 OpenFileSystemComplete( | 161 OpenFileSystemComplete( |
159 reply_context, GURL(), std::string(), base::PLATFORM_FILE_ERROR_FAILED); | 162 reply_context, GURL(), std::string(), base::PLATFORM_FILE_ERROR_FAILED); |
160 return; | 163 return; |
161 } | 164 } |
162 GURL origin = browser_ppapi_host_->GetDocumentURLForInstance( | 165 GURL origin = browser_ppapi_host_->GetDocumentURLForInstance( |
163 pp_instance()).GetOrigin(); | 166 pp_instance()).GetOrigin(); |
164 file_system_context->OpenFileSystem(origin, file_system_type, | 167 file_system_context_->OpenFileSystem(origin, file_system_type, |
165 fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, | 168 fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, |
166 base::Bind(&PepperFileSystemBrowserHost::OpenFileSystemComplete, | 169 base::Bind(&PepperFileSystemBrowserHost::OpenFileSystemComplete, |
167 weak_factory_.GetWeakPtr(), reply_context)); | 170 weak_factory_.GetWeakPtr(), reply_context)); |
168 SetFileSystemContext(file_system_context); | |
169 } | 171 } |
170 | 172 |
171 void PepperFileSystemBrowserHost::OpenFileSystemComplete( | 173 void PepperFileSystemBrowserHost::OpenFileSystemComplete( |
172 ppapi::host::ReplyMessageContext reply_context, | 174 ppapi::host::ReplyMessageContext reply_context, |
173 const GURL& root, | 175 const GURL& root, |
174 const std::string& /* unused */, | 176 const std::string& /* unused */, |
175 base::PlatformFileError error) { | 177 base::PlatformFileError error) { |
176 int32 pp_error = ppapi::PlatformFileErrorToPepperError(error); | 178 int32 pp_error = ppapi::PlatformFileErrorToPepperError(error); |
177 if (pp_error == PP_OK) { | 179 if (pp_error == PP_OK) { |
178 opened_ = true; | 180 opened_ = true; |
179 root_url_ = root; | 181 root_url_ = root; |
180 } | 182 } |
181 reply_context.params.set_result(pp_error); | 183 reply_context.params.set_result(pp_error); |
182 host()->SendReply(reply_context, PpapiPluginMsg_FileSystem_OpenReply()); | 184 host()->SendReply(reply_context, PpapiPluginMsg_FileSystem_OpenReply()); |
183 } | 185 } |
184 | 186 |
185 void PepperFileSystemBrowserHost::GotIsolatedFileSystemContext( | 187 void PepperFileSystemBrowserHost::OpenIsolatedFileSystem( |
186 ppapi::host::ReplyMessageContext reply_context, | 188 ppapi::host::ReplyMessageContext reply_context, |
187 const std::string& fsid, | 189 const std::string& fsid, |
188 PP_IsolatedFileSystemType_Private type, | 190 PP_IsolatedFileSystemType_Private type) { |
189 scoped_refptr<fileapi::FileSystemContext> file_system_context) { | 191 if (!file_system_context_.get()) { |
190 if (!file_system_context.get()) { | |
191 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED); | 192 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED); |
192 return; | 193 return; |
193 } | 194 } |
194 SetFileSystemContext(file_system_context); | |
195 | 195 |
196 root_url_ = GURL(fileapi::GetIsolatedFileSystemRootURIString( | 196 root_url_ = GURL(fileapi::GetIsolatedFileSystemRootURIString( |
197 browser_ppapi_host_->GetDocumentURLForInstance(pp_instance()).GetOrigin(), | 197 browser_ppapi_host_->GetDocumentURLForInstance(pp_instance()).GetOrigin(), |
198 fsid, ppapi::IsolatedFileSystemTypeToRootName(type))); | 198 fsid, ppapi::IsolatedFileSystemTypeToRootName(type))); |
199 if (!root_url_.is_valid()) { | 199 if (!root_url_.is_valid()) { |
200 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED); | 200 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED); |
201 return; | 201 return; |
202 } | 202 } |
203 | 203 |
204 switch (type) { | 204 switch (type) { |
205 case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_CRX: | 205 case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_CRX: |
206 opened_ = true; | 206 opened_ = true; |
207 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_OK); | 207 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_OK); |
208 return; | 208 return; |
209 case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_PLUGINPRIVATE: | 209 case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_PLUGINPRIVATE: |
210 OpenPluginPrivateFileSystem(reply_context, fsid, file_system_context_); | 210 OpenPluginPrivateFileSystem(reply_context, fsid); |
211 return; | 211 return; |
212 default: | 212 default: |
213 NOTREACHED(); | 213 NOTREACHED(); |
214 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT); | 214 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT); |
215 return; | 215 return; |
216 } | 216 } |
217 } | 217 } |
218 | 218 |
219 void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystem( | 219 void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystem( |
220 ppapi::host::ReplyMessageContext reply_context, | 220 ppapi::host::ReplyMessageContext reply_context, |
221 const std::string& fsid, | 221 const std::string& fsid) { |
222 scoped_refptr<fileapi::FileSystemContext> file_system_context) { | |
223 GURL origin = browser_ppapi_host_->GetDocumentURLForInstance( | 222 GURL origin = browser_ppapi_host_->GetDocumentURLForInstance( |
224 pp_instance()).GetOrigin(); | 223 pp_instance()).GetOrigin(); |
225 if (!origin.is_valid()) { | 224 if (!origin.is_valid()) { |
226 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED); | 225 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED); |
227 return; | 226 return; |
228 } | 227 } |
229 | 228 |
230 const std::string& plugin_id = GeneratePluginId(GetPluginMimeType()); | 229 const std::string& plugin_id = GeneratePluginId(GetPluginMimeType()); |
231 if (plugin_id.empty()) { | 230 if (plugin_id.empty()) { |
232 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT); | 231 SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT); |
233 return; | 232 return; |
234 } | 233 } |
235 | 234 |
236 file_system_context->OpenPluginPrivateFileSystem( | 235 file_system_context_->OpenPluginPrivateFileSystem( |
237 origin, fileapi::kFileSystemTypePluginPrivate, fsid, plugin_id, | 236 origin, fileapi::kFileSystemTypePluginPrivate, fsid, plugin_id, |
238 fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, | 237 fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, |
239 base::Bind( | 238 base::Bind( |
240 &PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete, | 239 &PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete, |
241 weak_factory_.GetWeakPtr(), reply_context, fsid)); | 240 weak_factory_.GetWeakPtr(), reply_context, fsid)); |
242 } | 241 } |
243 | 242 |
244 void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete( | 243 void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete( |
245 ppapi::host::ReplyMessageContext reply_context, | 244 ppapi::host::ReplyMessageContext reply_context, |
246 const std::string& fsid, | 245 const std::string& fsid, |
(...skipping 23 matching lines...) Expand all Loading... |
270 &render_process_id, | 269 &render_process_id, |
271 &unused)) { | 270 &unused)) { |
272 fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); | 271 fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); |
273 return PP_ERROR_FAILED; | 272 return PP_ERROR_FAILED; |
274 } | 273 } |
275 | 274 |
276 BrowserThread::PostTaskAndReplyWithResult( | 275 BrowserThread::PostTaskAndReplyWithResult( |
277 BrowserThread::UI, | 276 BrowserThread::UI, |
278 FROM_HERE, | 277 FROM_HERE, |
279 base::Bind(&GetFileSystemContextFromRenderId, render_process_id), | 278 base::Bind(&GetFileSystemContextFromRenderId, render_process_id), |
280 base::Bind(&PepperFileSystemBrowserHost::GotIsolatedFileSystemContext, | 279 base::Bind(&PepperFileSystemBrowserHost::GotFileSystemContext, |
281 weak_factory_.GetWeakPtr(), | 280 weak_factory_.GetWeakPtr(), |
282 context->MakeReplyMessageContext(), fsid, type)); | 281 base::Bind( |
| 282 &PepperFileSystemBrowserHost::OpenIsolatedFileSystem, |
| 283 weak_factory_.GetWeakPtr(), |
| 284 context->MakeReplyMessageContext(), fsid, type))); |
| 285 |
283 return PP_OK_COMPLETIONPENDING; | 286 return PP_OK_COMPLETIONPENDING; |
284 } | 287 } |
285 | 288 |
286 void PepperFileSystemBrowserHost::SendReplyForIsolatedFileSystem( | 289 void PepperFileSystemBrowserHost::SendReplyForIsolatedFileSystem( |
287 ppapi::host::ReplyMessageContext reply_context, | 290 ppapi::host::ReplyMessageContext reply_context, |
288 const std::string& fsid, | 291 const std::string& fsid, |
289 int32_t error) { | 292 int32_t error) { |
290 if (error != PP_OK) | 293 if (error != PP_OK) |
291 fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); | 294 fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); |
292 reply_context.params.set_result(error); | 295 reply_context.params.set_result(error); |
293 host()->SendReply(reply_context, | 296 host()->SendReply(reply_context, |
294 PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); | 297 PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); |
295 } | 298 } |
296 | 299 |
297 void PepperFileSystemBrowserHost::SetFileSystemContext( | 300 void PepperFileSystemBrowserHost::GotFileSystemContext( |
| 301 const base::Closure& closure, |
298 scoped_refptr<fileapi::FileSystemContext> file_system_context) { | 302 scoped_refptr<fileapi::FileSystemContext> file_system_context) { |
299 file_system_context_ = file_system_context; | 303 file_system_context_ = file_system_context; |
300 if (type_ != PP_FILESYSTEMTYPE_EXTERNAL) { | 304 if (type_ != PP_FILESYSTEMTYPE_EXTERNAL) { |
301 file_system_operation_runner_ = | 305 file_system_operation_runner_ = |
302 file_system_context_->CreateFileSystemOperationRunner(); | 306 file_system_context_->CreateFileSystemOperationRunner(); |
303 } | 307 } |
| 308 closure.Run(); |
304 } | 309 } |
305 | 310 |
306 std::string PepperFileSystemBrowserHost::GetPluginMimeType() const { | 311 std::string PepperFileSystemBrowserHost::GetPluginMimeType() const { |
307 base::FilePath plugin_path = browser_ppapi_host_->GetPluginPath(); | 312 base::FilePath plugin_path = browser_ppapi_host_->GetPluginPath(); |
308 PepperPluginInfo* info = | 313 PepperPluginInfo* info = |
309 PluginService::GetInstance()->GetRegisteredPpapiPluginInfo(plugin_path); | 314 PluginService::GetInstance()->GetRegisteredPpapiPluginInfo(plugin_path); |
310 if (!info || info->mime_types.empty()) | 315 if (!info || info->mime_types.empty()) |
311 return std::string(); | 316 return std::string(); |
312 // Use the first element in |info->mime_types| even if several elements exist. | 317 // Use the first element in |info->mime_types| even if several elements exist. |
313 return info->mime_types[0].mime_type; | 318 return info->mime_types[0].mime_type; |
(...skipping 19 matching lines...) Expand all Loading... |
333 if (!IsAsciiAlpha(*it) && !IsAsciiDigit(*it) && | 338 if (!IsAsciiAlpha(*it) && !IsAsciiDigit(*it) && |
334 *it != '.' && *it != '_' && *it != '-') { | 339 *it != '.' && *it != '_' && *it != '-') { |
335 LOG(WARNING) << "Failed to generate a plugin id."; | 340 LOG(WARNING) << "Failed to generate a plugin id."; |
336 return std::string(); | 341 return std::string(); |
337 } | 342 } |
338 } | 343 } |
339 return output; | 344 return output; |
340 } | 345 } |
341 | 346 |
342 } // namespace content | 347 } // namespace content |
OLD | NEW |