WebCore/bindings/js/JSDOMGlobalObject.h
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     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 
       
    69 #if COMPILER(WINSCW)
       
    70         DOMWrapperWorld* world() { return d()->m_world; }
       
    71 #else
       
    72         DOMWrapperWorld* world() { return d()->m_world.get(); }
       
    73 #endif
       
    74 
       
    75         virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
       
    76         static const JSC::ClassInfo s_info;
       
    77 
       
    78     private:
       
    79         static void destroyJSDOMGlobalObjectData(void*);
       
    80 
       
    81     protected:
       
    82         struct JSDOMGlobalObjectData : public JSC::JSGlobalObject::JSGlobalObjectData {
       
    83             JSDOMGlobalObjectData(DOMWrapperWorld* world, Destructor destructor = destroyJSDOMGlobalObjectData)
       
    84                 : JSGlobalObjectData(destructor)
       
    85                 , evt(0)
       
    86                 , m_world(world)
       
    87                 , m_injectedScript(0)
       
    88             {
       
    89             }
       
    90 
       
    91             JSDOMStructureMap structures;
       
    92             JSDOMConstructorMap constructors;
       
    93 
       
    94             Event* evt;
       
    95 #if COMPILER(WINSCW)
       
    96             DOMWrapperWorld* m_world;
       
    97 #else
       
    98             RefPtr<DOMWrapperWorld> m_world;
       
    99 #endif
       
   100             JSObject* m_injectedScript;
       
   101         };
       
   102 
       
   103 //    private:
       
   104 //        static void destroyJSDOMGlobalObjectData(void*);
       
   105 
       
   106         JSDOMGlobalObjectData* d() const { return static_cast<JSDOMGlobalObjectData*>(JSC::JSVariableObject::d); }
       
   107     };
       
   108 
       
   109     template<class ConstructorClass>
       
   110     inline JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, const JSDOMGlobalObject* globalObject)
       
   111     {
       
   112         if (JSC::JSObject* constructor = globalObject->constructors().get(&ConstructorClass::s_info))
       
   113             return constructor;
       
   114         JSC::JSObject* constructor = new (exec) ConstructorClass(exec, const_cast<JSDOMGlobalObject*>(globalObject));
       
   115         ASSERT(!globalObject->constructors().contains(&ConstructorClass::s_info));
       
   116         globalObject->constructors().set(&ConstructorClass::s_info, constructor);
       
   117         return constructor;
       
   118     }
       
   119 
       
   120     JSDOMGlobalObject* toJSDOMGlobalObject(Document*, JSC::ExecState*);
       
   121     JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*, JSC::ExecState*);
       
   122 
       
   123     JSDOMGlobalObject* toJSDOMGlobalObject(Document*, DOMWrapperWorld*);
       
   124     JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*, DOMWrapperWorld*);
       
   125 
       
   126 } // namespace WebCore
       
   127 
       
   128 #endif // JSDOMGlobalObject_h