summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/v8/V8DOMWrapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/v8/V8DOMWrapper.h')
-rw-r--r--WebCore/bindings/v8/V8DOMWrapper.h260
1 files changed, 260 insertions, 0 deletions
diff --git a/WebCore/bindings/v8/V8DOMWrapper.h b/WebCore/bindings/v8/V8DOMWrapper.h
new file mode 100644
index 0000000..57b3a69
--- /dev/null
+++ b/WebCore/bindings/v8/V8DOMWrapper.h
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef V8DOMWrapper_h
+#define V8DOMWrapper_h
+
+#include "Event.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 {
+
+ // FIXME: This probably aren't all needed.
+ 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 WorkerContext;
+
+ class V8DOMWrapper {
+ public:
+#ifndef NDEBUG
+ // Checks if a v8 value can be a DOM wrapper
+ static bool maybeDOMWrapper(v8::Handle<v8::Value>);
+#endif
+
+ // Sets contents of a DOM wrapper.
+ static void setDOMWrapper(v8::Handle<v8::Object>, int type, void* ptr);
+
+ static v8::Handle<v8::Object> lookupDOMWrapper(V8ClassIndex::V8WrapperType type, v8::Handle<v8::Object> object)
+ {
+ return object.IsEmpty() ? object : object->FindInstanceInPrototypeChain(getTemplate(type));
+ }
+
+ // A helper function extract native object pointer from a DOM wrapper
+ // and cast to the specified type.
+ template <class C>
+ static C* convertDOMWrapperToNative(v8::Handle<v8::Object> object)
+ {
+ ASSERT(maybeDOMWrapper(object));
+ return reinterpret_cast<C*>(object->GetPointerFromInternalField(V8Custom::kDOMWrapperObjectIndex));
+ }
+
+ template <class C>
+ static C* convertDOMWrapperToNode(v8::Handle<v8::Object> object)
+ {
+ ASSERT(maybeDOMWrapper(object));
+ ASSERT(domWrapperType(object) == V8ClassIndex::NODE);
+ return convertDOMWrapperToNative<C>(object);
+ }
+
+ 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*);
+
+ // Fast-path for Node objects.
+ static v8::Handle<v8::Value> convertNodeToV8Object(PassRefPtr<Node> node)
+ {
+ return convertNodeToV8Object(node.get());
+ }
+
+ static v8::Handle<v8::Value> convertNodeToV8Object(Node*);
+
+ template <class C>
+ static C* convertToNativeObject(V8ClassIndex::V8WrapperType type, v8::Handle<v8::Object> object)
+ {
+ // Native event listener is per frame, it cannot be handled by this generic function.
+ ASSERT(type != V8ClassIndex::EVENTLISTENER);
+ ASSERT(type != V8ClassIndex::EVENTTARGET);
+
+ ASSERT(maybeDOMWrapper(object));
+
+#ifndef NDEBUG
+ const bool typeIsValid =
+#define MAKE_CASE(TYPE, NAME) (type != V8ClassIndex::TYPE) &&
+ DOM_NODE_TYPES(MAKE_CASE)
+#if ENABLE(SVG)
+ SVG_NODE_TYPES(MAKE_CASE)
+#endif
+#undef MAKE_CASE
+ true;
+ ASSERT(typeIsValid);
+#endif
+
+ return convertDOMWrapperToNative<C>(object);
+ }
+
+ static V8ClassIndex::V8WrapperType domWrapperType(v8::Handle<v8::Object>);
+
+ static v8::Handle<v8::Value> convertEventToV8Object(PassRefPtr<Event> event)
+ {
+ return convertEventToV8Object(event.get());
+ }
+
+ static v8::Handle<v8::Value> convertEventToV8Object(Event*);
+
+ static Event* convertToNativeEvent(v8::Handle<v8::Value> jsEvent)
+ {
+ if (!isDOMEventWrapper(jsEvent))
+ return 0;
+ return convertDOMWrapperToNative<Event>(v8::Handle<v8::Object>::Cast(jsEvent));
+ }
+
+ static v8::Handle<v8::Value> convertEventTargetToV8Object(PassRefPtr<EventTarget> eventTarget)
+ {
+ return convertEventTargetToV8Object(eventTarget.get());
+ }
+
+ static v8::Handle<v8::Value> convertEventTargetToV8Object(EventTarget*);
+
+ // Wrap and unwrap JS event listeners.
+ static v8::Handle<v8::Value> convertEventListenerToV8Object(PassRefPtr<Event> eventListener)
+ {
+ return convertEventListenerToV8Object(eventListener.get());
+ }
+
+ static v8::Handle<v8::Value> convertEventListenerToV8Object(EventListener*);
+
+ // DOMImplementation is a singleton and it is handled in a special
+ // way. A wrapper is generated per document and stored in an
+ // internal field of the document.
+ static v8::Handle<v8::Value> convertDOMImplementationToV8Object(DOMImplementation*);
+
+ // Wrap JS node filter in C++.
+ static PassRefPtr<NodeFilter> wrapNativeNodeFilter(v8::Handle<v8::Value>);
+
+ static v8::Persistent<v8::FunctionTemplate> getTemplate(V8ClassIndex::V8WrapperType);
+ static v8::Local<v8::Function> getConstructorForContext(V8ClassIndex::V8WrapperType, v8::Handle<v8::Context>);
+ static v8::Local<v8::Function> getConstructor(V8ClassIndex::V8WrapperType, v8::Handle<v8::Value> objectPrototype);
+ static v8::Local<v8::Function> getConstructor(V8ClassIndex::V8WrapperType, DOMWindow*);
+ static v8::Local<v8::Function> getConstructor(V8ClassIndex::V8WrapperType, WorkerContext*);
+
+ // Checks whether a DOM object has a JS wrapper.
+ static bool domObjectHasJSWrapper(void*);
+ // Set JS wrapper of a DOM object, the caller in charge of increase ref.
+ static void setJSWrapperForDOMObject(void*, v8::Persistent<v8::Object>);
+ static void setJSWrapperForActiveDOMObject(void*, v8::Persistent<v8::Object>);
+ static void setJSWrapperForDOMNode(Node*, v8::Persistent<v8::Object>);
+
+ // Check whether a V8 value is a wrapper of type |classType|.
+ static bool isWrapperOfType(v8::Handle<v8::Value>, V8ClassIndex::V8WrapperType);
+
+ static void* convertToSVGPODTypeImpl(V8ClassIndex::V8WrapperType, v8::Handle<v8::Value>);
+
+ // Check whether a V8 value is a DOM Event wrapper.
+ static bool isDOMEventWrapper(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*);
+ // Returns the JS wrapper of a window object, initializes the environment
+ // of the window frame if needed.
+ 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:
+ // Set hidden references in a DOMWindow object of a frame.
+ static void setHiddenWindowReference(Frame*, const int internalIndex, v8::Handle<v8::Object>);
+
+ static V8ClassIndex::V8WrapperType htmlElementType(HTMLElement*);
+#if ENABLE(SVG)
+ static V8ClassIndex::V8WrapperType svgElementType(SVGElement*);
+#endif
+
+ // The first V8WrapperType specifies the function descriptor
+ // used to create JS object. The second V8WrapperType specifies
+ // the actual type of the void* for type casting.
+ // For example, a HTML element has HTMLELEMENT for the first V8WrapperType, but always
+ // use NODE as the second V8WrapperType. JS wrapper stores the second
+ // V8WrapperType and the void* as internal fields.
+ 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