#ifndef V8DOMWrapper_h
#define V8DOMWrapper_h
#include "Node.h"
#include "NodeFilter.h"
#include "PlatformString.h" // for WebCore::String
#include "V8CustomBinding.h"
#include "V8Index.h"
#include "V8Utilities.h"
#include <v8.h>
namespace WebCore {
class CSSRule;
class CSSRuleList;
class CSSStyleDeclaration;
class CSSValue;
class CSSValueList;
class ClientRectList;
class DOMImplementation;
class DOMWindow;
class Document;
class Element;
class Event;
class EventListener;
class EventTarget;
class Frame;
class HTMLCollection;
class HTMLDocument;
class HTMLElement;
class HTMLOptionsCollection;
class MediaList;
class MimeType;
class MimeTypeArray;
class NamedNodeMap;
class Navigator;
class Node;
class NodeFilter;
class NodeList;
class Plugin;
class PluginArray;
class SVGElement;
#if ENABLE(SVG)
class SVGElementInstance;
#endif
class Screen;
class ScriptExecutionContext;
#if ENABLE(DOM_STORAGE)
class Storage;
class StorageEvent;
#endif
class String;
class StyleSheet;
class StyleSheetList;
class V8EventListener;
class V8ObjectEventListener;
class V8DOMWrapper {
public:
#ifndef NDEBUG
static bool maybeDOMWrapper(v8::Handle<v8::Value>);
#endif
static void setDOMWrapper(v8::Handle<v8::Object>, int type, void* ptr);
static v8::Handle<v8::Object> lookupDOMWrapper(V8ClassIndex::V8WrapperType, v8::Handle<v8::Value>);
template <class C>
static C* convertDOMWrapperToNative(v8::Handle<v8::Value> object)
{
ASSERT(maybeDOMWrapper(object));
v8::Handle<v8::Value> ptr = v8::Handle<v8::Object>::Cast(object)->GetInternalField(V8Custom::kDOMWrapperObjectIndex);
return extractCPointer<C>(ptr);
}
static void* convertDOMWrapperToNodeHelper(v8::Handle<v8::Value>);
static v8::Handle<v8::Value> wrapCPointer(void* cptr)
{
int addr = reinterpret_cast<int>(cptr);
ASSERT(!(addr & 0x01)); return v8::Integer::New(addr >> 1);
}
template <class C>
static C* extractCPointer(v8::Handle<v8::Value> obj)
{
return static_cast<C*>(extractCPointerImpl(obj));
}
template <class C>
static C* convertDOMWrapperToNode(v8::Handle<v8::Value> value)
{
return static_cast<C*>(convertDOMWrapperToNodeHelper(value));
}
template<typename T>
static v8::Handle<v8::Value> convertToV8Object(V8ClassIndex::V8WrapperType type, PassRefPtr<T> imp)
{
return convertToV8Object(type, imp.get());
}
static v8::Handle<v8::Value> convertToV8Object(V8ClassIndex::V8WrapperType, void*);
static v8::Handle<v8::Value> convertNodeToV8Object(Node*);
template <class C>
static C* convertToNativeObject(V8ClassIndex::V8WrapperType type, v8::Handle<v8::Value> object)
{
return static_cast<C*>(convertToNativeObjectImpl(type, object));
}
static V8ClassIndex::V8WrapperType domWrapperType(v8::Handle<v8::Object>);
static v8::Handle<v8::Value> convertEventToV8Object(Event*);
static Event* convertToNativeEvent(v8::Handle<v8::Value> jsEvent)
{
if (!isDOMEventWrapper(jsEvent))
return 0;
return convertDOMWrapperToNative<Event>(jsEvent);
}
static v8::Handle<v8::Value> convertEventTargetToV8Object(EventTarget*);
static v8::Handle<v8::Value> convertEventListenerToV8Object(EventListener*);
static v8::Handle<v8::Value> convertDOMImplementationToV8Object(DOMImplementation*);
static PassRefPtr<NodeFilter> wrapNativeNodeFilter(v8::Handle<v8::Value>);
static v8::Persistent<v8::FunctionTemplate> getTemplate(V8ClassIndex::V8WrapperType);
static bool domObjectHasJSWrapper(void*);
static void setJSWrapperForDOMObject(void*, v8::Persistent<v8::Object>);
static void setJSWrapperForActiveDOMObject(void*, v8::Persistent<v8::Object>);
static void setJSWrapperForDOMNode(Node*, v8::Persistent<v8::Object>);
static bool isWrapperOfType(v8::Handle<v8::Value>, V8ClassIndex::V8WrapperType);
static void* convertToSVGPODTypeImpl(V8ClassIndex::V8WrapperType, v8::Handle<v8::Value>);
static bool isDOMEventWrapper(v8::Handle<v8::Value>);
static void* convertToNativeObjectImpl(V8ClassIndex::V8WrapperType, v8::Handle<v8::Value>);
static v8::Handle<v8::Value> convertStyleSheetToV8Object(StyleSheet*);
static v8::Handle<v8::Value> convertCSSValueToV8Object(CSSValue*);
static v8::Handle<v8::Value> convertCSSRuleToV8Object(CSSRule*);
static v8::Handle<v8::Value> convertWindowToV8Object(DOMWindow*);
#if ENABLE(SVG)
static v8::Handle<v8::Value> convertSVGElementInstanceToV8Object(SVGElementInstance*);
static v8::Handle<v8::Value> convertSVGObjectWithContextToV8Object(V8ClassIndex::V8WrapperType, void*);
#endif
private:
static void setHiddenWindowReference(Frame*, const int internalIndex, v8::Handle<v8::Object>);
static void* extractCPointerImpl(v8::Handle<v8::Value> object)
{
ASSERT(object->IsNumber());
int addr = object->Int32Value();
return reinterpret_cast<void*>(addr << 1);
}
static V8ClassIndex::V8WrapperType htmlElementType(HTMLElement*);
#if ENABLE(SVG)
static V8ClassIndex::V8WrapperType svgElementType(SVGElement*);
#endif
static v8::Local<v8::Object> instantiateV8Object(V8ClassIndex::V8WrapperType descType, V8ClassIndex::V8WrapperType cptrType, void* impl)
{
return instantiateV8Object(NULL, descType, cptrType, impl);
}
static v8::Local<v8::Object> instantiateV8Object(V8Proxy*, V8ClassIndex::V8WrapperType, V8ClassIndex::V8WrapperType, void*);
};
}
#endif // V8DOMWrapper_h