OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2010, 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 15 matching lines...) Expand all Loading... |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "config.h" | 31 #include "config.h" |
32 #include "WorkerFileSystemCallbacksBridge.h" | 32 #include "WorkerFileSystemCallbacksBridge.h" |
33 | 33 |
34 #if ENABLE(FILE_SYSTEM) && ENABLE(WORKERS) | 34 #if ENABLE(FILE_SYSTEM) && ENABLE(WORKERS) |
35 | 35 |
| 36 #include "BlobData.h" |
36 #include "CrossThreadTask.h" | 37 #include "CrossThreadTask.h" |
37 #include "KURL.h" | 38 #include "KURL.h" |
38 #include "WebCommonWorkerClient.h" | 39 #include "WebCommonWorkerClient.h" |
39 #include "WebFileSystemCallbacks.h" | 40 #include "WebFileSystemCallbacksImpl.h" |
40 #include "WebFileSystemEntry.h" | 41 #include "WebFileSystemEntry.h" |
41 #include "WebWorkerBase.h" | 42 #include "WebWorkerBase.h" |
42 #include "WorkerContext.h" | 43 #include "WorkerContext.h" |
43 #include "WorkerLoaderProxy.h" | 44 #include "WorkerLoaderProxy.h" |
44 #include "WorkerScriptController.h" | 45 #include "WorkerScriptController.h" |
45 #include "WorkerThread.h" | 46 #include "WorkerThread.h" |
46 #include <public/WebFileInfo.h> | 47 #include <public/WebFileInfo.h> |
47 #include <public/WebString.h> | 48 #include <public/WebString.h> |
48 #include <public/WebURL.h> | 49 #include <public/WebURL.h> |
49 #include <wtf/MainThread.h> | 50 #include <wtf/MainThread.h> |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 m_bridge->didSucceedOnMainThread(m_mode); | 118 m_bridge->didSucceedOnMainThread(m_mode); |
118 delete this; | 119 delete this; |
119 } | 120 } |
120 | 121 |
121 virtual void didReadMetadata(const WebFileInfo& info) | 122 virtual void didReadMetadata(const WebFileInfo& info) |
122 { | 123 { |
123 m_bridge->didReadMetadataOnMainThread(info, m_mode); | 124 m_bridge->didReadMetadataOnMainThread(info, m_mode); |
124 delete this; | 125 delete this; |
125 } | 126 } |
126 | 127 |
| 128 virtual void didCreateSnapshotFile(const WebFileInfo& info) |
| 129 { |
| 130 // It's important to create a BlobDataHandle that refers to the platform
file path prior |
| 131 // to return from this method so the underlying file will not be deleted
. |
| 132 OwnPtr<BlobData> blobData = BlobData::create(); |
| 133 blobData->appendFile(info.platformPath); |
| 134 RefPtr<BlobDataHandle> snapshotBlob = BlobDataHandle::create(blobData.re
lease(), info.length); |
| 135 m_bridge->didCreateSnapshotFileOnMainThread(info, m_mode, snapshotBlob); |
| 136 delete this; |
| 137 } |
| 138 |
127 virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries,
bool hasMore) | 139 virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries,
bool hasMore) |
128 { | 140 { |
129 m_bridge->didReadDirectoryOnMainThread(entries, hasMore, m_mode); | 141 m_bridge->didReadDirectoryOnMainThread(entries, hasMore, m_mode); |
130 delete this; | 142 delete this; |
131 } | 143 } |
132 | 144 |
133 private: | 145 private: |
134 MainThreadFileSystemCallbacks(PassRefPtr<WorkerFileSystemCallbacksBridge> br
idge, const String& mode) | 146 MainThreadFileSystemCallbacks(PassRefPtr<WorkerFileSystemCallbacksBridge> br
idge, const String& mode) |
135 : m_bridge(bridge) | 147 : m_bridge(bridge) |
136 , m_mode(mode) | 148 , m_mode(mode) |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 | 294 |
283 void WorkerFileSystemCallbacksBridge::postReadDirectoryToMainThread(WebFileSyste
m* fileSystem, const KURL& path, const String& mode) | 295 void WorkerFileSystemCallbacksBridge::postReadDirectoryToMainThread(WebFileSyste
m* fileSystem, const KURL& path, const String& mode) |
284 { | 296 { |
285 ASSERT(fileSystem); | 297 ASSERT(fileSystem); |
286 dispatchTaskToMainThread( | 298 dispatchTaskToMainThread( |
287 createCallbackTask(&readDirectoryOnMainThread, | 299 createCallbackTask(&readDirectoryOnMainThread, |
288 AllowCrossThreadAccess(fileSystem), path, | 300 AllowCrossThreadAccess(fileSystem), path, |
289 this, mode)); | 301 this, mode)); |
290 } | 302 } |
291 | 303 |
292 void WorkerFileSystemCallbacksBridge::postCreateSnapshotFileToMainThread(WebFile
System* fileSystem, const KURL& internalBlobURL, const KURL& path, const String&
mode) | 304 void WorkerFileSystemCallbacksBridge::postCreateSnapshotFileToMainThread(WebFile
System* fileSystem, const KURL& path, const String& mode) |
293 { | 305 { |
294 ASSERT(fileSystem); | 306 ASSERT(fileSystem); |
295 dispatchTaskToMainThread( | 307 dispatchTaskToMainThread( |
296 createCallbackTask(&createSnapshotFileOnMainThread, | 308 createCallbackTask(&createSnapshotFileOnMainThread, |
297 AllowCrossThreadAccess(fileSystem), | 309 AllowCrossThreadAccess(fileSystem), |
298 internalBlobURL, path, this, mode)); | 310 path, this, mode)); |
299 } | 311 } |
300 | 312 |
301 void WorkerFileSystemCallbacksBridge::openFileSystemOnMainThread(ScriptExecution
Context*, WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long lo
ng size, bool create, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const
String& mode) | 313 void WorkerFileSystemCallbacksBridge::openFileSystemOnMainThread(ScriptExecution
Context*, WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long lo
ng size, bool create, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const
String& mode) |
302 { | 314 { |
303 if (!commonClient) | 315 if (!commonClient) |
304 bridge->didFailOnMainThread(WebFileErrorAbort, mode); | 316 bridge->didFailOnMainThread(WebFileErrorAbort, mode); |
305 else { | 317 else { |
306 commonClient->openFileSystem(type, size, create, MainThreadFileSystemCal
lbacks::createLeakedPtr(bridge, mode)); | 318 commonClient->openFileSystem(type, size, create, MainThreadFileSystemCal
lbacks::createLeakedPtr(bridge, mode)); |
307 } | 319 } |
308 } | 320 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 void WorkerFileSystemCallbacksBridge::directoryExistsOnMainThread(WebCore::Scrip
tExecutionContext*, WebFileSystem* fileSystem, const KURL& path, PassRefPtr<Work
erFileSystemCallbacksBridge> bridge, const String& mode) | 362 void WorkerFileSystemCallbacksBridge::directoryExistsOnMainThread(WebCore::Scrip
tExecutionContext*, WebFileSystem* fileSystem, const KURL& path, PassRefPtr<Work
erFileSystemCallbacksBridge> bridge, const String& mode) |
351 { | 363 { |
352 fileSystem->directoryExists(path, MainThreadFileSystemCallbacks::createLeake
dPtr(bridge, mode)); | 364 fileSystem->directoryExists(path, MainThreadFileSystemCallbacks::createLeake
dPtr(bridge, mode)); |
353 } | 365 } |
354 | 366 |
355 void WorkerFileSystemCallbacksBridge::readDirectoryOnMainThread(WebCore::ScriptE
xecutionContext*, WebFileSystem* fileSystem, const KURL& path, PassRefPtr<Worker
FileSystemCallbacksBridge> bridge, const String& mode) | 367 void WorkerFileSystemCallbacksBridge::readDirectoryOnMainThread(WebCore::ScriptE
xecutionContext*, WebFileSystem* fileSystem, const KURL& path, PassRefPtr<Worker
FileSystemCallbacksBridge> bridge, const String& mode) |
356 { | 368 { |
357 fileSystem->readDirectory(path, MainThreadFileSystemCallbacks::createLeakedP
tr(bridge, mode)); | 369 fileSystem->readDirectory(path, MainThreadFileSystemCallbacks::createLeakedP
tr(bridge, mode)); |
358 } | 370 } |
359 | 371 |
360 void WorkerFileSystemCallbacksBridge::createSnapshotFileOnMainThread(WebCore::Sc
riptExecutionContext*, WebFileSystem* fileSystem, const KURL& internalBlobURL, c
onst KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const Strin
g& mode) | 372 void WorkerFileSystemCallbacksBridge::createSnapshotFileOnMainThread(WebCore::Sc
riptExecutionContext*, WebFileSystem* fileSystem, const KURL& path, PassRefPtr<W
orkerFileSystemCallbacksBridge> bridge, const String& mode) |
361 { | 373 { |
362 fileSystem->createSnapshotFileAndReadMetadata(internalBlobURL, path, MainThr
eadFileSystemCallbacks::createLeakedPtr(bridge, mode)); | 374 fileSystem->createSnapshotFileAndReadMetadata(path, MainThreadFileSystemCall
backs::createLeakedPtr(bridge, mode)); |
363 } | 375 } |
364 | 376 |
365 void WorkerFileSystemCallbacksBridge::didFailOnMainThread(WebFileError error, co
nst String& mode) | 377 void WorkerFileSystemCallbacksBridge::didFailOnMainThread(WebFileError error, co
nst String& mode) |
366 { | 378 { |
367 mayPostTaskToWorker(createCallbackTask(&didFailOnWorkerThread, this, error),
mode); | 379 mayPostTaskToWorker(createCallbackTask(&didFailOnWorkerThread, this, error),
mode); |
368 } | 380 } |
369 | 381 |
370 void WorkerFileSystemCallbacksBridge::didOpenFileSystemOnMainThread(const String
& name, const KURL& rootURL, const String& mode) | 382 void WorkerFileSystemCallbacksBridge::didOpenFileSystemOnMainThread(const String
& name, const KURL& rootURL, const String& mode) |
371 { | 383 { |
372 mayPostTaskToWorker(createCallbackTask(&didOpenFileSystemOnWorkerThread, | 384 mayPostTaskToWorker(createCallbackTask(&didOpenFileSystemOnWorkerThread, |
373 this, name, rootURL), mode); | 385 this, name, rootURL), mode); |
374 } | 386 } |
375 | 387 |
376 void WorkerFileSystemCallbacksBridge::didSucceedOnMainThread(const String& mode) | 388 void WorkerFileSystemCallbacksBridge::didSucceedOnMainThread(const String& mode) |
377 { | 389 { |
378 mayPostTaskToWorker(createCallbackTask(&didSucceedOnWorkerThread, this), mod
e); | 390 mayPostTaskToWorker(createCallbackTask(&didSucceedOnWorkerThread, this), mod
e); |
379 } | 391 } |
380 | 392 |
381 void WorkerFileSystemCallbacksBridge::didReadMetadataOnMainThread(const WebFileI
nfo& info, const String& mode) | 393 void WorkerFileSystemCallbacksBridge::didReadMetadataOnMainThread(const WebFileI
nfo& info, const String& mode) |
382 { | 394 { |
383 mayPostTaskToWorker(createCallbackTask(&didReadMetadataOnWorkerThread, this,
info), mode); | 395 mayPostTaskToWorker(createCallbackTask(&didReadMetadataOnWorkerThread, this,
info), mode); |
384 } | 396 } |
385 | 397 |
| 398 void WorkerFileSystemCallbacksBridge::didCreateSnapshotFileOnMainThread(const We
bFileInfo& info, const String& mode, PassRefPtr<BlobDataHandle> snapshotBlob) |
| 399 { |
| 400 mayPostTaskToWorker(createCallbackTask(&didCreateSnapshotFileOnWorkerThread,
this, info, snapshotBlob), mode); |
| 401 } |
| 402 |
386 void WorkerFileSystemCallbacksBridge::didReadDirectoryOnMainThread(const WebVect
or<WebFileSystemEntry>& entries, bool hasMore, const String& mode) | 403 void WorkerFileSystemCallbacksBridge::didReadDirectoryOnMainThread(const WebVect
or<WebFileSystemEntry>& entries, bool hasMore, const String& mode) |
387 { | 404 { |
388 mayPostTaskToWorker( | 405 mayPostTaskToWorker( |
389 createCallbackTask(&didReadDirectoryOnWorkerThread, | 406 createCallbackTask(&didReadDirectoryOnWorkerThread, |
390 this, entries, hasMore), mode); | 407 this, entries, hasMore), mode); |
391 } | 408 } |
392 | 409 |
393 WorkerFileSystemCallbacksBridge::WorkerFileSystemCallbacksBridge(WebCore::Worker
LoaderProxy* workerLoaderProxy, ScriptExecutionContext* scriptExecutionContext,
WebFileSystemCallbacks* callbacks) | 410 WorkerFileSystemCallbacksBridge::WorkerFileSystemCallbacksBridge(WebCore::Worker
LoaderProxy* workerLoaderProxy, ScriptExecutionContext* scriptExecutionContext,
WebFileSystemCallbacksImpl* callbacks) |
394 : m_workerLoaderProxy(workerLoaderProxy) | 411 : m_workerLoaderProxy(workerLoaderProxy) |
395 , m_workerContext(scriptExecutionContext) | 412 , m_workerContext(scriptExecutionContext) |
396 , m_workerContextObserver(WorkerFileSystemContextObserver::create(static_cas
t<WorkerContext*>(m_workerContext), this).leakPtr()) | 413 , m_workerContextObserver(WorkerFileSystemContextObserver::create(static_cas
t<WorkerContext*>(m_workerContext), this).leakPtr()) |
397 , m_callbacksOnWorkerThread(callbacks) | 414 , m_callbacksOnWorkerThread(callbacks) |
398 { | 415 { |
399 ASSERT(m_workerContext->isContextThread()); | 416 ASSERT(m_workerContext->isContextThread()); |
400 } | 417 } |
401 | 418 |
402 WorkerFileSystemCallbacksBridge::~WorkerFileSystemCallbacksBridge() | 419 WorkerFileSystemCallbacksBridge::~WorkerFileSystemCallbacksBridge() |
403 { | 420 { |
(...skipping 13 matching lines...) Expand all Loading... |
417 void WorkerFileSystemCallbacksBridge::didSucceedOnWorkerThread(ScriptExecutionCo
ntext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge) | 434 void WorkerFileSystemCallbacksBridge::didSucceedOnWorkerThread(ScriptExecutionCo
ntext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge) |
418 { | 435 { |
419 bridge->m_callbacksOnWorkerThread->didSucceed(); | 436 bridge->m_callbacksOnWorkerThread->didSucceed(); |
420 } | 437 } |
421 | 438 |
422 void WorkerFileSystemCallbacksBridge::didReadMetadataOnWorkerThread(ScriptExecut
ionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const WebFileIn
fo& info) | 439 void WorkerFileSystemCallbacksBridge::didReadMetadataOnWorkerThread(ScriptExecut
ionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const WebFileIn
fo& info) |
423 { | 440 { |
424 bridge->m_callbacksOnWorkerThread->didReadMetadata(info); | 441 bridge->m_callbacksOnWorkerThread->didReadMetadata(info); |
425 } | 442 } |
426 | 443 |
| 444 void WorkerFileSystemCallbacksBridge::didCreateSnapshotFileOnWorkerThread(Script
ExecutionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const Web
FileInfo& info, PassRefPtr<BlobDataHandle> snapshotBlob) |
| 445 { |
| 446 bridge->m_callbacksOnWorkerThread->didCreateSnapshotFile(info, snapshotBlob)
; |
| 447 } |
| 448 |
427 void WorkerFileSystemCallbacksBridge::didReadDirectoryOnWorkerThread(ScriptExecu
tionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const WebVecto
r<WebFileSystemEntry>& entries, bool hasMore) | 449 void WorkerFileSystemCallbacksBridge::didReadDirectoryOnWorkerThread(ScriptExecu
tionContext*, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const WebVecto
r<WebFileSystemEntry>& entries, bool hasMore) |
428 { | 450 { |
429 bridge->m_callbacksOnWorkerThread->didReadDirectory(entries, hasMore); | 451 bridge->m_callbacksOnWorkerThread->didReadDirectory(entries, hasMore); |
430 } | 452 } |
431 | 453 |
432 | 454 |
433 void WorkerFileSystemCallbacksBridge::runTaskOnMainThread(WebCore::ScriptExecuti
onContext* scriptExecutionContext, PassRefPtr<WorkerFileSystemCallbacksBridge> b
ridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun) | 455 void WorkerFileSystemCallbacksBridge::runTaskOnMainThread(WebCore::ScriptExecuti
onContext* scriptExecutionContext, PassRefPtr<WorkerFileSystemCallbacksBridge> b
ridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun) |
434 { | 456 { |
435 ASSERT(isMainThread()); | 457 ASSERT(isMainThread()); |
436 taskToRun->performTask(scriptExecutionContext); | 458 taskToRun->performTask(scriptExecutionContext); |
(...skipping 25 matching lines...) Expand all Loading... |
462 ASSERT(isMainThread()); | 484 ASSERT(isMainThread()); |
463 | 485 |
464 MutexLocker locker(m_loaderProxyMutex); | 486 MutexLocker locker(m_loaderProxyMutex); |
465 if (m_workerLoaderProxy) | 487 if (m_workerLoaderProxy) |
466 m_workerLoaderProxy->postTaskForModeToWorkerContext(createCallbackTask(&
runTaskOnWorkerThread, this, task), mode); | 488 m_workerLoaderProxy->postTaskForModeToWorkerContext(createCallbackTask(&
runTaskOnWorkerThread, this, task), mode); |
467 } | 489 } |
468 | 490 |
469 } // namespace WebCore | 491 } // namespace WebCore |
470 | 492 |
471 #endif // ENABLE(FILE_SYSTEM) | 493 #endif // ENABLE(FILE_SYSTEM) |
OLD | NEW |