| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 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 28 matching lines...) Expand all Loading... |
| 39 #include <wtf/PassRefPtr.h> | 39 #include <wtf/PassRefPtr.h> |
| 40 #include <wtf/RefCounted.h> | 40 #include <wtf/RefCounted.h> |
| 41 #include <wtf/RefPtr.h> | 41 #include <wtf/RefPtr.h> |
| 42 #include <wtf/text/WTFString.h> | 42 #include <wtf/text/WTFString.h> |
| 43 #include <wtf/Threading.h> | 43 #include <wtf/Threading.h> |
| 44 | 44 |
| 45 namespace WebCore { | 45 namespace WebCore { |
| 46 | 46 |
| 47 class ResourceError; | 47 class ResourceError; |
| 48 class ResourceRequest; | 48 class ResourceRequest; |
| 49 class WorkerContext; | 49 class WorkerGlobalScope; |
| 50 class WorkerLoaderProxy; | 50 class WorkerLoaderProxy; |
| 51 struct CrossThreadResourceResponseData; | 51 struct CrossThreadResourceResponseData; |
| 52 struct CrossThreadResourceRequestData; | 52 struct CrossThreadResourceRequestData; |
| 53 | 53 |
| 54 class WorkerThreadableLoader : public RefCounted<WorkerThreadableLoader>, pu
blic ThreadableLoader { | 54 class WorkerThreadableLoader : public RefCounted<WorkerThreadableLoader>, pu
blic ThreadableLoader { |
| 55 WTF_MAKE_FAST_ALLOCATED; | 55 WTF_MAKE_FAST_ALLOCATED; |
| 56 public: | 56 public: |
| 57 static void loadResourceSynchronously(WorkerContext*, const ResourceRequ
est&, ThreadableLoaderClient&, const ThreadableLoaderOptions&); | 57 static void loadResourceSynchronously(WorkerGlobalScope*, const Resource
Request&, ThreadableLoaderClient&, const ThreadableLoaderOptions&); |
| 58 static PassRefPtr<WorkerThreadableLoader> create(WorkerContext* workerCo
ntext, ThreadableLoaderClient* client, const String& taskMode, const ResourceReq
uest& request, const ThreadableLoaderOptions& options) | 58 static PassRefPtr<WorkerThreadableLoader> create(WorkerGlobalScope* work
erGlobalScope, ThreadableLoaderClient* client, const String& taskMode, const Res
ourceRequest& request, const ThreadableLoaderOptions& options) |
| 59 { | 59 { |
| 60 return adoptRef(new WorkerThreadableLoader(workerContext, client, ta
skMode, request, options)); | 60 return adoptRef(new WorkerThreadableLoader(workerGlobalScope, client
, taskMode, request, options)); |
| 61 } | 61 } |
| 62 | 62 |
| 63 ~WorkerThreadableLoader(); | 63 ~WorkerThreadableLoader(); |
| 64 | 64 |
| 65 virtual void cancel() OVERRIDE; | 65 virtual void cancel() OVERRIDE; |
| 66 | 66 |
| 67 bool done() const { return m_workerClientWrapper->done(); } | 67 bool done() const { return m_workerClientWrapper->done(); } |
| 68 | 68 |
| 69 using RefCounted<WorkerThreadableLoader>::ref; | 69 using RefCounted<WorkerThreadableLoader>::ref; |
| 70 using RefCounted<WorkerThreadableLoader>::deref; | 70 using RefCounted<WorkerThreadableLoader>::deref; |
| 71 | 71 |
| 72 protected: | 72 protected: |
| 73 virtual void refThreadableLoader() OVERRIDE { ref(); } | 73 virtual void refThreadableLoader() OVERRIDE { ref(); } |
| 74 virtual void derefThreadableLoader() OVERRIDE { deref(); } | 74 virtual void derefThreadableLoader() OVERRIDE { deref(); } |
| 75 | 75 |
| 76 private: | 76 private: |
| 77 // Creates a loader on the main thread and bridges communication between | 77 // Creates a loader on the main thread and bridges communication between |
| 78 // the main thread and the worker context's thread where WorkerThreadabl
eLoader runs. | 78 // the main thread and the worker context's thread where WorkerThreadabl
eLoader runs. |
| 79 // | 79 // |
| 80 // Regarding the bridge and lifetimes of items used in callbacks, there
are a few cases: | 80 // Regarding the bridge and lifetimes of items used in callbacks, there
are a few cases: |
| 81 // | 81 // |
| 82 // all cases. All tasks posted from the worker context's thread are ok b
ecause | 82 // all cases. All tasks posted from the worker context's thread are ok b
ecause |
| 83 // the last task posted always is "mainThreadDestroy", so MainThreadB
ridge is | 83 // the last task posted always is "mainThreadDestroy", so MainThreadB
ridge is |
| 84 // around for all tasks that use it on the main thread. | 84 // around for all tasks that use it on the main thread. |
| 85 // | 85 // |
| 86 // case 1. worker.terminate is called. | 86 // case 1. worker.terminate is called. |
| 87 // In this case, no more tasks are posted from the worker object's th
read to the worker | 87 // In this case, no more tasks are posted from the worker object's th
read to the worker |
| 88 // context's thread -- WorkerContextProxy implementation enforces thi
s. | 88 // context's thread -- WorkerGlobalScopeProxy implementation enforces
this. |
| 89 // | 89 // |
| 90 // case 2. xhr gets aborted and the worker context continues running. | 90 // case 2. xhr gets aborted and the worker context continues running. |
| 91 // The ThreadableLoaderClientWrapper has the underlying client cleare
d, so no more calls | 91 // The ThreadableLoaderClientWrapper has the underlying client cleare
d, so no more calls |
| 92 // go through it. All tasks posted from the worker object's thread t
o the worker context's | 92 // go through it. All tasks posted from the worker object's thread t
o the worker context's |
| 93 // thread do "ThreadableLoaderClientWrapper::ref" (automatically insi
de of the cross thread copy | 93 // thread do "ThreadableLoaderClientWrapper::ref" (automatically insi
de of the cross thread copy |
| 94 // done in createCallbackTask), so the ThreadableLoaderClientWrapper
instance is there until all | 94 // done in createCallbackTask), so the ThreadableLoaderClientWrapper
instance is there until all |
| 95 // tasks are executed. | 95 // tasks are executed. |
| 96 class MainThreadBridge : public ThreadableLoaderClient { | 96 class MainThreadBridge : public ThreadableLoaderClient { |
| 97 public: | 97 public: |
| 98 // All executed on the worker context's thread. | 98 // All executed on the worker context's thread. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 126 // The ref counting is done on either thread. | 126 // The ref counting is done on either thread. |
| 127 RefPtr<ThreadableLoaderClientWrapper> m_workerClientWrapper; | 127 RefPtr<ThreadableLoaderClientWrapper> m_workerClientWrapper; |
| 128 | 128 |
| 129 // May be used on either thread. | 129 // May be used on either thread. |
| 130 WorkerLoaderProxy& m_loaderProxy; | 130 WorkerLoaderProxy& m_loaderProxy; |
| 131 | 131 |
| 132 // For use on the main thread. | 132 // For use on the main thread. |
| 133 String m_taskMode; | 133 String m_taskMode; |
| 134 }; | 134 }; |
| 135 | 135 |
| 136 WorkerThreadableLoader(WorkerContext*, ThreadableLoaderClient*, const St
ring& taskMode, const ResourceRequest&, const ThreadableLoaderOptions&); | 136 WorkerThreadableLoader(WorkerGlobalScope*, ThreadableLoaderClient*, cons
t String& taskMode, const ResourceRequest&, const ThreadableLoaderOptions&); |
| 137 | 137 |
| 138 RefPtr<WorkerContext> m_workerContext; | 138 RefPtr<WorkerGlobalScope> m_workerGlobalScope; |
| 139 RefPtr<ThreadableLoaderClientWrapper> m_workerClientWrapper; | 139 RefPtr<ThreadableLoaderClientWrapper> m_workerClientWrapper; |
| 140 MainThreadBridge& m_bridge; | 140 MainThreadBridge& m_bridge; |
| 141 }; | 141 }; |
| 142 | 142 |
| 143 } // namespace WebCore | 143 } // namespace WebCore |
| 144 | 144 |
| 145 #endif // WorkerThreadableLoader_h | 145 #endif // WorkerThreadableLoader_h |
| OLD | NEW |