2011-01-27 Oliver Hunt <oliver@apple.com>
[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::WriteBarrier<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             {
80             }
81
82             JSDOMStructureMap structures;
83             JSDOMConstructorMap constructors;
84
85             Event* evt;
86             RefPtr<DOMWrapperWorld> m_world;
87             JSC::WriteBarrier<JSObject> m_injectedScript;
88         };
89
90     private:
91         static void destroyJSDOMGlobalObjectData(void*);
92
93         JSDOMGlobalObjectData* d() const { return static_cast<JSDOMGlobalObjectData*>(JSC::JSVariableObject::d); }
94     };
95
96     template<class ConstructorClass>
97     inline JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, const JSDOMGlobalObject* globalObject)
98     {
99         if (JSC::JSObject* constructor = globalObject->constructors().get(&ConstructorClass::s_info).get())
100             return constructor;
101         JSC::JSObject* constructor = new (exec) ConstructorClass(exec, const_cast<JSDOMGlobalObject*>(globalObject));
102         ASSERT(!globalObject->constructors().contains(&ConstructorClass::s_info));
103         JSC::WriteBarrier<JSC::JSObject> temp;
104         globalObject->constructors().add(&ConstructorClass::s_info, temp).first->second.set(exec->globalData(), globalObject, 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