Introduce JavaScriptVariant object.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Aug 2012 20:40:11 +0000 (20:40 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Aug 2012 20:40:11 +0000 (20:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=93644

The JavaScriptVariant can be used for functions that return results from
JavaScript such as executeJavaScript or functions that take arguments
to pass a variable to JavaScript and they want to make sure the type
is correct.

Convert executeJavaScriptFunction() to use this data type as the
example, other functions will be converted in the future.

PR 14929

Internally reviewed by Joe Mason
Patch by Benjamin C Meyer <bmeyer@rim.com> on 2012-08-10
Reviewed by Adam Treat

Source/WebKit:

* PlatformBlackBerry.cmake:

Source/WebKit/blackberry:

* Api/JavaScriptVariant.cpp: Added.
(WebKit):
(BlackBerry::WebKit::JSValueRefToBlackBerryJavaScriptVariant):
(BlackBerry::WebKit::BlackBerryJavaScriptVariantToJSValueRef):
(BlackBerry::WebKit::JavaScriptVariant::JavaScriptVariant):
(BlackBerry::WebKit::JavaScriptVariant::~JavaScriptVariant):
(BlackBerry::WebKit::JavaScriptVariant::operator=):
(BlackBerry::WebKit::JavaScriptVariant::setType):
(BlackBerry::WebKit::JavaScriptVariant::type):
(BlackBerry::WebKit::JavaScriptVariant::setDouble):
(BlackBerry::WebKit::JavaScriptVariant::doubleValue):
(BlackBerry::WebKit::JavaScriptVariant::setString):
(BlackBerry::WebKit::JavaScriptVariant::stringValue):
(BlackBerry::WebKit::JavaScriptVariant::setBoolean):
(BlackBerry::WebKit::JavaScriptVariant::booleanValue):
* Api/JavaScriptVariant.h: Added.
(WebKit):
* Api/JavaScriptVariant_p.h: Added.
(WebKit):
* Api/WebPage.cpp:
(BlackBerry::WebKit::WebPage::executeJavaScriptFunction):
* Api/WebPage.h:

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

Source/WebKit/ChangeLog
Source/WebKit/PlatformBlackBerry.cmake
Source/WebKit/blackberry/Api/JavaScriptVariant.cpp [new file with mode: 0644]
Source/WebKit/blackberry/Api/JavaScriptVariant.h [new file with mode: 0644]
Source/WebKit/blackberry/Api/JavaScriptVariant_p.h [new file with mode: 0644]
Source/WebKit/blackberry/Api/WebPage.cpp
Source/WebKit/blackberry/Api/WebPage.h
Source/WebKit/blackberry/ChangeLog

index 96424ce..9049dbc 100644 (file)
@@ -1,3 +1,23 @@
+2012-08-10  Benjamin C Meyer  <bmeyer@rim.com>
+
+        Introduce JavaScriptVariant object.
+        https://bugs.webkit.org/show_bug.cgi?id=93644
+
+        The JavaScriptVariant can be used for functions that return results from
+        JavaScript such as executeJavaScript or functions that take arguments
+        to pass a variable to JavaScript and they want to make sure the type
+        is correct.
+
+        Convert executeJavaScriptFunction() to use this data type as the
+        example, other functions will be converted in the future.
+
+        PR 14929
+
+        Internally reviewed by Joe Mason
+        Reviewed by Adam Treat
+
+        * PlatformBlackBerry.cmake:
+
 2012-08-10  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         [BlackBerry] Fix wrong include path for notifications.
index 0886309..d133d0f 100644 (file)
@@ -69,6 +69,7 @@ LIST(APPEND WebKit_SOURCES
     blackberry/Api/WebSettings.cpp
     blackberry/Api/WebString.cpp
     blackberry/Api/WebViewportArguments.cpp
+    blackberry/Api/JavaScriptVariant.cpp
     blackberry/WebCoreSupport/AutofillManager.cpp
     blackberry/WebCoreSupport/CacheClientBlackBerry.cpp
     blackberry/WebCoreSupport/ChromeClientBlackBerry.cpp
diff --git a/Source/WebKit/blackberry/Api/JavaScriptVariant.cpp b/Source/WebKit/blackberry/Api/JavaScriptVariant.cpp
new file mode 100644 (file)
index 0000000..1967ae0
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "config.h"
+#include "JavaScriptVariant.h"
+
+#include "JavaScriptVariant_p.h"
+#include "WebPage.h"
+#include <JSStringRef.h>
+#include <JSValueRef.h>
+#include <stdlib.h>
+#include <wtf/Vector.h>
+
+namespace BlackBerry {
+namespace WebKit {
+
+JavaScriptVariant JSValueRefToBlackBerryJavaScriptVariant(const JSGlobalContextRef& ctx, const JSValueRef& value)
+{
+    JavaScriptVariant returnValue;
+
+    switch (JSValueGetType(ctx, value)) {
+    case kJSTypeNull:
+        returnValue.setType(JavaScriptVariant::Null);
+        break;
+    case kJSTypeBoolean:
+        returnValue.setBoolean(JSValueToBoolean(ctx, value));
+        break;
+    case kJSTypeNumber:
+        returnValue.setDouble(JSValueToNumber(ctx, value, 0));
+        break;
+    case kJSTypeString: {
+        JSStringRef stringRef = JSValueToStringCopy(ctx, value, 0);
+        size_t bufferSize = JSStringGetMaximumUTF8CStringSize(stringRef);
+        WTF::Vector<char> buffer(bufferSize);
+        JSStringGetUTF8CString(stringRef, buffer.data(), bufferSize);
+        returnValue.setString(WebString::fromUtf8(buffer.data()).utf8().c_str());
+        break;
+    }
+    case kJSTypeObject:
+        returnValue.setType(JavaScriptVariant::Object);
+        break;
+    case kJSTypeUndefined:
+        returnValue.setType(JavaScriptVariant::Undefined);
+        break;
+    }
+    return returnValue;
+}
+
+JSValueRef BlackBerryJavaScriptVariantToJSValueRef(const JSGlobalContextRef& ctx, const JavaScriptVariant& variant)
+{
+    JSValueRef ref = 0;
+    switch (variant.type()) {
+    case JavaScriptVariant::Undefined:
+        ref = JSValueMakeUndefined(ctx);
+        break;
+    case JavaScriptVariant::Null:
+        ref = JSValueMakeNull(ctx);
+        break;
+    case JavaScriptVariant::Boolean:
+        ref = JSValueMakeBoolean(ctx, variant.booleanValue());
+        break;
+    case JavaScriptVariant::Number:
+        ref = JSValueMakeNumber(ctx, variant.doubleValue());
+        break;
+    case JavaScriptVariant::String: {
+        JSStringRef str = JSStringCreateWithUTF8CString(variant.stringValue());
+        ref = JSValueMakeString(ctx, str);
+        JSStringRelease(str);
+        break;
+    }
+    case JavaScriptVariant::Exception:
+    case JavaScriptVariant::Object:
+        ASSERT_NOT_REACHED();
+        break;
+    }
+    return ref;
+}
+
+JavaScriptVariant::JavaScriptVariant()
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+}
+
+JavaScriptVariant::JavaScriptVariant(double value)
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+    setDouble(value);
+}
+
+JavaScriptVariant::JavaScriptVariant(int value)
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+    setDouble(value);
+}
+
+JavaScriptVariant::JavaScriptVariant(const char* value)
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+    setString(value);
+}
+
+JavaScriptVariant::JavaScriptVariant(const std::string& value)
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+    setString(value.c_str());
+}
+
+JavaScriptVariant::JavaScriptVariant(bool value)
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+    setBoolean(value);
+}
+
+JavaScriptVariant::JavaScriptVariant(const JavaScriptVariant &v)
+    : m_type(Undefined)
+    , m_stringValue(0)
+{
+    this->operator=(v);
+}
+
+JavaScriptVariant::~JavaScriptVariant()
+{
+    // Prevent memory leaks if we have strings
+    setType(Undefined);
+}
+
+JavaScriptVariant& JavaScriptVariant::operator=(const JavaScriptVariant& v)
+{
+    switch (v.type()) {
+    case Boolean:
+        setBoolean(v.booleanValue());
+        break;
+    case Number:
+        setDouble(v.doubleValue());
+        break;
+    case String:
+        setString(v.stringValue());
+        break;
+    default:
+        setType(v.type());
+        break;
+    }
+
+    return *this;
+}
+
+void JavaScriptVariant::setType(const DataType& type)
+{
+    if (m_type == String)
+        free(m_stringValue);
+    m_type = type;
+    m_stringValue = 0;
+}
+
+JavaScriptVariant::DataType JavaScriptVariant::type() const
+{
+    return m_type;
+}
+
+void JavaScriptVariant::setDouble(double value)
+{
+    setType(Number);
+    m_doubleValue = value;
+}
+
+double JavaScriptVariant::doubleValue() const
+{
+    return m_doubleValue;
+}
+
+void JavaScriptVariant::setString(const char* value)
+{
+    setType(String);
+    m_stringValue = strdup(value);
+}
+
+char* JavaScriptVariant::stringValue() const
+{
+    return m_stringValue;
+}
+
+void JavaScriptVariant::setBoolean(bool value)
+{
+    setType(Boolean);
+    m_booleanValue = value;
+}
+
+bool JavaScriptVariant::booleanValue() const
+{
+    return m_booleanValue;
+}
+
+}
+}
diff --git a/Source/WebKit/blackberry/Api/JavaScriptVariant.h b/Source/WebKit/blackberry/Api/JavaScriptVariant.h
new file mode 100644 (file)
index 0000000..7623a56
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef JavaScriptVariant_h
+#define JavaScriptVariant_h
+
+#include "BlackBerryGlobal.h"
+
+#include <string>
+
+namespace BlackBerry {
+namespace WebKit {
+
+class BLACKBERRY_EXPORT JavaScriptVariant {
+public:
+    enum DataType {
+        Undefined = 0,
+        Null,
+        Boolean,
+        Number,
+        String,
+        Object,
+        Exception
+    };
+
+    JavaScriptVariant();
+    JavaScriptVariant(const JavaScriptVariant&);
+    JavaScriptVariant(double);
+    JavaScriptVariant(int);
+    JavaScriptVariant(const char*);
+    JavaScriptVariant(bool);
+    JavaScriptVariant(const std::string&);
+    ~JavaScriptVariant();
+
+    JavaScriptVariant& operator=(const JavaScriptVariant&);
+
+    void setType(const DataType&);
+    DataType type() const;
+
+    void setDouble(double);
+    double doubleValue() const;
+
+    void setString(const char*);
+    char* stringValue() const;
+
+    void setBoolean(bool);
+    bool booleanValue() const;
+
+private:
+    DataType m_type;
+
+    union {
+        bool m_booleanValue;
+        double m_doubleValue;
+        char* m_stringValue;
+    };
+};
+
+}
+}
+
+#endif // JavaScriptVariant_h
diff --git a/Source/WebKit/blackberry/Api/JavaScriptVariant_p.h b/Source/WebKit/blackberry/Api/JavaScriptVariant_p.h
new file mode 100644 (file)
index 0000000..024b878
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef JavaScriptVariant_p_h
+#define JavaScriptVariant_p_h
+
+#include "JavaScriptVariant.h"
+
+#include <JSContextRef.h>
+#include <JSValueRef.h>
+
+namespace BlackBerry {
+namespace WebKit {
+
+JavaScriptVariant JSValueRefToBlackBerryJavaScriptVariant(const JSGlobalContextRef&, const JSValueRef&);
+JSValueRef BlackBerryJavaScriptVariantToJSValueRef(const JSGlobalContextRef&, const JavaScriptVariant&);
+
+}
+}
+
+#endif // JavaScriptVariant_p_h
index cdfa81c..3819523 100644 (file)
@@ -78,6 +78,7 @@
 #include "InspectorController.h"
 #include "InspectorOverlay.h"
 #include "JavaScriptDebuggerBlackBerry.h"
+#include "JavaScriptVariant_p.h"
 #include "LayerWebKitThread.h"
 #include "NetworkManager.h"
 #include "NodeRenderStyle.h"
@@ -846,24 +847,25 @@ bool WebPage::executeJavaScriptInIsolatedWorld(const char* script, JavaScriptDat
     return d->executeJavaScriptInIsolatedWorld(sourceCode, returnType, returnValue);
 }
 
-bool WebPage::executeJavaScriptFunction(const std::vector<std::string> &function, const std::vector<std::string> &args, JavaScriptDataType& returnType, WebString& returnValue)
+void WebPage::executeJavaScriptFunction(const std::vector<std::string> &function, const std::vector<JavaScriptVariant> &args, JavaScriptVariant& returnValue)
 {
-    if (!d->m_mainFrame)
-        return false;
+    if (!d->m_mainFrame) {
+        returnValue.setType(JavaScriptVariant::Exception);
+        return;
+    }
+
     JSC::Bindings::RootObject* root = d->m_mainFrame->script()->bindingRootObject();
-    if (!root)
-        return false;
+    if (!root) {
+        returnValue.setType(JavaScriptVariant::Exception);
+        return;
+    }
+
     JSC::ExecState* exec = root->globalObject()->globalExec();
     JSGlobalContextRef ctx = toGlobalRef(exec);
 
-    WTF::Vector<JSStringRef> argList(args.size());
     WTF::Vector<JSValueRef> argListRef(args.size());
-    for (unsigned i = 0; i < args.size(); ++i) {
-        JSStringRef str = JSStringCreateWithUTF8CString(args[i].c_str());
-        argList[i] = str;
-        JSValueRef strRef = JSValueMakeString(ctx, str);
-        argListRef[i] = strRef;
-    }
+    for (unsigned i = 0; i < args.size(); ++i)
+        argListRef[i] = BlackBerryJavaScriptVariantToJSValueRef(ctx, args[i]);
 
     JSValueRef windowObjectValue = windowObject();
     JSObjectRef obj = JSValueToObject(ctx, windowObjectValue, 0);
@@ -882,49 +884,13 @@ bool WebPage::executeJavaScriptFunction(const std::vector<std::string> &function
     if (functionObject && thisObject)
         result = JSObjectCallAsFunction(ctx, functionObject, thisObject, args.size(), argListRef.data(), 0);
 
-    for (unsigned i = 0; i < args.size(); ++i)
-        JSStringRelease(argList[i]);
-
     JSC::JSValue value = toJS(exec, result);
-
     if (!value) {
-        returnType = JSException;
-        return false;
-    }
-
-    JSType type = JSValueGetType(ctx, result);
-
-    switch (type) {
-    case kJSTypeNull:
-        returnType = JSNull;
-        break;
-    case kJSTypeBoolean:
-        returnType = JSBoolean;
-        break;
-    case kJSTypeNumber:
-        returnType = JSNumber;
-        break;
-    case kJSTypeString:
-        returnType = JSString;
-        break;
-    case kJSTypeObject:
-        returnType = JSObject;
-        break;
-    case kJSTypeUndefined:
-    default:
-        returnType = JSUndefined;
-        break;
-    }
-
-    if (returnType == JSBoolean || returnType == JSNumber || returnType == JSString || returnType == JSObject) {
-        JSStringRef stringRef = JSValueToStringCopy(ctx, result, 0);
-        size_t bufferSize = JSStringGetMaximumUTF8CStringSize(stringRef);
-        WTF::Vector<char> buffer(bufferSize);
-        JSStringGetUTF8CString(stringRef, buffer.data(), bufferSize);
-        returnValue = WebString::fromUtf8(buffer.data());
+        returnValue.setType(JavaScriptVariant::Exception);
+        return;
     }
 
-    return true;
+    returnValue = JSValueRefToBlackBerryJavaScriptVariant(ctx, result);
 }
 
 void WebPagePrivate::stopCurrentLoad()
index 2405a75..06aabeb 100644 (file)
@@ -20,6 +20,7 @@
 #define WebPage_h
 
 #include "BlackBerryGlobal.h"
+#include "JavaScriptVariant.h"
 #include "WebString.h"
 
 #include <BlackBerryPlatformGuardedPointer.h>
@@ -106,7 +107,7 @@ public:
     // Takes a UTF16 encoded script that is used explicitly by the pattern matching code
     bool executeJavaScriptInIsolatedWorld(const std::wstring& script, JavaScriptDataType& returnType, WebString& returnValue);
 
-    bool executeJavaScriptFunction(const std::vector<std::string> &script, const std::vector<std::string> &args, JavaScriptDataType& returnType, WebString& returnValue);
+    void executeJavaScriptFunction(const std::vector<std::string> &function, const std::vector<JavaScriptVariant> &args, JavaScriptVariant& returnValue);
 
     void initializeIconDataBase();
 
index b258a0b..ad86555 100644 (file)
@@ -1,3 +1,44 @@
+2012-08-10  Benjamin C Meyer  <bmeyer@rim.com>
+
+        Introduce JavaScriptVariant object.
+        https://bugs.webkit.org/show_bug.cgi?id=93644
+
+        The JavaScriptVariant can be used for functions that return results from
+        JavaScript such as executeJavaScript or functions that take arguments
+        to pass a variable to JavaScript and they want to make sure the type
+        is correct.
+
+        Convert executeJavaScriptFunction() to use this data type as the
+        example, other functions will be converted in the future.
+
+        PR 14929
+
+        Internally reviewed by Joe Mason
+        Reviewed by Adam Treat
+
+        * Api/JavaScriptVariant.cpp: Added.
+        (WebKit):
+        (BlackBerry::WebKit::JSValueRefToBlackBerryJavaScriptVariant):
+        (BlackBerry::WebKit::BlackBerryJavaScriptVariantToJSValueRef):
+        (BlackBerry::WebKit::JavaScriptVariant::JavaScriptVariant):
+        (BlackBerry::WebKit::JavaScriptVariant::~JavaScriptVariant):
+        (BlackBerry::WebKit::JavaScriptVariant::operator=):
+        (BlackBerry::WebKit::JavaScriptVariant::setType):
+        (BlackBerry::WebKit::JavaScriptVariant::type):
+        (BlackBerry::WebKit::JavaScriptVariant::setDouble):
+        (BlackBerry::WebKit::JavaScriptVariant::doubleValue):
+        (BlackBerry::WebKit::JavaScriptVariant::setString):
+        (BlackBerry::WebKit::JavaScriptVariant::stringValue):
+        (BlackBerry::WebKit::JavaScriptVariant::setBoolean):
+        (BlackBerry::WebKit::JavaScriptVariant::booleanValue):
+        * Api/JavaScriptVariant.h: Added.
+        (WebKit):
+        * Api/JavaScriptVariant_p.h: Added.
+        (WebKit):
+        * Api/WebPage.cpp:
+        (BlackBerry::WebKit::WebPage::executeJavaScriptFunction):
+        * Api/WebPage.h:
+
 2012-08-09  Leo Yang  <leoyang@rim.com>
 
         [BlackBerry] Export InRegionScroller to fix build