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(PassRefPtr<JSC::Structure>, JSDOMGlobalObjectData*, JSC::JSObject* thisValue); 49 virtual ~JSDOMGlobalObject(); 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 // Finds a wrapper of a GC-unprotected JS EventListener, returns 0 if no existing one. 58 JSEventListener* findJSEventListener(JSC::JSValue); 59 60 // Finds or creates a wrapper of a JS EventListener. JS EventListener object is *NOT* GC-protected. 61 PassRefPtr<JSEventListener> findOrCreateJSEventListener(JSC::JSValue); 62 63 // Creates a GC-protected JS EventListener for an "onXXX" event attribute. 64 // These listeners cannot be removed through the removeEventListener API. 65 PassRefPtr<JSEventListener> createJSAttributeEventListener(JSC::JSValue); 66 67 typedef HashMap<JSC::JSObject*, JSEventListener*> JSListenersMap; 68 69 JSListenersMap& jsEventListeners(); 70 71 // Make binding code generation easier. globalObject()72 JSDOMGlobalObject* globalObject() { return this; } 73 74 void setCurrentEvent(Event*); 75 Event* currentEvent() const; 76 77 virtual void markChildren(JSC::MarkStack&); 78 79 protected: 80 struct JSDOMGlobalObjectData : public JSC::JSGlobalObject::JSGlobalObjectData { 81 JSDOMGlobalObjectData(); 82 83 JSDOMStructureMap structures; 84 JSDOMConstructorMap constructors; 85 86 JSDOMGlobalObject::JSListenersMap jsEventListeners; 87 88 Event* evt; 89 }; 90 91 private: d()92 JSDOMGlobalObjectData* d() const { return static_cast<JSDOMGlobalObjectData*>(JSC::JSVariableObject::d); } 93 }; 94 95 template<class ConstructorClass> getDOMConstructor(JSC::ExecState * exec,const JSDOMGlobalObject * globalObject)96 inline JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, const JSDOMGlobalObject* globalObject) 97 { 98 if (JSC::JSObject* constructor = globalObject->constructors().get(&ConstructorClass::s_info)) 99 return constructor; 100 JSC::JSObject* constructor = new (exec) ConstructorClass(exec, const_cast<JSDOMGlobalObject*>(globalObject)); 101 ASSERT(!globalObject->constructors().contains(&ConstructorClass::s_info)); 102 globalObject->constructors().set(&ConstructorClass::s_info, constructor); 103 return constructor; 104 } 105 106 JSDOMGlobalObject* toJSDOMGlobalObject(Document*); 107 JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*); 108 109 } // namespace WebCore 110 111 #endif // JSDOMGlobalObject_h 112