Add V8 code generation support for MessagePortArray attributes.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 Apr 2012 23:50:37 +0000 (23:50 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 Apr 2012 23:50:37 +0000 (23:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=83943

Patch by Greg Billock <gbillock@google.com> on 2012-04-16
Reviewed by Kentaro Hara.

* bindings/scripts/CodeGeneratorV8.pm:
(GenerateNormalAttrGetter):
* bindings/scripts/IDLAttributes.txt:
* bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp:
(WebDOMTestSerializedScriptValueInterface::ports):
* bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h:
(WebDOMTestSerializedScriptValueInterface):
* bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp:
(webkit_dom_test_serialized_script_value_interface_get_property):
(webkit_dom_test_serialized_script_value_interface_class_init):
(webkit_dom_test_serialized_script_value_interface_get_ports):
* bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h:
* bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp:
(WebCore):
(WebCore::jsTestSerializedScriptValueInterfacePorts):
* bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h:
(WebCore):
* bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h:
* bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm:
(-[DOMTestSerializedScriptValueInterface ports]):
* bindings/scripts/test/TestSerializedScriptValueInterface.idl:
* bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
(WebCore::TestSerializedScriptValueInterfaceInternal::portsAttrGetter):
(TestSerializedScriptValueInterfaceInternal):
(WebCore):

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

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp
Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h
Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h
Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h
Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm
Source/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl
Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp

index 64817ec..05c5f08 100644 (file)
@@ -1,3 +1,36 @@
+2012-04-16  Greg Billock  <gbillock@google.com>
+
+        Add V8 code generation support for MessagePortArray attributes.
+        https://bugs.webkit.org/show_bug.cgi?id=83943
+
+        Reviewed by Kentaro Hara.
+
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateNormalAttrGetter):
+        * bindings/scripts/IDLAttributes.txt:
+        * bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp:
+        (WebDOMTestSerializedScriptValueInterface::ports):
+        * bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h:
+        (WebDOMTestSerializedScriptValueInterface):
+        * bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp:
+        (webkit_dom_test_serialized_script_value_interface_get_property):
+        (webkit_dom_test_serialized_script_value_interface_class_init):
+        (webkit_dom_test_serialized_script_value_interface_get_ports):
+        * bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h:
+        * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp:
+        (WebCore):
+        (WebCore::jsTestSerializedScriptValueInterfacePorts):
+        * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h:
+        (WebCore):
+        * bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h:
+        * bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm:
+        (-[DOMTestSerializedScriptValueInterface ports]):
+        * bindings/scripts/test/TestSerializedScriptValueInterface.idl:
+        * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
+        (WebCore::TestSerializedScriptValueInterfaceInternal::portsAttrGetter):
+        (TestSerializedScriptValueInterfaceInternal):
+        (WebCore):
+
 2012-04-16  Xiaomei Ji  <xji@chromium.org>
 
         platform/graphics/skia/GlyphPageTreeNodeSkia.cpp mis-use 'continue' for 'break'
index 09db806..1005a0d 100644 (file)
@@ -910,6 +910,7 @@ END
     # the newly created wrapper into an internal field of the holder object.
     if (!IsNodeSubType($dataNode) && $attrName ne "self" && (IsWrapperType($returnType) && ($attribute->type =~ /^readonly/ || $attribute->signature->extendedAttributes->{"Replaceable"})
         && $returnType ne "EventTarget" && $returnType ne "SerializedScriptValue" && $returnType ne "DOMWindow" 
+        && $returnType ne "MessagePortArray"
         && $returnType !~ /SVG/ && $returnType !~ /HTML/ && !IsDOMNodeType($returnType))) {
 
         my $arrayType = $codeGenerator->GetArrayType($returnType);
@@ -984,6 +985,20 @@ END
         } else {
             push(@implContentDecls, "    return toV8(WTF::getPtr(${tearOffType}::create($result)));\n");
         }
+    } elsif ($attribute->signature->type eq "MessagePortArray") {
+        AddToImplIncludes("V8Array.h");
+        AddToImplIncludes("MessagePort.h");
+        my $getterFunc = $codeGenerator->WK_lcfirst($attribute->signature->name);
+        push(@implContentDecls, <<END);
+    MessagePortArray* ports = imp->${getterFunc}();
+    if (!ports)
+        return v8::Array::New(0);
+    MessagePortArray portsCopy(*ports);
+    v8::Local<v8::Array> portArray = v8::Array::New(portsCopy.size());
+    for (size_t i = 0; i < portsCopy.size(); ++i)
+        portArray->Set(v8::Integer::New(i), toV8(portsCopy[i].get()));
+    return portArray;
+END
     } else {
         if ($attribute->signature->type eq "SerializedScriptValue" && $attrExt->{"CachedAttribute"}) {
             my $getterFunc = $codeGenerator->WK_lcfirst($attribute->signature->name);
index d94df39..ad68c9a 100644 (file)
 #include "WebDOMTestSerializedScriptValueInterface.h"
 
 #include "Array.h"
+#include "MessagePortArray.h"
 #include "SerializedScriptValue.h"
 #include "TestSerializedScriptValueInterface.h"
 #include "WebDOMArray.h"
+#include "WebDOMMessagePortArray.h"
 #include "WebExceptionHandler.h"
 #include <wtf/GetPtr.h>
 #include <wtf/RefPtr.h>
@@ -117,6 +119,14 @@ void WebDOMTestSerializedScriptValueInterface::setCachedValue(const WebDOMString
     impl()->setCachedValue(WebCore::SerializedScriptValue::create(WTF::String(newCachedValue)));
 }
 
+WebDOMMessagePortArray WebDOMTestSerializedScriptValueInterface::ports() const
+{
+    if (!impl())
+        return WebDOMMessagePortArray();
+
+    return toWebKit(WTF::getPtr(impl()->ports()));
+}
+
 WebDOMString WebDOMTestSerializedScriptValueInterface::cachedReadonlyValue() const
 {
     if (!impl())
index 6594b8a..13e5655 100644 (file)
@@ -33,6 +33,7 @@ class TestSerializedScriptValueInterface;
 };
 
 class WebDOMArray;
+class WebDOMMessagePortArray;
 class WebDOMString;
 
 class WebDOMTestSerializedScriptValueInterface : public WebDOMObject {
@@ -48,6 +49,7 @@ public:
     WebDOMString readonlyValue() const;
     WebDOMString cachedValue() const;
     void setCachedValue(const WebDOMString&);
+    WebDOMMessagePortArray ports() const;
     WebDOMString cachedReadonlyValue() const;
 
     void acceptTransferList(const WebDOMString& data, const WebDOMArray& transferList);
index be6a381..c764254 100644 (file)
 #include "DOMObjectCache.h"
 #include "ExceptionCode.h"
 #include "JSMainThreadExecState.h"
+#include "MessagePortArray.h"
 #include "SerializedScriptValue.h"
 #include "TestSerializedScriptValueInterface.h"
 #include "WebKitDOMBinding.h"
 #include "gobject/ConvertToUTF8String.h"
 #include "webkit/WebKitDOMArray.h"
 #include "webkit/WebKitDOMArrayPrivate.h"
+#include "webkit/WebKitDOMMessagePortArray.h"
+#include "webkit/WebKitDOMMessagePortArrayPrivate.h"
 #include "webkit/WebKitDOMSerializedScriptValue.h"
 #include "webkit/WebKitDOMSerializedScriptValuePrivate.h"
 #include "webkit/WebKitDOMTestSerializedScriptValueInterfacePrivate.h"
@@ -86,6 +89,7 @@ enum {
     PROP_VALUE,
     PROP_READONLY_VALUE,
     PROP_CACHED_VALUE,
+    PROP_PORTS,
     PROP_CACHED_READONLY_VALUE,
 };
 
@@ -139,6 +143,11 @@ static void webkit_dom_test_serialized_script_value_interface_get_property(GObje
         g_value_set_object(value, WebKit::kit(ptr.get()));
         break;
     }
+    case PROP_PORTS: {
+        RefPtr<WebCore::MessagePortArray> ptr = coreSelf->ports();
+        g_value_set_object(value, WebKit::kit(ptr.get()));
+        break;
+    }
     case PROP_CACHED_READONLY_VALUE: {
         RefPtr<WebCore::SerializedScriptValue> ptr = coreSelf->cachedReadonlyValue();
         g_value_set_object(value, WebKit::kit(ptr.get()));
@@ -188,6 +197,13 @@ static void webkit_dom_test_serialized_script_value_interface_class_init(WebKitD
                                                            WEBKIT_TYPE_DOM_SERIALIZED_SCRIPT_VALUE, /* gobject type */
                                                            WEBKIT_PARAM_READWRITE));
     g_object_class_install_property(gobjectClass,
+                                    PROP_PORTS,
+                                    g_param_spec_object("ports", /* name */
+                                                           "test_serialized_script_value_interface_ports", /* short description */
+                                                           "read-only  WebKitDOMMessagePortArray* TestSerializedScriptValueInterface.ports", /* longer - could do with some extra doc stuff here */
+                                                           WEBKIT_TYPE_DOM_MESSAGE_PORT_ARRAY, /* gobject type */
+                                                           WEBKIT_PARAM_READABLE));
+    g_object_class_install_property(gobjectClass,
                                     PROP_CACHED_READONLY_VALUE,
                                     g_param_spec_object("cached-readonly-value", /* name */
                                                            "test_serialized_script_value_interface_cached-readonly-value", /* short description */
@@ -357,6 +373,23 @@ webkit_dom_test_serialized_script_value_interface_set_cached_value(WebKitDOMTest
 #endif /* ENABLE(Condition1) || ENABLE(Condition2) */
 }
 
+WebKitDOMMessagePortArray*
+webkit_dom_test_serialized_script_value_interface_get_ports(WebKitDOMTestSerializedScriptValueInterface* self)
+{
+#if ENABLE(Condition1) || ENABLE(Condition2)
+    g_return_val_if_fail(self, 0);
+    WebCore::JSMainThreadNullState state;
+    WebCore::TestSerializedScriptValueInterface* item = WebKit::core(self);
+    RefPtr<WebCore::MessagePortArray> gobjectResult = WTF::getPtr(item->ports());
+    WebKitDOMMessagePortArray* result = WebKit::kit(gobjectResult.get());
+    return result;
+#else
+    WEBKIT_WARN_FEATURE_NOT_PRESENT("Condition1")
+    WEBKIT_WARN_FEATURE_NOT_PRESENT("Condition2")
+    return 0;
+#endif /* ENABLE(Condition1) || ENABLE(Condition2) */
+}
+
 WebKitDOMSerializedScriptValue*
 webkit_dom_test_serialized_script_value_interface_get_cached_readonly_value(WebKitDOMTestSerializedScriptValueInterface* self)
 {
index 34fc8eb..7232fe3 100644 (file)
@@ -124,6 +124,16 @@ WEBKIT_API void
 webkit_dom_test_serialized_script_value_interface_set_cached_value(WebKitDOMTestSerializedScriptValueInterface* self, WebKitDOMSerializedScriptValue* value);
 
 /**
+ * webkit_dom_test_serialized_script_value_interface_get_ports:
+ * @self: A #WebKitDOMTestSerializedScriptValueInterface
+ *
+ * Returns: (transfer none):
+ *
+**/
+WEBKIT_API WebKitDOMMessagePortArray*
+webkit_dom_test_serialized_script_value_interface_get_ports(WebKitDOMTestSerializedScriptValueInterface* self);
+
+/**
  * webkit_dom_test_serialized_script_value_interface_get_cached_readonly_value:
  * @self: A #WebKitDOMTestSerializedScriptValueInterface
  *
index 1d8de94..a7ab059 100644 (file)
@@ -27,6 +27,8 @@
 #include "ExceptionCode.h"
 #include "JSArray.h"
 #include "JSDOMBinding.h"
+#include "JSMessagePortArray.h"
+#include "MessagePortArray.h"
 #include "SerializedScriptValue.h"
 #include "TestSerializedScriptValueInterface.h"
 #include <runtime/Error.h>
@@ -44,6 +46,7 @@ static const HashTableValue JSTestSerializedScriptValueInterfaceTableValues[] =
     { "value", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceValue), (intptr_t)setJSTestSerializedScriptValueInterfaceValue, NoIntrinsic },
     { "readonlyValue", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceReadonlyValue), (intptr_t)0, NoIntrinsic },
     { "cachedValue", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceCachedValue), (intptr_t)setJSTestSerializedScriptValueInterfaceCachedValue, NoIntrinsic },
+    { "ports", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfacePorts), (intptr_t)0, NoIntrinsic },
     { "cachedReadonlyValue", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceCachedReadonlyValue), (intptr_t)0, NoIntrinsic },
     { "constructor", DontEnum | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceConstructor), (intptr_t)0, NoIntrinsic },
     { 0, 0, 0, 0, NoIntrinsic }
@@ -213,6 +216,16 @@ JSValue jsTestSerializedScriptValueInterfaceCachedValue(ExecState* exec, JSValue
 }
 
 
+JSValue jsTestSerializedScriptValueInterfacePorts(ExecState* exec, JSValue slotBase, const Identifier&)
+{
+    JSTestSerializedScriptValueInterface* castedThis = jsCast<JSTestSerializedScriptValueInterface*>(asObject(slotBase));
+    UNUSED_PARAM(exec);
+    TestSerializedScriptValueInterface* impl = static_cast<TestSerializedScriptValueInterface*>(castedThis->impl());
+    JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(impl->ports()));
+    return result;
+}
+
+
 JSValue jsTestSerializedScriptValueInterfaceCachedReadonlyValue(ExecState* exec, JSValue slotBase, const Identifier&)
 {
     JSTestSerializedScriptValueInterface* castedThis = jsCast<JSTestSerializedScriptValueInterface*>(asObject(slotBase));
index ad44b57..80df1e0 100644 (file)
@@ -154,6 +154,7 @@ void setJSTestSerializedScriptValueInterfaceValue(JSC::ExecState*, JSC::JSObject
 JSC::JSValue jsTestSerializedScriptValueInterfaceReadonlyValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
 JSC::JSValue jsTestSerializedScriptValueInterfaceCachedValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
 void setJSTestSerializedScriptValueInterfaceCachedValue(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
+JSC::JSValue jsTestSerializedScriptValueInterfacePorts(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
 JSC::JSValue jsTestSerializedScriptValueInterfaceCachedReadonlyValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
 JSC::JSValue jsTestSerializedScriptValueInterfaceConstructor(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
 
index ce521d1..01c68d9 100644 (file)
@@ -29,6 +29,7 @@
 #if WEBKIT_VERSION_MAX_ALLOWED >= WEBKIT_VERSION_LATEST
 
 @class DOMArray;
+@class DOMMessagePortArray;
 @class NSString;
 
 @interface DOMTestSerializedScriptValueInterface : DOMObject
@@ -37,6 +38,7 @@
 - (NSString *)readonlyValue;
 - (NSString *)cachedValue;
 - (void)setCachedValue:(NSString *)newCachedValue;
+- (DOMMessagePortArray *)ports;
 - (NSString *)cachedReadonlyValue;
 - (void)acceptTransferList:(NSString *)data transferList:(DOMArray *)transferList;
 - (void)multiTransferList:(NSString *)first tx:(DOMArray *)tx second:(NSString *)second txx:(DOMArray *)txx;
index 168f096..3b9fb73 100644 (file)
 #import "DOMCSSRuleInternal.h"
 #import "DOMCSSValueInternal.h"
 #import "DOMEventInternal.h"
+#import "DOMMessagePortArrayInternal.h"
 #import "DOMNodeInternal.h"
 #import "DOMStyleSheetInternal.h"
 #import "DOMTestSerializedScriptValueInterfaceInternal.h"
 #import "ExceptionHandlers.h"
 #import "JSMainThreadExecState.h"
+#import "MessagePortArray.h"
 #import "SerializedScriptValue.h"
 #import "TestSerializedScriptValueInterface.h"
 #import "ThreadCheck.h"
     IMPL->setCachedValue(WebCore::SerializedScriptValue::create(WTF::String(newCachedValue)));
 }
 
+- (DOMMessagePortArray *)ports
+{
+    WebCore::JSMainThreadNullState state;
+    return kit(WTF::getPtr(IMPL->ports()));
+}
+
 - (NSString *)cachedReadonlyValue
 {
     WebCore::JSMainThreadNullState state;
index c4b886a..facf7cb 100644 (file)
@@ -34,6 +34,7 @@ module test {
         attribute SerializedScriptValue value;
         readonly attribute SerializedScriptValue readonlyValue;
         attribute [CachedAttribute] SerializedScriptValue cachedValue;
+        readonly attribute MessagePortArray ports;
         readonly attribute [CachedAttribute] SerializedScriptValue cachedReadonlyValue;
         void acceptTransferList(in [TransferList=transferList] SerializedScriptValue data, in [Optional] Array transferList);
         void multiTransferList(in [Optional, TransferList=tx] SerializedScriptValue first, in [Optional] Array tx, in [Optional, TransferList=txx] SerializedScriptValue second, in [Optional] Array txx);
index 1806822..bbd939d 100644 (file)
@@ -27,6 +27,7 @@
 #include "MessagePort.h"
 #include "RuntimeEnabledFeatures.h"
 #include "SerializedScriptValue.h"
+#include "V8Array.h"
 #include "V8Binding.h"
 #include "V8BindingMacros.h"
 #include "V8BindingState.h"
@@ -91,6 +92,20 @@ static void cachedValueAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Valu
     return;
 }
 
+static v8::Handle<v8::Value> portsAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
+{
+    INC_STATS("DOM.TestSerializedScriptValueInterface.ports._get");
+    TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder());
+    MessagePortArray* ports = imp->ports();
+    if (!ports)
+        return v8::Array::New(0);
+    MessagePortArray portsCopy(*ports);
+    v8::Local<v8::Array> portArray = v8::Array::New(portsCopy.size());
+    for (size_t i = 0; i < portsCopy.size(); ++i)
+        portArray->Set(v8::Integer::New(i), toV8(portsCopy[i].get()));
+    return portArray;
+}
+
 static v8::Handle<v8::Value> cachedReadonlyValueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
 {
     INC_STATS("DOM.TestSerializedScriptValueInterface.cachedReadonlyValue._get");
@@ -182,6 +197,8 @@ static const BatchedAttribute TestSerializedScriptValueInterfaceAttrs[] = {
     {"readonlyValue", TestSerializedScriptValueInterfaceV8Internal::readonlyValueAttrGetter, 0, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     // Attribute 'cachedValue' (Type: 'attribute' ExtAttr: 'CachedAttribute')
     {"cachedValue", TestSerializedScriptValueInterfaceV8Internal::cachedValueAttrGetter, TestSerializedScriptValueInterfaceV8Internal::cachedValueAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
+    // Attribute 'ports' (Type: 'readonly attribute' ExtAttr: '')
+    {"ports", TestSerializedScriptValueInterfaceV8Internal::portsAttrGetter, 0, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     // Attribute 'cachedReadonlyValue' (Type: 'readonly attribute' ExtAttr: 'CachedAttribute')
     {"cachedReadonlyValue", TestSerializedScriptValueInterfaceV8Internal::cachedReadonlyValueAttrGetter, 0, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
 };