5c1926d68d2bf1e6d2fd235f8e8abaa2bc533cd7
[WebKit-https.git] / WebCore / loader / WorkerThreadableLoader.h
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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.
29  */
30
31 #ifndef WorkerThreadableLoader_h
32 #define WorkerThreadableLoader_h
33
34 #if ENABLE(WORKERS)
35
36 #include "ThreadableLoader.h"
37 #include "ThreadableLoaderClient.h"
38 #include "ThreadableLoaderClientWrapper.h"
39
40 #include <memory>
41 #include <wtf/PassRefPtr.h>
42 #include <wtf/RefCounted.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/Threading.h>
45
46 namespace WebCore {
47
48     class ResourceError;
49     class ResourceRequest;
50     class WorkerContext;
51     class WorkerMessagingProxy;
52     struct CrossThreadResourceResponseData;
53     struct CrossThreadResourceRequestData;
54
55     class WorkerThreadableLoader : public RefCounted<WorkerThreadableLoader>, public ThreadableLoader {
56     public:
57         static PassRefPtr<WorkerThreadableLoader> create(WorkerContext* worker, ThreadableLoaderClient* client, const ResourceRequest& request, LoadCallbacks callbacksSetting, ContentSniff contentSniff)
58         {
59             return adoptRef(new WorkerThreadableLoader(worker, client, request, callbacksSetting, contentSniff));
60         }
61
62         ~WorkerThreadableLoader();
63
64         virtual void cancel();
65
66         using RefCounted<WorkerThreadableLoader>::ref;
67         using RefCounted<WorkerThreadableLoader>::deref;
68
69     protected:
70         virtual void refThreadableLoader() { ref(); }
71         virtual void derefThreadableLoader() { deref(); }
72
73     private:
74         // Creates a loader on the main thread and bridges communication between
75         // the main thread and the worker context's thread where WorkerThreadableLoader runs.
76         //
77         // Regarding the bridge and lifetimes of items used in callbacks, there are a few cases:
78         //
79         // all cases. All tasks posted from the worker context's thread are ok because
80         //    the last task posted always is "mainThreadDestroy", so MainThreadBridge is
81         //    around for all tasks that use it on the mian thread.
82         //
83         // case 1. worker.terminate is called.
84         //    In this case, no more tasks are posted from the worker object's thread to the worker
85         //    context's thread -- WorkerMessagingProxy enforces this.
86         //
87         // case 2. xhr gets aborted and the worker context continues running.
88         //    The ThreadableLoaderClientWrapper has the underlying client cleared, so no more calls
89         //    go through it.  All tasks posted from the worker object's thread to the worker context's
90         //    thread do "ThreadableLoaderClientWrapper::ref" (automatically inside of the cross thread copy
91         //    done in createCallbackTask), so the ThreadableLoaderClientWrapper instance is there until all
92         //    tasks are executed.
93         class MainThreadBridge : ThreadableLoaderClient {
94         public:
95             // All executed on the worker context's thread.
96             MainThreadBridge(ThreadableLoaderClient*, WorkerMessagingProxy&, const ResourceRequest&, LoadCallbacks, ContentSniff);
97             void cancel();
98             void destroy();
99
100         private:
101             // Executed on the worker context's thread.
102             void clearClientWrapper();
103
104             // All executed on the main thread.
105             static void mainThreadDestroy(ScriptExecutionContext*, MainThreadBridge*);
106             ~MainThreadBridge();
107
108             static void mainThreadCreateLoader(ScriptExecutionContext*, MainThreadBridge*, std::auto_ptr<CrossThreadResourceRequestData>, LoadCallbacks, ContentSniff);
109             static void mainThreadCancel(ScriptExecutionContext*, MainThreadBridge*);
110             virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
111             virtual void didReceiveResponse(const ResourceResponse&);
112             virtual void didReceiveData(const char*, int lengthReceived);
113             virtual void didFinishLoading(int identifier);
114             virtual void didFail(const ResourceError&);
115             virtual void didReceiveAuthenticationCancellation(const ResourceResponse&);
116
117             // Only to be used on the main thread.
118             RefPtr<ThreadableLoader> m_mainThreadLoader;
119
120             // ThreadableLoaderClientWrapper is to be used on the worker context thread.
121             // The ref counting is done on either thread.
122             RefPtr<ThreadSafeShared<ThreadableLoaderClientWrapper> > m_workerClientWrapper;
123
124             // May be used on either thread.
125             WorkerMessagingProxy& m_messagingProxy;
126         };
127
128         WorkerThreadableLoader(WorkerContext*, ThreadableLoaderClient*, const ResourceRequest&, LoadCallbacks, ContentSniff);
129
130         RefPtr<WorkerContext> m_workerContext;
131         MainThreadBridge& m_bridge;
132     };
133
134 } // namespace WebCore
135
136 #endif // ENABLE(WORKERS)
137
138 #endif // WorkerThreadableLoader_h