2009-02-26 Dimitri Glazkov <dglazkov@chromium.org>
authordglazkov@chromium.org <dglazkov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Feb 2009 23:27:20 +0000 (23:27 +0000)
committerdglazkov@chromium.org <dglazkov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Feb 2009 23:27:20 +0000 (23:27 +0000)
        Reviewed by Eric Seidel.

        http://codereview.chromium.org/27217
        Add custom V8 bindings for Navigator, Clipboard, Document, and Node.

        * bindings/v8/custom/V8ClipboardCustom.cpp: Added.
        (WebCore::ACCESSOR_GETTER):
        (WebCore::CALLBACK_FUNC_DECL):
        * bindings/v8/custom/V8DocumentCustom.cpp: Added.
        (WebCore::CALLBACK_FUNC_DECL):
        * bindings/v8/custom/V8NavigatorCustom.cpp: Added.
        (WebCore::ACCESSOR_GETTER):
        * bindings/v8/custom/V8NodeCustom.cpp: Added.
        (WebCore::CALLBACK_FUNC_DECL):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@41272 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/bindings/v8/custom/V8ClipboardCustom.cpp [new file with mode: 0644]
WebCore/bindings/v8/custom/V8DocumentCustom.cpp [new file with mode: 0644]
WebCore/bindings/v8/custom/V8NavigatorCustom.cpp [new file with mode: 0644]
WebCore/bindings/v8/custom/V8NodeCustom.cpp [new file with mode: 0644]

index a6a7ed7..7d6b8e1 100644 (file)
@@ -1,3 +1,20 @@
+2009-02-26  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Reviewed by Eric Seidel.
+
+        http://codereview.chromium.org/27217
+        Add custom V8 bindings for Navigator, Clipboard, Document, and Node.
+
+        * bindings/v8/custom/V8ClipboardCustom.cpp: Added.
+        (WebCore::ACCESSOR_GETTER):
+        (WebCore::CALLBACK_FUNC_DECL):
+        * bindings/v8/custom/V8DocumentCustom.cpp: Added.
+        (WebCore::CALLBACK_FUNC_DECL):
+        * bindings/v8/custom/V8NavigatorCustom.cpp: Added.
+        (WebCore::ACCESSOR_GETTER):
+        * bindings/v8/custom/V8NodeCustom.cpp: Added.
+        (WebCore::CALLBACK_FUNC_DECL):
+
 2009-02-26  Gustavo Noronha Silva  <gns@gnome.org>
 
         Unreviewed build fix for building with GNOME Keyring enabled.
diff --git a/WebCore/bindings/v8/custom/V8ClipboardCustom.cpp b/WebCore/bindings/v8/custom/V8ClipboardCustom.cpp
new file mode 100644 (file)
index 0000000..f9b8655
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2007-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 clipboardLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE clipboardLIED 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.
+ */
+
+#include "config.h"
+#include "Clipboard.h"
+
+#include "HTMLImageElement.h"
+#include "HTMLNames.h"
+#include "IntPoint.h"
+#include "Node.h"
+#include "Element.h"
+
+#include "V8Binding.h"
+#include "V8CustomBinding.h"
+#include "V8Node.h"
+#include "V8Proxy.h"
+
+namespace WebCore {
+
+ACCESSOR_GETTER(ClipboardTypes)
+{
+    INC_STATS("DOM.Clipboard.types()");
+    Clipboard* clipboard = V8Proxy::ToNativeObject<Clipboard>(V8ClassIndex::CLIPBOARD, info.Holder());
+
+    HashSet<String> types = clipboard->types();
+    if (types.isEmpty())
+        return v8::Null();
+
+    v8::Local<v8::Array> result = v8::Array::New(types.size());
+    HashSet<String>::const_iterator end = types.end();
+    int index = 0;
+    for (HashSet<String>::const_iterator it = types.begin(); it != end; ++it, ++index)
+        result->Set(v8::Integer::New(index), v8String(*it));
+
+    return result;
+}
+
+CALLBACK_FUNC_DECL(ClipboardClearData)
+{
+    INC_STATS("DOM.Clipboard.clearData()");
+    Clipboard* clipboard = V8Proxy::ToNativeObject<Clipboard>(V8ClassIndex::CLIPBOARD, args.Holder());
+
+    if (!args.Length()) {
+        clipboard->clearAllData();
+        return v8::Undefined();
+    }
+
+    if (args.Length() != 1)
+        return throwError("clearData: Invalid number of arguments", V8Proxy::SYNTAX_ERROR);
+
+    String type = toWebCoreString(args[0]);
+    clipboard->clearData(type);
+    return v8::Undefined();
+}
+
+CALLBACK_FUNC_DECL(ClipboardGetData)
+{
+    INC_STATS("DOM.Clipboard.getData()");
+    Clipboard* clipboard = V8Proxy::ToNativeObject<Clipboard>(V8ClassIndex::CLIPBOARD, args.Holder());
+
+    if (args.Length() != 1)
+        return throwError("getData: Invalid number of arguments", V8Proxy::SYNTAX_ERROR);
+
+    bool success;
+    String result = clipboard->getData(toWebCoreString(args[0]), success);
+    if (success)
+        return v8String(result);
+
+    return v8::Undefined();
+}
+
+CALLBACK_FUNC_DECL(ClipboardSetData)
+{
+    INC_STATS("DOM.Clipboard.setData()");
+    Clipboard* clipboard = V8Proxy::ToNativeObject<Clipboard>(V8ClassIndex::CLIPBOARD, args.Holder());
+
+    if (args.Length() != 2)
+        return throwError("setData: Invalid number of arguments", V8Proxy::SYNTAX_ERROR);
+
+    String type = toWebCoreString(args[0]);
+    String data = toWebCoreString(args[1]);
+    return v8Boolean(clipboard->setData(type, data));
+}
+
+CALLBACK_FUNC_DECL(ClipboardSetDragImage)
+{
+    INC_STATS("DOM.Clipboard.setDragImage()");
+    Clipboard* clipboard = V8Proxy::ToNativeObject<Clipboard>(V8ClassIndex::CLIPBOARD, args.Holder());
+
+    if (!clipboard->isForDragging())
+        return v8::Undefined();
+
+    if (args.Length() != 3)
+        return throwError("setDragImage: Invalid number of arguments", V8Proxy::SYNTAX_ERROR);
+
+    int x = toInt32(args[1]);
+    int y = toInt32(args[2]);
+
+    Node* node = 0;
+    if (V8Node::HasInstance(args[0]))
+        node = V8Proxy::DOMWrapperToNode<Node>(args[0]);
+
+    if (!node || !node->isElementNode())
+        return throwError("setDragImageFromElement: Invalid first argument");
+
+    if (static_cast<Element*>(node)->hasLocalName(HTMLNames::imgTag) && !node->inDocument())
+        clipboard->setDragImage(static_cast<HTMLImageElement*>(node)->cachedImage(), IntPoint(x, y));
+    else
+        clipboard->setDragImageElement(node, IntPoint(x, y));
+
+    return v8::Undefined();
+}
+
+} // namespace WebCore
diff --git a/WebCore/bindings/v8/custom/V8DocumentCustom.cpp b/WebCore/bindings/v8/custom/V8DocumentCustom.cpp
new file mode 100644 (file)
index 0000000..07c6745
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2007-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 documentLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE documentLIED 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.
+ */
+
+#include "config.h"
+#include "Document.h"
+
+#include "ExceptionCode.h"
+#include "JSXPathNSResolver.h"
+#include "Node.h"
+#include "XPathNSResolver.h"
+#include "XPathResult.h"
+
+#include "V8Binding.h"
+#include "V8CustomBinding.h"
+#include "V8Node.h"
+#include "V8Proxy.h"
+#include "V8XPathNSResolver.h"
+#include "V8XPathResult.h"
+
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+CALLBACK_FUNC_DECL(DocumentEvaluate)
+{
+    INC_STATS("DOM.Document.evaluate()");
+
+    Document* document = V8Proxy::DOMWrapperToNode<Document>(args.Holder());
+    ExceptionCode ec = 0;
+    String expression = toWebCoreString(args[0]);
+    Node* contextNode = 0;
+    if (V8Node::HasInstance(args[1]))
+        contextNode = V8Proxy::DOMWrapperToNode<Node>(args[1]);
+
+    XPathNSResolver* resolver = 0;
+    if (V8XPathNSResolver::HasInstance(args[2]))
+        resolver = V8Proxy::ToNativeObject<XPathNSResolver>(V8ClassIndex::XPATHNSRESOLVER, args[2]);
+    else if (args[2]->IsObject())
+        resolver = new JSXPathNSResolver(args[2]->ToObject());
+    else if (!args[2]->IsNull() && !args[2]->IsUndefined())
+        return throwError(TYPE_MISMATCH_ERR);
+
+    int type = toInt32(args[3]);
+    XPathResult* inResult = 0;
+    if (V8XPathResult::HasInstance(args[4]))
+        inResult = V8Proxy::ToNativeObject<XPathResult>(V8ClassIndex::XPATHRESULT, args[4]);
+
+    v8::TryCatch exceptionCatcher;
+    RefPtr<XPathResult> result = document->evaluate(expression, contextNode, resolver, type, inResult, ec);
+    if (exceptionCatcher.HasCaught())
+        return throwError(exceptionCatcher.Exception());
+
+    if (ec)
+        return throwError(ec);
+
+    return V8Proxy::ToV8Object(V8ClassIndex::XPATHRESULT, result.get());
+}
+
+} // namespace WebCore
diff --git a/WebCore/bindings/v8/custom/V8NavigatorCustom.cpp b/WebCore/bindings/v8/custom/V8NavigatorCustom.cpp
new file mode 100644 (file)
index 0000000..d6c09a2
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007-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 navigatorLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE navigatorLIED 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.
+ */
+
+#include "config.h"
+#include "Navigator.h"
+
+#include "V8Binding.h"
+#include "V8CustomBinding.h"
+#include "V8Proxy.h"
+
+namespace WebCore {
+
+ACCESSOR_GETTER(NavigatorAppVersion)
+{
+    INC_STATS("DOM.Navigator.appVersion");
+    v8::Handle<v8::Object> holder = info.Holder();
+    Navigator* navigator = V8Proxy::ToNativeObject<Navigator>(V8ClassIndex::NAVIGATOR, holder);
+    return v8StringOrUndefined(navigator->appVersion());
+}
+
+} // namespace WebCore
diff --git a/WebCore/bindings/v8/custom/V8NodeCustom.cpp b/WebCore/bindings/v8/custom/V8NodeCustom.cpp
new file mode 100644 (file)
index 0000000..bf30414
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2007-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.
+ */
+
+#include "config.h"
+#include "Node.h"
+
+#include "Document.h"
+#include "EventListener.h"
+
+#include "V8Binding.h"
+#include "V8CustomBinding.h"
+#include "V8CustomEventListener.h"
+#include "V8Proxy.h"
+
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+CALLBACK_FUNC_DECL(NodeAddEventListener)
+{
+    INC_STATS("DOM.Node.addEventListener()");
+    Node* node = V8Proxy::DOMWrapperToNode<Node>(args.Holder());
+
+    V8Proxy* proxy = V8Proxy::retrieve(node->document()->frame());
+    if (!proxy)
+        return v8::Undefined();
+
+    RefPtr<EventListener> listener = proxy->FindOrCreateV8EventListener(args[1], false);
+    if (listener) {
+        String type = toWebCoreString(args[0]);
+        bool useCapture = args[2]->BooleanValue();
+        node->addEventListener(type, listener, useCapture);
+    }
+    return v8::Undefined();
+}
+
+CALLBACK_FUNC_DECL(NodeRemoveEventListener)
+{
+    INC_STATS("DOM.Node.removeEventListener()");
+    Node* node = V8Proxy::DOMWrapperToNode<Node>(args.Holder());
+
+    V8Proxy* proxy = V8Proxy::retrieve(node->document()->frame());
+    // It is possbile that the owner document of the node is detached
+    // from the frame, return immediately in this case.
+    // See issue http://b/878909
+    if (!proxy)
+        return v8::Undefined();
+
+    RefPtr<EventListener> listener = proxy->FindV8EventListener(args[1], false);
+    if (listener) {
+        String type = toWebCoreString(args[0]);
+        bool useCapture = args[2]->BooleanValue();
+        node->removeEventListener(type, listener.get(), useCapture);
+    }
+
+    return v8::Undefined();
+}
+
+} // namespace WebCore