Make AsyncFileReader work without ScriptExecutionContext
[WebKit-https.git] / Source / WebCore / dom / ScriptExecutionContext.h
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  * Copyright (C) 2012 Google Inc. All Rights Reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  */
27
28 #ifndef ScriptExecutionContext_h
29 #define ScriptExecutionContext_h
30
31 #include "ActiveDOMObject.h"
32 #include "ConsoleTypes.h"
33 #include "KURL.h"
34 #include "ScriptCallStack.h"
35 #include "ScriptState.h"
36 #include "SecurityContext.h"
37 #include "Supplementable.h"
38 #include <wtf/Forward.h>
39 #include <wtf/HashMap.h>
40 #include <wtf/HashSet.h>
41 #include <wtf/Noncopyable.h>
42 #include <wtf/OwnPtr.h>
43 #include <wtf/PassOwnPtr.h>
44 #include <wtf/Threading.h>
45 #include <wtf/text/StringHash.h>
46
47 #if USE(JSC)
48 #include <runtime/JSGlobalData.h>
49 #endif
50
51 namespace WebCore {
52
53 class CachedScript;
54 class DatabaseContext;
55 class DOMTimer;
56 class EventListener;
57 class EventQueue;
58 class EventTarget;
59 class MessagePort;
60
61 #if ENABLE(BLOB)
62 class PublicURLManager;
63 #endif
64
65 class ScriptExecutionContext : public SecurityContext, public Supplementable<ScriptExecutionContext> {
66 public:
67     ScriptExecutionContext();
68     virtual ~ScriptExecutionContext();
69
70     virtual bool isDocument() const { return false; }
71     virtual bool isWorkerContext() const { return false; }
72
73     virtual bool isContextThread() const { return true; }
74     virtual bool isJSExecutionForbidden() const = 0;
75
76     const KURL& url() const { return virtualURL(); }
77     KURL completeURL(const String& url) const { return virtualCompleteURL(url); }
78
79     virtual String userAgent(const KURL&) const = 0;
80
81     virtual void disableEval(const String& errorMessage) = 0;
82
83     bool sanitizeScriptError(String& errorMessage, int& lineNumber, String& sourceURL, CachedScript* = 0);
84     void reportException(const String& errorMessage, int lineNumber, const String& sourceURL, PassRefPtr<ScriptCallStack>, CachedScript* = 0);
85
86     void addConsoleMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, ScriptState* = 0, unsigned long requestIdentifier = 0);
87     virtual void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier = 0) = 0;
88
89     virtual const SecurityOrigin* topOrigin() const = 0;
90
91 #if ENABLE(BLOB)
92     PublicURLManager& publicURLManager();
93 #endif
94     // Active objects are not garbage collected even if inaccessible, e.g. because their activity may result in callbacks being invoked.
95     bool canSuspendActiveDOMObjects();
96     // Active objects can be asked to suspend even if canSuspendActiveDOMObjects() returns 'false' -
97     // step-by-step JS debugging is one example.
98     virtual void suspendActiveDOMObjects(ActiveDOMObject::ReasonForSuspension);
99     virtual void resumeActiveDOMObjects();
100     virtual void stopActiveDOMObjects();
101
102     bool activeDOMObjectsAreSuspended() const { return m_activeDOMObjectsAreSuspended; }
103     bool activeDOMObjectsAreStopped() const { return m_activeDOMObjectsAreStopped; }
104
105     // Called from the constructor and destructors of ActiveDOMObject.
106     void didCreateActiveDOMObject(ActiveDOMObject*, void* upcastPointer);
107     void willDestroyActiveDOMObject(ActiveDOMObject*);
108
109     // Called after the construction of an ActiveDOMObject to synchronize suspend state.
110     void suspendActiveDOMObjectIfNeeded(ActiveDOMObject*);
111
112     typedef const HashMap<ActiveDOMObject*, void*> ActiveDOMObjectsMap;
113     ActiveDOMObjectsMap& activeDOMObjects() const { return m_activeDOMObjects; }
114
115     void didCreateDestructionObserver(ContextDestructionObserver*);
116     void willDestroyDestructionObserver(ContextDestructionObserver*);
117
118     virtual void suspendScriptedAnimationControllerCallbacks() { }
119     virtual void resumeScriptedAnimationControllerCallbacks() { }
120
121     // MessagePort is conceptually a kind of ActiveDOMObject, but it needs to be tracked separately for message dispatch.
122     void processMessagePortMessagesSoon();
123     void dispatchMessagePortEvents();
124     void createdMessagePort(MessagePort*);
125     void destroyedMessagePort(MessagePort*);
126     const HashSet<MessagePort*>& messagePorts() const { return m_messagePorts; }
127
128     void ref() { refScriptExecutionContext(); }
129     void deref() { derefScriptExecutionContext(); }
130
131     class Task {
132         WTF_MAKE_NONCOPYABLE(Task);
133         WTF_MAKE_FAST_ALLOCATED;
134     public:
135         Task() { }
136         virtual ~Task();
137         virtual void performTask(ScriptExecutionContext*) = 0;
138         // Certain tasks get marked specially so that they aren't discarded, and are executed, when the context is shutting down its message queue.
139         virtual bool isCleanupTask() const { return false; }
140     };
141
142     virtual void postTask(PassOwnPtr<Task>) = 0; // Executes the task on context's thread asynchronously.
143
144     // Gets the next id in a circular sequence from 1 to 2^31-1.
145     int circularSequentialID();
146
147     bool addTimeout(int timeoutId, DOMTimer* timer) { return m_timeouts.add(timeoutId, timer).isNewEntry; }
148     void removeTimeout(int timeoutId) { m_timeouts.remove(timeoutId); }
149     DOMTimer* findTimeout(int timeoutId) { return m_timeouts.get(timeoutId); }
150
151 #if USE(JSC)
152     JSC::JSGlobalData* globalData();
153 #endif
154
155     // Interval is in seconds.
156     void adjustMinimumTimerInterval(double oldMinimumTimerInterval);
157     virtual double minimumTimerInterval() const;
158
159     void didChangeTimerAlignmentInterval();
160     virtual double timerAlignmentInterval() const;
161
162     virtual EventQueue* eventQueue() const = 0;
163
164     virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE;
165
166 #if ENABLE(SQL_DATABASE)
167     void setDatabaseContext(DatabaseContext*);
168 #endif
169
170 protected:
171     class AddConsoleMessageTask : public Task {
172     public:
173         static PassOwnPtr<AddConsoleMessageTask> create(MessageSource source, MessageLevel level, const String& message)
174         {
175             return adoptPtr(new AddConsoleMessageTask(source, level, message));
176         }
177         virtual void performTask(ScriptExecutionContext*);
178     private:
179         AddConsoleMessageTask(MessageSource source, MessageLevel level, const String& message)
180             : m_source(source)
181             , m_level(level)
182             , m_message(message.isolatedCopy())
183         {
184         }
185         MessageSource m_source;
186         MessageLevel m_level;
187         String m_message;
188     };
189
190 private:
191     virtual const KURL& virtualURL() const = 0;
192     virtual KURL virtualCompleteURL(const String&) const = 0;
193
194     virtual void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, PassRefPtr<ScriptCallStack>, ScriptState* = 0, unsigned long requestIdentifier = 0) = 0;
195     virtual EventTarget* errorEventTarget() = 0;
196     virtual void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, PassRefPtr<ScriptCallStack>) = 0;
197     bool dispatchErrorEvent(const String& errorMessage, int lineNumber, const String& sourceURL, CachedScript*);
198
199     void closeMessagePorts();
200
201     virtual void refScriptExecutionContext() = 0;
202     virtual void derefScriptExecutionContext() = 0;
203
204     HashSet<MessagePort*> m_messagePorts;
205     HashSet<ContextDestructionObserver*> m_destructionObservers;
206     HashMap<ActiveDOMObject*, void*> m_activeDOMObjects;
207     bool m_iteratingActiveDOMObjects;
208     bool m_inDestructor;
209
210     int m_circularSequentialID;
211     typedef HashMap<int, DOMTimer*> TimeoutMap;
212     TimeoutMap m_timeouts;
213
214     bool m_inDispatchErrorEvent;
215     class PendingException;
216     OwnPtr<Vector<OwnPtr<PendingException> > > m_pendingExceptions;
217
218     bool m_activeDOMObjectsAreSuspended;
219     ActiveDOMObject::ReasonForSuspension m_reasonForSuspendingActiveDOMObjects;
220     bool m_activeDOMObjectsAreStopped;
221
222 #if ENABLE(BLOB)
223     OwnPtr<PublicURLManager> m_publicURLManager;
224 #endif
225
226 #if ENABLE(SQL_DATABASE)
227     RefPtr<DatabaseContext> m_databaseContext;
228 #endif
229 };
230
231 } // namespace WebCore
232
233 #endif // ScriptExecutionContext_h