00c3bbf1bc2afb4c14bd7bd38e31b3d02696b132
[WebKit.git] / 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 JSLazyEventListener;
37     class JSEventListener;
38     class ScriptExecutionContext;
39
40     typedef HashMap<const JSC::ClassInfo*, RefPtr<JSC::Structure> > JSDOMStructureMap;
41     typedef HashMap<const JSC::ClassInfo*, JSC::JSObject*> JSDOMConstructorMap;
42
43     class JSDOMGlobalObject : public JSC::JSGlobalObject {
44         typedef JSC::JSGlobalObject Base;
45     protected:
46         struct JSDOMGlobalObjectData;
47
48         JSDOMGlobalObject(NonNullPassRefPtr<JSC::Structure>, JSDOMGlobalObjectData*, JSC::JSObject* thisValue);
49
50     public:
51         JSDOMStructureMap& structures() { return d()->structures; }
52         JSDOMConstructorMap& constructors() const { return d()->constructors; }
53
54         virtual ScriptExecutionContext* scriptExecutionContext() const = 0;
55
56         // Creates a JS EventListener for an "onXXX" event attribute. These
57         // listeners cannot be removed through the removeEventListener API.
58         PassRefPtr<JSEventListener> createJSAttributeEventListener(JSC::JSValue);
59
60         // Make binding code generation easier.
61         JSDOMGlobalObject* globalObject() { return this; }
62
63         void setCurrentEvent(Event*);
64         Event* currentEvent() const;
65
66         virtual void markChildren(JSC::MarkStack&);
67
68     protected:
69         struct JSDOMGlobalObjectData : public JSC::JSGlobalObject::JSGlobalObjectData {
70             JSDOMGlobalObjectData()
71                 : JSGlobalObjectData(destroyJSDOMGlobalObjectData)
72                 , evt(0)
73             {
74             }
75
76             JSDOMStructureMap structures;
77             JSDOMConstructorMap constructors;
78
79             Event* evt;
80         };
81
82     private:
83         static void destroyJSDOMGlobalObjectData(void*);
84
85         JSDOMGlobalObjectData* d() const { return static_cast<JSDOMGlobalObjectData*>(JSC::JSVariableObject::d); }
86     };
87
88     template<class ConstructorClass>
89     inline JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, const JSDOMGlobalObject* globalObject)
90     {
91         if (JSC::JSObject* constructor = globalObject->constructors().get(&ConstructorClass::s_info))
92             return constructor;
93         JSC::JSObject* constructor = new (exec) ConstructorClass(exec, const_cast<JSDOMGlobalObject*>(globalObject));
94         ASSERT(!globalObject->constructors().contains(&ConstructorClass::s_info));
95         globalObject->constructors().set(&ConstructorClass::s_info, constructor);
96         return constructor;
97     }
98
99     JSDOMGlobalObject* toJSDOMGlobalObject(Document*);
100     JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*);
101
102 } // namespace WebCore
103
104 #endif // JSDOMGlobalObject_h