OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 16 matching lines...) Expand all Loading... |
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 "WorkerFileWriterCallbacksBridge.h" | 32 #include "WorkerFileWriterCallbacksBridge.h" |
33 | 33 |
34 #include "WebFileWriter.h" | 34 #include "WebFileWriter.h" |
35 #include "WebWorkerBase.h" | 35 #include "WebWorkerBase.h" |
36 #include "core/dom/CrossThreadTask.h" | 36 #include "core/dom/CrossThreadTask.h" |
37 #include "core/workers/WorkerContext.h" | 37 #include "core/workers/WorkerGlobalScope.h" |
38 #include "core/workers/WorkerLoaderProxy.h" | 38 #include "core/workers/WorkerLoaderProxy.h" |
39 #include "core/workers/WorkerThread.h" | 39 #include "core/workers/WorkerThread.h" |
40 #include "modules/filesystem/AsyncFileWriterClient.h" | 40 #include "modules/filesystem/AsyncFileWriterClient.h" |
41 #include "public/platform/Platform.h" | 41 #include "public/platform/Platform.h" |
42 #include "public/platform/WebCString.h" | 42 #include "public/platform/WebCString.h" |
43 #include "public/platform/WebFileSystem.h" | 43 #include "public/platform/WebFileSystem.h" |
44 #include <wtf/MainThread.h> | 44 #include <wtf/MainThread.h> |
45 #include <wtf/Threading.h> | 45 #include <wtf/Threading.h> |
46 | 46 |
47 using namespace WebCore; | 47 using namespace WebCore; |
48 | 48 |
49 namespace WebKit { | 49 namespace WebKit { |
50 | 50 |
51 void WorkerFileWriterCallbacksBridge::notifyStop() | 51 void WorkerFileWriterCallbacksBridge::notifyStop() |
52 { | 52 { |
53 ASSERT(m_workerContext->isContextThread()); | 53 ASSERT(m_workerGlobalScope->isContextThread()); |
54 m_clientOnWorkerThread = 0; | 54 m_clientOnWorkerThread = 0; |
55 { | 55 { |
56 MutexLocker locker(m_loaderProxyMutex); | 56 MutexLocker locker(m_loaderProxyMutex); |
57 m_proxy = 0; | 57 m_proxy = 0; |
58 } | 58 } |
59 } | 59 } |
60 | 60 |
61 void WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position,
const KURL& data) | 61 void WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position,
const KURL& data) |
62 { | 62 { |
63 ASSERT(!m_operationInProgress); | 63 ASSERT(!m_operationInProgress); |
(...skipping 11 matching lines...) Expand all Loading... |
75 } | 75 } |
76 | 76 |
77 void WorkerFileWriterCallbacksBridge::postAbortToMainThread() | 77 void WorkerFileWriterCallbacksBridge::postAbortToMainThread() |
78 { | 78 { |
79 ASSERT(m_operationInProgress); | 79 ASSERT(m_operationInProgress); |
80 dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this)); | 80 dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this)); |
81 } | 81 } |
82 | 82 |
83 void WorkerFileWriterCallbacksBridge::postShutdownToMainThread(PassRefPtr<Worker
FileWriterCallbacksBridge> bridge) | 83 void WorkerFileWriterCallbacksBridge::postShutdownToMainThread(PassRefPtr<Worker
FileWriterCallbacksBridge> bridge) |
84 { | 84 { |
85 ASSERT(m_workerContext->isContextThread()); | 85 ASSERT(m_workerGlobalScope->isContextThread()); |
86 m_clientOnWorkerThread = 0; | 86 m_clientOnWorkerThread = 0; |
87 dispatchTaskToMainThread(createCallbackTask(&shutdownOnMainThread, bridge)); | 87 dispatchTaskToMainThread(createCallbackTask(&shutdownOnMainThread, bridge)); |
88 } | 88 } |
89 | 89 |
90 void WorkerFileWriterCallbacksBridge::writeOnMainThread(ScriptExecutionContext*,
PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long position, const K
URL& data) | 90 void WorkerFileWriterCallbacksBridge::writeOnMainThread(ScriptExecutionContext*,
PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long position, const K
URL& data) |
91 { | 91 { |
92 bridge->m_writer->write(position, WebURL(data)); | 92 bridge->m_writer->write(position, WebURL(data)); |
93 } | 93 } |
94 | 94 |
95 void WorkerFileWriterCallbacksBridge::truncateOnMainThread(ScriptExecutionContex
t*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length) | 95 void WorkerFileWriterCallbacksBridge::truncateOnMainThread(ScriptExecutionContex
t*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length) |
(...skipping 29 matching lines...) Expand all Loading... |
125 } | 125 } |
126 | 126 |
127 void WorkerFileWriterCallbacksBridge::didTruncate() | 127 void WorkerFileWriterCallbacksBridge::didTruncate() |
128 { | 128 { |
129 dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, th
is)); | 129 dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, th
is)); |
130 } | 130 } |
131 | 131 |
132 static const char fileWriterOperationsMode[] = "fileWriterOperationsMode"; | 132 static const char fileWriterOperationsMode[] = "fileWriterOperationsMode"; |
133 | 133 |
134 WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const KURL& pat
h, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, Asy
ncFileWriterClient* client) | 134 WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const KURL& pat
h, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, Asy
ncFileWriterClient* client) |
135 : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext
)) | 135 : WorkerGlobalScope::Observer(static_cast<WorkerGlobalScope*>(scriptExecutio
nContext)) |
136 , m_proxy(proxy) | 136 , m_proxy(proxy) |
137 , m_workerContext(scriptExecutionContext) | 137 , m_workerGlobalScope(scriptExecutionContext) |
138 , m_clientOnWorkerThread(client) | 138 , m_clientOnWorkerThread(client) |
139 , m_writerDeleted(false) | 139 , m_writerDeleted(false) |
140 , m_operationInProgress(false) | 140 , m_operationInProgress(false) |
141 { | 141 { |
142 ASSERT(m_workerContext->isContextThread()); | 142 ASSERT(m_workerGlobalScope->isContextThread()); |
143 m_mode = fileWriterOperationsMode; | 143 m_mode = fileWriterOperationsMode; |
144 m_mode.append(String::number(static_cast<WorkerContext*>(scriptExecutionCont
ext)->thread()->runLoop().createUniqueId())); | 144 m_mode.append(String::number(static_cast<WorkerGlobalScope*>(scriptExecution
Context)->thread()->runLoop().createUniqueId())); |
145 postInitToMainThread(path); | 145 postInitToMainThread(path); |
146 } | 146 } |
147 | 147 |
148 void WorkerFileWriterCallbacksBridge::postInitToMainThread(const KURL& path) | 148 void WorkerFileWriterCallbacksBridge::postInitToMainThread(const KURL& path) |
149 { | 149 { |
150 dispatchTaskToMainThread( | 150 dispatchTaskToMainThread( |
151 createCallbackTask(&initOnMainThread, this, path)); | 151 createCallbackTask(&initOnMainThread, this, path)); |
152 } | 152 } |
153 | 153 |
154 WorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge() | 154 WorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge() |
155 { | 155 { |
156 ASSERT(!m_clientOnWorkerThread); | 156 ASSERT(!m_clientOnWorkerThread); |
157 ASSERT(!m_writer); | 157 ASSERT(!m_writer); |
158 } | 158 } |
159 | 159 |
160 // We know m_clientOnWorkerThread is still valid because it is only cleared on t
he context thread, and because we check in runTaskOnWorkerThread before calling
any of these methods. | 160 // We know m_clientOnWorkerThread is still valid because it is only cleared on t
he context thread, and because we check in runTaskOnWorkerThread before calling
any of these methods. |
161 void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionCont
ext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool
complete) | 161 void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionCont
ext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool
complete) |
162 { | 162 { |
163 ASSERT(bridge->m_workerContext->isContextThread()); | 163 ASSERT(bridge->m_workerGlobalScope->isContextThread()); |
164 ASSERT(bridge->m_operationInProgress); | 164 ASSERT(bridge->m_operationInProgress); |
165 if (complete) | 165 if (complete) |
166 bridge->m_operationInProgress = false; | 166 bridge->m_operationInProgress = false; |
167 bridge->m_clientOnWorkerThread->didWrite(length, complete); | 167 bridge->m_clientOnWorkerThread->didWrite(length, complete); |
168 } | 168 } |
169 | 169 |
170 void WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionConte
xt*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error) | 170 void WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionConte
xt*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error) |
171 { | 171 { |
172 ASSERT(bridge->m_workerContext->isContextThread()); | 172 ASSERT(bridge->m_workerGlobalScope->isContextThread()); |
173 ASSERT(bridge->m_operationInProgress); | 173 ASSERT(bridge->m_operationInProgress); |
174 bridge->m_operationInProgress = false; | 174 bridge->m_operationInProgress = false; |
175 bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(er
ror)); | 175 bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(er
ror)); |
176 } | 176 } |
177 | 177 |
178 void WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionC
ontext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) | 178 void WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionC
ontext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) |
179 { | 179 { |
180 ASSERT(bridge->m_workerContext->isContextThread()); | 180 ASSERT(bridge->m_workerGlobalScope->isContextThread()); |
181 ASSERT(bridge->m_operationInProgress); | 181 ASSERT(bridge->m_operationInProgress); |
182 bridge->m_operationInProgress = false; | 182 bridge->m_operationInProgress = false; |
183 bridge->m_clientOnWorkerThread->didTruncate(); | 183 bridge->m_clientOnWorkerThread->didTruncate(); |
184 } | 184 } |
185 | 185 |
186 void WorkerFileWriterCallbacksBridge::runTaskOnMainThread(ScriptExecutionContext
* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, Pa
ssOwnPtr<ScriptExecutionContext::Task> taskToRun) | 186 void WorkerFileWriterCallbacksBridge::runTaskOnMainThread(ScriptExecutionContext
* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, Pa
ssOwnPtr<ScriptExecutionContext::Task> taskToRun) |
187 { | 187 { |
188 ASSERT(isMainThread()); | 188 ASSERT(isMainThread()); |
189 if (!bridge->m_writerDeleted) | 189 if (!bridge->m_writerDeleted) |
190 taskToRun->performTask(scriptExecutionContext); | 190 taskToRun->performTask(scriptExecutionContext); |
191 } | 191 } |
192 | 192 |
193 void WorkerFileWriterCallbacksBridge::runTaskOnWorkerThread(ScriptExecutionConte
xt* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge,
PassOwnPtr<ScriptExecutionContext::Task> taskToRun) | 193 void WorkerFileWriterCallbacksBridge::runTaskOnWorkerThread(ScriptExecutionConte
xt* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge,
PassOwnPtr<ScriptExecutionContext::Task> taskToRun) |
194 { | 194 { |
195 ASSERT(bridge->m_workerContext->isContextThread()); | 195 ASSERT(bridge->m_workerGlobalScope->isContextThread()); |
196 if (bridge->m_clientOnWorkerThread) | 196 if (bridge->m_clientOnWorkerThread) |
197 taskToRun->performTask(scriptExecutionContext); | 197 taskToRun->performTask(scriptExecutionContext); |
198 } | 198 } |
199 | 199 |
200 void WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<Script
ExecutionContext::Task> task) | 200 void WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<Script
ExecutionContext::Task> task) |
201 { | 201 { |
202 ASSERT(m_workerContext->isContextThread()); | 202 ASSERT(m_workerGlobalScope->isContextThread()); |
203 WebWorkerBase::dispatchTaskToMainThread( | 203 WebWorkerBase::dispatchTaskToMainThread( |
204 createCallbackTask(&runTaskOnMainThread, this, task)); | 204 createCallbackTask(&runTaskOnMainThread, this, task)); |
205 } | 205 } |
206 | 206 |
207 void WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<Scri
ptExecutionContext::Task> task) | 207 void WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<Scri
ptExecutionContext::Task> task) |
208 { | 208 { |
209 ASSERT(isMainThread()); | 209 ASSERT(isMainThread()); |
210 | 210 |
211 MutexLocker locker(m_loaderProxyMutex); | 211 MutexLocker locker(m_loaderProxyMutex); |
212 if (m_proxy) | 212 if (m_proxy) |
213 m_proxy->postTaskForModeToWorkerContext( | 213 m_proxy->postTaskForModeToWorkerGlobalScope( |
214 createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode); | 214 createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode); |
215 } | 215 } |
216 | 216 |
217 bool WorkerFileWriterCallbacksBridge::waitForOperationToComplete() | 217 bool WorkerFileWriterCallbacksBridge::waitForOperationToComplete() |
218 { | 218 { |
219 while (m_operationInProgress) { | 219 while (m_operationInProgress) { |
220 WorkerContext* context = static_cast<WorkerContext*>(m_workerContext); | 220 WorkerGlobalScope* context = static_cast<WorkerGlobalScope*>(m_workerGlo
balScope); |
221 if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQu
eueTerminated) | 221 if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQu
eueTerminated) |
222 return false; | 222 return false; |
223 } | 223 } |
224 return true; | 224 return true; |
225 } | 225 } |
226 | 226 |
227 } // namespace WebKit | 227 } // namespace WebKit |
OLD | NEW |