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: structures()52 JSDOMStructureMap& structures() { return d()->structures; } constructors()53 JSDOMConstructorMap& constructors() const { return d()->constructors; } 54 55 virtual ScriptExecutionContext* scriptExecutionContext() const = 0; 56 57 // Make binding code generation easier. globalObject()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 world()68 DOMWrapperWorld* world() { return d()->m_world.get(); } 69 classInfo()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) JSGlobalObjectDataJSDOMGlobalObjectData76 : 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 d()94 JSDOMGlobalObjectData* d() const { return static_cast<JSDOMGlobalObjectData*>(JSC::JSVariableObject::d); } 95 }; 96 97 template<class ConstructorClass> getDOMConstructor(JSC::ExecState * exec,const JSDOMGlobalObject * globalObject)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 117