8eb55c14847cbe97d418242b37fb74d437d5ce73
[WebKit-https.git] / Source / WebCore / bindings / js / JSDOMGlobalObject.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 JSDOMGlobalObject_h
28 #define JSDOMGlobalObject_h
29
30 #include <runtime/JSGlobalObject.h>
31
32 namespace WebCore {
33
34     class Document;
35     class Event;
36     class DOMWrapperWorld;
37     class JSLazyEventListener;
38     class JSEventListener;
39     class ScriptExecutionContext;
40
41     typedef HashMap<const JSC::ClassInfo*, RefPtr<JSC::Structure> > JSDOMStructureMap;
42     typedef HashMap<const JSC::ClassInfo*, JSC::JSObject*> JSDOMConstructorMap;
43
44     class JSDOMGlobalObject : public JSC::JSGlobalObject {
45         typedef JSC::JSGlobalObject Base;
46     protected:
47         struct JSDOMGlobalObjectData;
48
49         JSDOMGlobalObject(NonNullPassRefPtr<JSC::Structure>, JSDOMGlobalObjectData*, JSC::JSObject* thisValue);
50
51     public:
52         JSDOMStructureMap& structures() { return d()->structures; }
53         JSDOMConstructorMap& constructors() const { return d()->constructors; }
54
55         virtual ScriptExecutionContext* scriptExecutionContext() const = 0;
56
57         // Make binding code generation easier.
58         JSDOMGlobalObject* globalObject() { return this; }
59
60         void setCurrentEvent(Event*);
61         Event* currentEvent() const;
62
63         void setInjectedScript(JSObject*);
64         JSObject* injectedScript() const;
65
66         virtual void markChildren(JSC::MarkStack&);
67
68         DOMWrapperWorld* world() { return d()->m_world.get(); }
69
70         virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
71         static const JSC::ClassInfo s_info;
72
73     protected:
74         struct JSDOMGlobalObjectData : public JSC::JSGlobalObject::JSGlobalObjectData {
75             JSDOMGlobalObjectData(DOMWrapperWorld* world, Destructor destructor = destroyJSDOMGlobalObjectData)
76                 : JSGlobalObjectData(destructor)
77                 , evt(0)
78                 , m_world(world)
79                 , m_injectedScript(0)
80             {
81             }
82
83             JSDOMStructureMap structures;
84             JSDOMConstructorMap constructors;
85
86             Event* evt;
87             RefPtr<DOMWrapperWorld> m_world;
88             JSObject* m_injectedScript;
89         };
90
91     private:
92         static void destroyJSDOMGlobalObjectData(void*);
93
94         JSDOMGlobalObjectData* d() const { return static_cast<JSDOMGlobalObjectData*>(JSC::JSVariableObject::d); }
95     };
96
97     template<class ConstructorClass>
98     inline JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, const JSDOMGlobalObject* globalObject)
99     {
100         if (JSC::JSObject* constructor = globalObject->constructors().get(&ConstructorClass::s_info))
101             return constructor;
102         JSC::JSObject* constructor = new (exec) ConstructorClass(exec, const_cast<JSDOMGlobalObject*>(globalObject));
103         ASSERT(!globalObject->constructors().contains(&ConstructorClass::s_info));
104         globalObject->constructors().set(&ConstructorClass::s_info, constructor);
105         return constructor;
106     }
107
108     JSDOMGlobalObject* toJSDOMGlobalObject(Document*, JSC::ExecState*);
109     JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*, JSC::ExecState*);
110
111     JSDOMGlobalObject* toJSDOMGlobalObject(Document*, DOMWrapperWorld*);
112     JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*, DOMWrapperWorld*);
113
114 } // namespace WebCore
115
116 #endif // JSDOMGlobalObject_h