• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 WebWorkerBase_h
32 #define WebWorkerBase_h
33 
34 #if ENABLE(WORKERS)
35 
36 #include "ScriptExecutionContext.h"
37 #include "WebFrameClient.h"
38 #include "WorkerLoaderProxy.h"
39 #include "WorkerObjectProxy.h"
40 #include <wtf/PassOwnPtr.h>
41 #include <wtf/RefPtr.h>
42 
43 namespace WebCore {
44 class WorkerThread;
45 }
46 
47 namespace WebKit {
48 class WebApplicationCacheHost;
49 class WebApplicationCacheHostClient;
50 class WebCommonWorkerClient;
51 class WebSecurityOrigin;
52 class WebString;
53 class WebURL;
54 class WebView;
55 class WebWorker;
56 class WebWorkerClient;
57 
58 // Base class for WebSharedWorkerImpl and WebWorkerImpl. It contains common
59 // code used by both implementation classes, including implementations of the
60 // WorkerObjectProxy and WorkerLoaderProxy interfaces.
61 class WebWorkerBase : public WebCore::WorkerObjectProxy
62                     , public WebCore::WorkerLoaderProxy
63                     , public WebFrameClient {
64 public:
65     WebWorkerBase();
66     virtual ~WebWorkerBase();
67 
68     // WebCore::WorkerObjectProxy methods:
69     virtual void postMessageToWorkerObject(
70         PassRefPtr<WebCore::SerializedScriptValue>,
71         PassOwnPtr<WebCore::MessagePortChannelArray>);
72     virtual void postExceptionToWorkerObject(
73         const WTF::String&, int, const WTF::String&);
74     virtual void postConsoleMessageToWorkerObject(
75         WebCore::MessageSource, WebCore::MessageType,
76         WebCore::MessageLevel, const WTF::String&, int, const WTF::String&);
77     virtual void confirmMessageFromWorkerObject(bool);
78     virtual void reportPendingActivity(bool);
79     virtual void workerContextClosed();
80     virtual void workerContextDestroyed();
81 
82     // WebCore::WorkerLoaderProxy methods:
83     virtual void postTaskToLoader(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
84     virtual void postTaskForModeToWorkerContext(
85         PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const WTF::String& mode);
86 
87     // WebFrameClient methods to support resource loading thru the 'shadow page'.
88     virtual void didCreateDataSource(WebFrame*, WebDataSource*);
89     virtual WebApplicationCacheHost* createApplicationCacheHost(WebFrame*, WebApplicationCacheHostClient*);
90 
91     // Controls whether access to Web Databases is allowed for this worker.
92     virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize);
93 
94 #if ENABLE(FILE_SYSTEM)
95     void openFileSystemForWorker(WebFileSystem::Type, long long size, bool create, WebFileSystemCallbacks*, bool synchronous);
96 #endif
97 
98     // Executes the given task on the main thread.
99     static void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
100 
101 protected:
102     virtual WebWorkerClient* client() = 0;
103     virtual WebCommonWorkerClient* commonClient() = 0;
104 
setWorkerThread(PassRefPtr<WebCore::WorkerThread> thread)105     void setWorkerThread(PassRefPtr<WebCore::WorkerThread> thread) { m_workerThread = thread; }
workerThread()106     WebCore::WorkerThread* workerThread() { return m_workerThread.get(); }
107 
108     // Shuts down the worker thread.
109     void stopWorkerThread();
110 
111     // Creates the shadow loader used for worker network requests.
112     void initializeLoader(const WebURL&);
113 
114 private:
115     // Function used to invoke tasks on the main thread.
116     static void invokeTaskMethod(void*);
117 
118     // Tasks that are run on the main thread.
119     static void postMessageTask(
120         WebCore::ScriptExecutionContext* context,
121         WebWorkerBase* thisPtr,
122         WTF::String message,
123         PassOwnPtr<WebCore::MessagePortChannelArray> channels);
124     static void postExceptionTask(
125         WebCore::ScriptExecutionContext* context,
126         WebWorkerBase* thisPtr,
127         const WTF::String& message,
128         int lineNumber,
129         const WTF::String& sourceURL);
130     static void postConsoleMessageTask(
131         WebCore::ScriptExecutionContext* context,
132         WebWorkerBase* thisPtr,
133         int source,
134         int type,
135         int level,
136         const WTF::String& message,
137         int lineNumber,
138         const WTF::String& sourceURL);
139     static void confirmMessageTask(
140         WebCore::ScriptExecutionContext* context,
141         WebWorkerBase* thisPtr,
142         bool hasPendingActivity);
143     static void reportPendingActivityTask(
144         WebCore::ScriptExecutionContext* context,
145         WebWorkerBase* thisPtr,
146         bool hasPendingActivity);
147     static void workerContextClosedTask(
148         WebCore::ScriptExecutionContext* context,
149         WebWorkerBase* thisPtr);
150     static void workerContextDestroyedTask(
151         WebCore::ScriptExecutionContext* context,
152         WebWorkerBase* thisPtr);
153 
154     // 'shadow page' - created to proxy loading requests from the worker.
155     RefPtr<WebCore::ScriptExecutionContext> m_loadingDocument;
156     WebView* m_webView;
157     bool m_askedToTerminate;
158 
159     RefPtr<WebCore::WorkerThread> m_workerThread;
160 };
161 
162 } // namespace WebKit
163 
164 #endif // ENABLE(WORKERS)
165 
166 #endif
167