WebCore:
[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         virtual String encoding() const = 0;
64
65         SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); }
66
67         virtual void reportException(const String& errorMessage, int lineNumber, const String& sourceURL) = 0;
68         virtual void addMessage(MessageDestination, MessageSource, MessageLevel, const String& message, unsigned lineNumber, const String& sourceURL) = 0;
69         virtual void resourceRetrievedByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString) = 0;
70
71         // Active objects are not garbage collected even if inaccessible, e.g. because their activity may result in callbacks being invoked.
72         bool canSuspendActiveDOMObjects();
73         // Active objects can be asked to suspend even if canSuspendActiveDOMObjects() returns 'false' -
74         // step-by-step JS debugging is one example.
75         void suspendActiveDOMObjects();
76         void resumeActiveDOMObjects();
77         void stopActiveDOMObjects();
78         void createdActiveDOMObject(ActiveDOMObject*, void* upcastPointer);
79         void destroyedActiveDOMObject(ActiveDOMObject*);
80         typedef const HashMap<ActiveDOMObject*, void*> ActiveDOMObjectsMap;
81         ActiveDOMObjectsMap& activeDOMObjects() const { return m_activeDOMObjects; }
82
83         // MessagePort is conceptually a kind of ActiveDOMObject, but it needs to be tracked separately for message dispatch.
84         void processMessagePortMessagesSoon();
85         void dispatchMessagePortEvents();
86         void createdMessagePort(MessagePort*);
87         void destroyedMessagePort(MessagePort*);
88         const HashSet<MessagePort*>& messagePorts() const { return m_messagePorts; }
89
90         void ref() { refScriptExecutionContext(); }
91         void deref() { derefScriptExecutionContext(); }
92
93         class Task : public ThreadSafeShared<Task> {
94         public:
95             virtual ~Task();
96             virtual void performTask(ScriptExecutionContext*) = 0;
97         };
98
99         virtual void postTask(PassRefPtr<Task>) = 0; // Executes the task on context's thread asynchronously.
100
101         void addTimeout(int timeoutId, DOMTimer*);
102         void removeTimeout(int timeoutId);
103         DOMTimer* findTimeout(int timeoutId);
104
105     protected:
106         // Explicitly override the security origin for this script context.
107         // Note: It is dangerous to change the security origin of a script context
108         //       that already contains content.
109         void setSecurityOrigin(PassRefPtr<SecurityOrigin>);
110
111     private:
112         virtual const KURL& virtualURL() const = 0;
113         virtual KURL virtualCompleteURL(const String&) const = 0;
114
115         RefPtr<SecurityOrigin> m_securityOrigin;
116
117         HashSet<MessagePort*> m_messagePorts;
118
119         HashMap<ActiveDOMObject*, void*> m_activeDOMObjects;
120
121         HashMap<int, DOMTimer*> m_timeouts;
122
123         virtual void refScriptExecutionContext() = 0;
124         virtual void derefScriptExecutionContext() = 0;
125     };
126
127 } // namespace WebCore
128
129
130 #endif // ScriptExecutionContext_h