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 25 matching lines...) Expand all Loading... |
36 #include "ScriptExecutionContext.h" | 36 #include "ScriptExecutionContext.h" |
37 #include "WebFileError.h" | 37 #include "WebFileError.h" |
38 #include <public/WebFileSystem.h> | 38 #include <public/WebFileSystem.h> |
39 #include <public/WebVector.h> | 39 #include <public/WebVector.h> |
40 #include <wtf/PassOwnPtr.h> | 40 #include <wtf/PassOwnPtr.h> |
41 #include <wtf/PassRefPtr.h> | 41 #include <wtf/PassRefPtr.h> |
42 #include <wtf/Threading.h> | 42 #include <wtf/Threading.h> |
43 #include <wtf/text/WTFString.h> | 43 #include <wtf/text/WTFString.h> |
44 | 44 |
45 namespace WebCore { | 45 namespace WebCore { |
| 46 class BlobDataHandle; |
46 class WorkerLoaderProxy; | 47 class WorkerLoaderProxy; |
47 } | 48 } |
48 | 49 |
49 namespace WebKit { | 50 namespace WebKit { |
50 | 51 |
51 class AsyncFileSystem; | 52 class AsyncFileSystem; |
52 class MainThreadFileSystemCallbacks; | 53 class MainThreadFileSystemCallbacks; |
53 class WebCommonWorkerClient; | 54 class WebCommonWorkerClient; |
54 class ThreadableCallbacksBridgeWrapper; | 55 class ThreadableCallbacksBridgeWrapper; |
55 class WebFileSystemCallbacks; | 56 class WebFileSystemCallbacksImpl; |
56 class WorkerFileSystemContextObserver; | 57 class WorkerFileSystemContextObserver; |
57 struct WebFileInfo; | 58 struct WebFileInfo; |
58 struct WebFileSystemEntry; | 59 struct WebFileSystemEntry; |
59 | 60 |
60 // Used to post a openFileSystem request to the main thread and get called back
for the request. | 61 // Used to post a openFileSystem request to the main thread and get called back
for the request. |
61 // | 62 // |
62 // Lifetime for this class is maintained by posted "tasks" which ref count it an
d by MainThreadFileSystemCallbacks. | 63 // Lifetime for this class is maintained by posted "tasks" which ref count it an
d by MainThreadFileSystemCallbacks. |
63 // Either a task finishing or the MainThreadFileSystemCallbacks being deleted ma
y release the last ref on WorkerFileSystemCallbacksBridge. | 64 // Either a task finishing or the MainThreadFileSystemCallbacks being deleted ma
y release the last ref on WorkerFileSystemCallbacksBridge. |
64 // | 65 // |
65 // A typical flow for openFileSystem would look like this: | 66 // A typical flow for openFileSystem would look like this: |
66 // Bridge::postOpenFileSystemToMainThread() on WorkerThread | 67 // Bridge::postOpenFileSystemToMainThread() on WorkerThread |
67 // --> Bridge::openFileSystemOnMainThread() is called on MainThread | 68 // --> Bridge::openFileSystemOnMainThread() is called on MainThread |
68 // This makes an IPC with a MainThreadFileSystemCallbacks instance | 69 // This makes an IPC with a MainThreadFileSystemCallbacks instance |
69 // [actual operation is down in the browser] | 70 // [actual operation is down in the browser] |
70 // --> MainThreadFileSystemCallbacks::didXxx is called on MainThread | 71 // --> MainThreadFileSystemCallbacks::didXxx is called on MainThread |
71 // --> Bridge::didXxxOnMainThread is called on MainThread | 72 // --> Bridge::didXxxOnMainThread is called on MainThread |
72 // --> Bridge::didXxxOnWorkerThread is called on WorkerThread | 73 // --> Bridge::didXxxOnWorkerThread is called on WorkerThread |
73 // This calls the original callbacks (m_callbacksOnWorkerThread). | 74 // This calls the original callbacks (m_callbacksOnWorkerThread). |
74 class WorkerFileSystemCallbacksBridge : public ThreadSafeRefCounted<WorkerFileSy
stemCallbacksBridge> { | 75 class WorkerFileSystemCallbacksBridge : public ThreadSafeRefCounted<WorkerFileSy
stemCallbacksBridge> { |
75 public: | 76 public: |
76 ~WorkerFileSystemCallbacksBridge(); | 77 ~WorkerFileSystemCallbacksBridge(); |
77 | 78 |
78 void stop(); | 79 void stop(); |
79 | 80 |
80 static PassRefPtr<WorkerFileSystemCallbacksBridge> create(WebCore::WorkerLoa
derProxy* workerLoaderProxy, WebCore::ScriptExecutionContext* workerContext, Web
FileSystemCallbacks* callbacks) | 81 static PassRefPtr<WorkerFileSystemCallbacksBridge> create(WebCore::WorkerLoa
derProxy* workerLoaderProxy, WebCore::ScriptExecutionContext* workerContext, Web
FileSystemCallbacksImpl* callbacks) |
81 { | 82 { |
82 return adoptRef(new WorkerFileSystemCallbacksBridge(workerLoaderProxy, w
orkerContext, callbacks)); | 83 return adoptRef(new WorkerFileSystemCallbacksBridge(workerLoaderProxy, w
orkerContext, callbacks)); |
83 } | 84 } |
84 | 85 |
85 // Methods that create an instance and post an initial request task to the m
ain thread. They must be called on the worker thread. | 86 // Methods that create an instance and post an initial request task to the m
ain thread. They must be called on the worker thread. |
86 void postOpenFileSystemToMainThread(WebCommonWorkerClient*, WebFileSystem::T
ype, long long size, bool create, const String& mode); | 87 void postOpenFileSystemToMainThread(WebCommonWorkerClient*, WebFileSystem::T
ype, long long size, bool create, const String& mode); |
87 void postMoveToMainThread(WebFileSystem*, const WebCore::KURL& srcPath, cons
t WebCore::KURL& destPath, const String& mode); | 88 void postMoveToMainThread(WebFileSystem*, const WebCore::KURL& srcPath, cons
t WebCore::KURL& destPath, const String& mode); |
88 void postCopyToMainThread(WebFileSystem*, const WebCore::KURL& srcPath, cons
t WebCore::KURL& destPath, const String& mode); | 89 void postCopyToMainThread(WebFileSystem*, const WebCore::KURL& srcPath, cons
t WebCore::KURL& destPath, const String& mode); |
89 void postRemoveToMainThread(WebFileSystem*, const WebCore::KURL& path, const
String& mode); | 90 void postRemoveToMainThread(WebFileSystem*, const WebCore::KURL& path, const
String& mode); |
90 void postRemoveRecursivelyToMainThread(WebFileSystem*, const WebCore::KURL&
path, const String& mode); | 91 void postRemoveRecursivelyToMainThread(WebFileSystem*, const WebCore::KURL&
path, const String& mode); |
91 void postReadMetadataToMainThread(WebFileSystem*, const WebCore::KURL& path,
const String& mode); | 92 void postReadMetadataToMainThread(WebFileSystem*, const WebCore::KURL& path,
const String& mode); |
92 void postCreateFileToMainThread(WebFileSystem*, const WebCore::KURL& path, b
ool exclusive, const String& mode); | 93 void postCreateFileToMainThread(WebFileSystem*, const WebCore::KURL& path, b
ool exclusive, const String& mode); |
93 void postCreateDirectoryToMainThread(WebFileSystem*, const WebCore::KURL& pa
th, bool exclusive, const String& mode); | 94 void postCreateDirectoryToMainThread(WebFileSystem*, const WebCore::KURL& pa
th, bool exclusive, const String& mode); |
94 void postFileExistsToMainThread(WebFileSystem*, const WebCore::KURL& path, c
onst String& mode); | 95 void postFileExistsToMainThread(WebFileSystem*, const WebCore::KURL& path, c
onst String& mode); |
95 void postDirectoryExistsToMainThread(WebFileSystem*, const WebCore::KURL& pa
th, const String& mode); | 96 void postDirectoryExistsToMainThread(WebFileSystem*, const WebCore::KURL& pa
th, const String& mode); |
96 void postReadDirectoryToMainThread(WebFileSystem*, const WebCore::KURL& path
, const String& mode); | 97 void postReadDirectoryToMainThread(WebFileSystem*, const WebCore::KURL& path
, const String& mode); |
97 void postCreateSnapshotFileToMainThread(WebFileSystem*, const WebCore::KURL&
internalBlobURL, const WebCore::KURL& path, const String& mode); | 98 void postCreateSnapshotFileToMainThread(WebFileSystem*, const WebCore::KURL&
path, const String& mode); |
98 | 99 |
99 // Callback methods that are called on the main thread. | 100 // Callback methods that are called on the main thread. |
100 void didFailOnMainThread(WebFileError, const String& mode); | 101 void didFailOnMainThread(WebFileError, const String& mode); |
101 void didOpenFileSystemOnMainThread(const String& name, const WebCore::KURL&
rootURL, const String& mode); | 102 void didOpenFileSystemOnMainThread(const String& name, const WebCore::KURL&
rootURL, const String& mode); |
102 void didSucceedOnMainThread(const String& mode); | 103 void didSucceedOnMainThread(const String& mode); |
103 void didReadMetadataOnMainThread(const WebFileInfo&, const String& mode); | 104 void didReadMetadataOnMainThread(const WebFileInfo&, const String& mode); |
| 105 void didCreateSnapshotFileOnMainThread(const WebFileInfo&, const String& mod
e, PassRefPtr<WebCore::BlobDataHandle> snapshotBlob); |
104 void didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>&, bool
hasMore, const String& mode); | 106 void didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>&, bool
hasMore, const String& mode); |
105 | 107 |
106 private: | 108 private: |
107 WorkerFileSystemCallbacksBridge(WebCore::WorkerLoaderProxy*, WebCore::Script
ExecutionContext*, WebFileSystemCallbacks*); | 109 WorkerFileSystemCallbacksBridge(WebCore::WorkerLoaderProxy*, WebCore::Script
ExecutionContext*, WebFileSystemCallbacksImpl*); |
108 | 110 |
109 // Methods that are to be called on the main thread. | 111 // Methods that are to be called on the main thread. |
110 static void openFileSystemOnMainThread(WebCore::ScriptExecutionContext*, Web
CommonWorkerClient*, WebFileSystem::Type, long long size, bool create, PassRefPt
r<WorkerFileSystemCallbacksBridge>, const String& mode); | 112 static void openFileSystemOnMainThread(WebCore::ScriptExecutionContext*, Web
CommonWorkerClient*, WebFileSystem::Type, long long size, bool create, PassRefPt
r<WorkerFileSystemCallbacksBridge>, const String& mode); |
111 static void moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem
*, const WebCore::KURL& srcPath, const WebCore::KURL& destPath, PassRefPtr<Worke
rFileSystemCallbacksBridge>, const String& mode); | 113 static void moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem
*, const WebCore::KURL& srcPath, const WebCore::KURL& destPath, PassRefPtr<Worke
rFileSystemCallbacksBridge>, const String& mode); |
112 static void copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem
*, const WebCore::KURL& srcPath, const WebCore::KURL& destPath, PassRefPtr<Worke
rFileSystemCallbacksBridge>, const String& mode); | 114 static void copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem
*, const WebCore::KURL& srcPath, const WebCore::KURL& destPath, PassRefPtr<Worke
rFileSystemCallbacksBridge>, const String& mode); |
113 static void removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSyst
em*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge>, con
st String& mode); | 115 static void removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSyst
em*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge>, con
st String& mode); |
114 static void removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*,
WebFileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksB
ridge>, const String& mode); | 116 static void removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*,
WebFileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksB
ridge>, const String& mode); |
115 static void readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFi
leSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge
>, const String& mode); | 117 static void readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFi
leSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge
>, const String& mode); |
116 static void createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFile
System*, const WebCore::KURL& path, bool exclusive, PassRefPtr<WorkerFileSystemC
allbacksBridge>, const String& mode); | 118 static void createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFile
System*, const WebCore::KURL& path, bool exclusive, PassRefPtr<WorkerFileSystemC
allbacksBridge>, const String& mode); |
117 static void createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, We
bFileSystem*, const WebCore::KURL& path, bool exclusive, PassRefPtr<WorkerFileSy
stemCallbacksBridge>, const String& mode); | 119 static void createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, We
bFileSystem*, const WebCore::KURL& path, bool exclusive, PassRefPtr<WorkerFileSy
stemCallbacksBridge>, const String& mode); |
118 static void fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFile
System*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge>,
const String& mode); | 120 static void fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFile
System*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridge>,
const String& mode); |
119 static void directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, We
bFileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBri
dge>, const String& mode); | 121 static void directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, We
bFileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBri
dge>, const String& mode); |
120 static void readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebF
ileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridg
e>, const String& mode); | 122 static void readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebF
ileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacksBridg
e>, const String& mode); |
121 static void createSnapshotFileOnMainThread(WebCore::ScriptExecutionContext*,
WebFileSystem*, const WebCore::KURL& internalBlobURL, const WebCore::KURL& path
, PassRefPtr<WorkerFileSystemCallbacksBridge>, const String& mode); | 123 static void createSnapshotFileOnMainThread(WebCore::ScriptExecutionContext*,
WebFileSystem*, const WebCore::KURL& path, PassRefPtr<WorkerFileSystemCallbacks
Bridge>, const String& mode); |
122 | 124 |
123 friend class MainThreadFileSystemCallbacks; | 125 friend class MainThreadFileSystemCallbacks; |
124 | 126 |
125 // Methods that dispatch WebFileSystemCallbacks on the worker threads. | 127 // Methods that dispatch WebFileSystemCallbacks on the worker threads. |
126 static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefP
tr<WorkerFileSystemCallbacksBridge>, WebFileError); | 128 static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefP
tr<WorkerFileSystemCallbacksBridge>, WebFileError); |
127 static void didOpenFileSystemOnWorkerThread(WebCore::ScriptExecutionContext*
, PassRefPtr<WorkerFileSystemCallbacksBridge>, const String& name, const WebCore
::KURL& rootPath); | 129 static void didOpenFileSystemOnWorkerThread(WebCore::ScriptExecutionContext*
, PassRefPtr<WorkerFileSystemCallbacksBridge>, const String& name, const WebCore
::KURL& rootPath); |
128 static void didSucceedOnWorkerThread(WebCore::ScriptExecutionContext*, PassR
efPtr<WorkerFileSystemCallbacksBridge>); | 130 static void didSucceedOnWorkerThread(WebCore::ScriptExecutionContext*, PassR
efPtr<WorkerFileSystemCallbacksBridge>); |
129 static void didReadMetadataOnWorkerThread(WebCore::ScriptExecutionContext*,
PassRefPtr<WorkerFileSystemCallbacksBridge>, const WebFileInfo&); | 131 static void didReadMetadataOnWorkerThread(WebCore::ScriptExecutionContext*,
PassRefPtr<WorkerFileSystemCallbacksBridge>, const WebFileInfo&); |
| 132 static void didCreateSnapshotFileOnWorkerThread(WebCore::ScriptExecutionCont
ext*, PassRefPtr<WorkerFileSystemCallbacksBridge>, const WebFileInfo&, PassRefPt
r<WebCore::BlobDataHandle> snapshotBlob); |
130 static void didReadDirectoryOnWorkerThread(WebCore::ScriptExecutionContext*,
PassRefPtr<WorkerFileSystemCallbacksBridge>, const WebVector<WebFileSystemEntry
>&, bool hasMore); | 133 static void didReadDirectoryOnWorkerThread(WebCore::ScriptExecutionContext*,
PassRefPtr<WorkerFileSystemCallbacksBridge>, const WebVector<WebFileSystemEntry
>&, bool hasMore); |
131 | 134 |
132 static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr
<WorkerFileSystemCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::T
ask>); | 135 static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr
<WorkerFileSystemCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::T
ask>); |
133 static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefP
tr<WorkerFileSystemCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext:
:Task>); | 136 static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefP
tr<WorkerFileSystemCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext:
:Task>); |
134 | 137 |
135 void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Ta
sk>); | 138 void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Ta
sk>); |
136 void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>,
const String& mode); | 139 void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>,
const String& mode); |
137 | 140 |
138 void cleanUpAfterCallback(); | 141 void cleanUpAfterCallback(); |
139 | 142 |
140 Mutex m_loaderProxyMutex; | 143 Mutex m_loaderProxyMutex; |
141 WebCore::WorkerLoaderProxy* m_workerLoaderProxy; | 144 WebCore::WorkerLoaderProxy* m_workerLoaderProxy; |
142 | 145 |
143 WebCore::ScriptExecutionContext* m_workerContext; | 146 WebCore::ScriptExecutionContext* m_workerContext; |
144 | 147 |
145 // Must be deleted on the WorkerContext thread. | 148 // Must be deleted on the WorkerContext thread. |
146 WorkerFileSystemContextObserver* m_workerContextObserver; | 149 WorkerFileSystemContextObserver* m_workerContextObserver; |
147 | 150 |
148 // This is self-destructed and must be fired on the worker thread. | 151 // This is self-destructed and must be fired on the worker thread. |
149 WebFileSystemCallbacks* m_callbacksOnWorkerThread; | 152 WebFileSystemCallbacksImpl* m_callbacksOnWorkerThread; |
150 }; | 153 }; |
151 | 154 |
152 } // namespace WebCore | 155 } // namespace WebCore |
153 | 156 |
154 #endif | 157 #endif |
155 | 158 |
156 #endif // WorkerFileSystemCallbacksBridge_h | 159 #endif // WorkerFileSystemCallbacksBridge_h |
OLD | NEW |