Convert PageGroup to using std::unique_ptr
[WebKit-https.git] / Source / WebCore / workers / WorkerGlobalScope.h
1 /*
2  * Copyright (C) 2008, 2009 Apple 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
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  */
26
27 #ifndef WorkerGlobalScope_h
28 #define WorkerGlobalScope_h
29
30 #if ENABLE(WORKERS)
31
32 #include "ContentSecurityPolicy.h"
33 #include "EventListener.h"
34 #include "EventNames.h"
35 #include "EventTarget.h"
36 #include "GroupSettings.h"
37 #include "ScriptExecutionContext.h"
38 #include "WorkerEventQueue.h"
39 #include "WorkerScriptController.h"
40 #include <wtf/Assertions.h>
41 #include <wtf/HashMap.h>
42 #include <wtf/OwnPtr.h>
43 #include <wtf/PassRefPtr.h>
44 #include <wtf/RefCounted.h>
45 #include <wtf/RefPtr.h>
46 #include <wtf/text/AtomicStringHash.h>
47
48 namespace WebCore {
49
50     class Blob;
51     class ScheduledAction;
52     class WorkerInspectorController;
53     class WorkerLocation;
54     class WorkerNavigator;
55     class WorkerThread;
56
57     class WorkerGlobalScope : public RefCounted<WorkerGlobalScope>, public ScriptExecutionContext, public EventTargetWithInlineData {
58     public:
59         virtual ~WorkerGlobalScope();
60
61         virtual bool isWorkerGlobalScope() const OVERRIDE { return true; }
62
63         virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE FINAL { return const_cast<WorkerGlobalScope*>(this); }
64
65         virtual bool isSharedWorkerGlobalScope() const { return false; }
66         virtual bool isDedicatedWorkerGlobalScope() const { return false; }
67
68         virtual const URL& url() const OVERRIDE FINAL { return m_url; }
69         virtual URL completeURL(const String&) const OVERRIDE FINAL;
70
71         const GroupSettings* groupSettings() { return m_groupSettings.get(); }
72         virtual String userAgent(const URL&) const;
73
74         virtual void disableEval(const String& errorMessage) OVERRIDE;
75
76         WorkerScriptController* script() { return m_script.get(); }
77         void clearScript() { m_script.clear(); }
78 #if ENABLE(INSPECTOR)
79         void clearInspector();
80 #endif
81
82         WorkerThread* thread() const { return m_thread; }
83
84         bool hasPendingActivity() const;
85
86         virtual void postTask(PassOwnPtr<Task>) OVERRIDE; // Executes the task on context's thread asynchronously.
87
88         // WorkerGlobalScope
89         WorkerGlobalScope* self() { return this; }
90         WorkerLocation* location() const;
91         void close();
92
93         DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
94         DEFINE_ATTRIBUTE_EVENT_LISTENER(offline);
95         DEFINE_ATTRIBUTE_EVENT_LISTENER(online);
96
97         // WorkerUtils
98         virtual void importScripts(const Vector<String>& urls, ExceptionCode&);
99         WorkerNavigator* navigator() const;
100
101         // Timers
102         int setTimeout(PassOwnPtr<ScheduledAction>, int timeout);
103         void clearTimeout(int timeoutId);
104         int setInterval(PassOwnPtr<ScheduledAction>, int timeout);
105         void clearInterval(int timeoutId);
106
107         virtual bool isContextThread() const OVERRIDE;
108         virtual bool isJSExecutionForbidden() const OVERRIDE;
109
110 #if ENABLE(INSPECTOR)
111         WorkerInspectorController* workerInspectorController() { return m_workerInspectorController.get(); }
112 #endif
113         // These methods are used for GC marking. See JSWorkerGlobalScope::visitChildrenVirtual(SlotVisitor&) in
114         // JSWorkerGlobalScopeCustom.cpp.
115         WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
116         WorkerLocation* optionalLocation() const { return m_location.get(); }
117
118         using RefCounted<WorkerGlobalScope>::ref;
119         using RefCounted<WorkerGlobalScope>::deref;
120
121         bool isClosing() { return m_closing; }
122
123         // An observer interface to be notified when the worker thread is getting stopped.
124         class Observer {
125             WTF_MAKE_NONCOPYABLE(Observer);
126         public:
127             Observer(WorkerGlobalScope*);
128             virtual ~Observer();
129             virtual void notifyStop() = 0;
130             void stopObserving();
131         private:
132             WorkerGlobalScope* m_context;
133         };
134         friend class Observer;
135         void registerObserver(Observer*);
136         void unregisterObserver(Observer*);
137         void notifyObserversOfStop();
138
139         virtual SecurityOrigin* topOrigin() const OVERRIDE { return m_topOrigin.get(); }
140
141     protected:
142         WorkerGlobalScope(const URL&, const String& userAgent, std::unique_ptr<GroupSettings>, WorkerThread*, PassRefPtr<SecurityOrigin> topOrigin);
143         void applyContentSecurityPolicyFromString(const String& contentSecurityPolicy, ContentSecurityPolicy::HeaderType);
144
145         virtual void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, PassRefPtr<ScriptCallStack>) OVERRIDE;
146         void addMessageToWorkerConsole(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr<ScriptCallStack>, JSC::ExecState* = 0, unsigned long requestIdentifier = 0);
147
148     private:
149         virtual void refScriptExecutionContext() OVERRIDE { ref(); }
150         virtual void derefScriptExecutionContext() OVERRIDE { deref(); }
151
152         virtual void refEventTarget() OVERRIDE FINAL { ref(); }
153         virtual void derefEventTarget() OVERRIDE FINAL { deref(); }
154
155         virtual void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr<ScriptCallStack>, JSC::ExecState* = 0, unsigned long requestIdentifier = 0) OVERRIDE;
156         virtual void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier = 0) OVERRIDE;
157
158         virtual EventTarget* errorEventTarget() OVERRIDE;
159
160         virtual WorkerEventQueue& eventQueue() const OVERRIDE FINAL;
161
162         URL m_url;
163         String m_userAgent;
164         std::unique_ptr<GroupSettings> m_groupSettings;
165
166         mutable RefPtr<WorkerLocation> m_location;
167         mutable RefPtr<WorkerNavigator> m_navigator;
168
169         OwnPtr<WorkerScriptController> m_script;
170         WorkerThread* m_thread;
171
172 #if ENABLE(INSPECTOR)
173         OwnPtr<WorkerInspectorController> m_workerInspectorController;
174 #endif
175         bool m_closing;
176
177         HashSet<Observer*> m_workerObservers;
178
179         mutable WorkerEventQueue m_eventQueue;
180
181         RefPtr<SecurityOrigin> m_topOrigin;
182     };
183
184 } // namespace WebCore
185
186 #endif // ENABLE(WORKERS)
187
188 #endif // WorkerGlobalScope_h