cf327d783f3a0d23bce6cca3ae04457d7651fa76
[WebKit-https.git] / WebCore / dom / ScriptExecutionContext.h
1 /*
2  * Copyright (C) 2008 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 ScriptExecutionContext_h
28 #define ScriptExecutionContext_h
29
30 #include "Console.h"
31 #include "KURL.h"
32 #include <wtf/HashMap.h>
33 #include <wtf/HashSet.h>
34 #include <wtf/PassRefPtr.h>
35 #include <wtf/Threading.h>
36
37 namespace WebCore {
38
39     class ActiveDOMObject;
40     class DOMTimer;
41     class MessagePort;
42     class SecurityOrigin;
43     class ScriptString;
44     class String;
45
46     enum MessageDestination {
47         InspectorControllerDestination,
48         ConsoleDestination,
49     };
50
51     class ScriptExecutionContext {
52     public:
53         ScriptExecutionContext();
54         virtual ~ScriptExecutionContext();
55
56         virtual bool isDocument() const { return false; }
57         virtual bool isWorkerContext() const { return false; }
58
59         const KURL& url() const { return virtualURL(); }
60         KURL completeURL(const String& url) const { return virtualCompleteURL(url); }
61
62         virtual String userAgent(const KURL&) const = 0;
63
64         SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); }
65
66         virtual void reportException(const String& errorMessage, int lineNumber, const String& sourceURL) = 0;
67         virtual void addMessage(MessageDestination, MessageSource, MessageLevel, const String& message, unsigned lineNumber, const String& sourceURL) = 0;
68         virtual void resourceRetrievedByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString) = 0;
69
70         // Active objects are not garbage collected even if inaccessible, e.g. because their activity may result in callbacks being invoked.
71         bool canSuspendActiveDOMObjects();
72         // Active objects can be asked to suspend even if canSuspendActiveDOMObjects() returns 'false' -
73         // step-by-step JS debugging is one example.
74         void suspendActiveDOMObjects();
75         void resumeActiveDOMObjects();
76         void stopActiveDOMObjects();
77         void createdActiveDOMObject(ActiveDOMObject*, void* upcastPointer);
78         void destroyedActiveDOMObject(ActiveDOMObject*);
79         typedef const HashMap<ActiveDOMObject*, void*> ActiveDOMObjectsMap;
80         ActiveDOMObjectsMap& activeDOMObjects() const { return m_activeDOMObjects; }
81
82         // MessagePort is conceptually a kind of ActiveDOMObject, but it needs to be tracked separately for message dispatch.
83         void processMessagePortMessagesSoon();
84         void dispatchMessagePortEvents();
85         void createdMessagePort(MessagePort*);
86         void destroyedMessagePort(MessagePort*);
87         const HashSet<MessagePort*>& messagePorts() const { return m_messagePorts; }
88
89         void ref() { refScriptExecutionContext(); }
90         void deref() { derefScriptExecutionContext(); }
91
92         class Task : public ThreadSafeShared<Task> {
93         public:
94             virtual ~Task();
95             virtual void performTask(ScriptExecutionContext*) = 0;
96         };
97
98         virtual void postTask(PassRefPtr<Task>) = 0; // Executes the task on context's thread asynchronously.
99
100         void addTimeout(int timeoutId, DOMTimer*);
101         void removeTimeout(int timeoutId);
102         DOMTimer* findTimeout(int timeoutId);
103
104     protected:
105         // Explicitly override the security origin for this script context.
106         // Note: It is dangerous to change the security origin of a script context
107         //       that already contains content.
108         void setSecurityOrigin(PassRefPtr<SecurityOrigin>);
109
110     private:
111         virtual const KURL& virtualURL() const = 0;
112         virtual KURL virtualCompleteURL(const String&) const = 0;
113
114         RefPtr<SecurityOrigin> m_securityOrigin;
115
116         HashSet<MessagePort*> m_messagePorts;
117
118         HashMap<ActiveDOMObject*, void*> m_activeDOMObjects;
119
120         HashMap<int, DOMTimer*> m_timeouts;
121
122         virtual void refScriptExecutionContext() = 0;
123         virtual void derefScriptExecutionContext() = 0;
124     };
125
126 } // namespace WebCore
127
128
129 #endif // ScriptExecutionContext_h