[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.19-706-ge5415e9
oliver at apple.com
oliver at apple.com
Thu Feb 4 21:30:29 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 0a05108b8134bafad0eaa7d9c774cbf62c6d1761
Author: oliver at apple.com <oliver at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Jan 28 04:47:07 2010 +0000
2010-01-27 Oliver Hunt <oliver at apple.com>
Reviewed by Maciej Stachowiak.
MessageEvent.data should deserialize in the context of the MessageEvent's global object
https://bugs.webkit.org/show_bug.cgi?id=34227
Add logic to allow us to create an Object, Array, or Date instance
so we can create them in the context of a specific global object,
rather than just using the current lexical global object.
* JavaScriptCore.exp:
* runtime/DateInstance.cpp:
(JSC::DateInstance::DateInstance):
* runtime/DateInstance.h:
* runtime/JSGlobalObject.h:
(JSC::constructEmptyObject):
(JSC::constructEmptyArray):
2010-01-27 Oliver Hunt <oliver at apple.com>
Reviewed by Maciej Stachowiak.
MessageEvent.data should deserialize in the context of the MessageEvent's global object
https://bugs.webkit.org/show_bug.cgi?id=34227
Test that the object returned from postMessage.data is created in the correct context
* fast/dom/Window/resources/window-postmessage-clone-frames-frame.html: Added.
* fast/dom/Window/window-postmessage-clone-frames-expected.txt: Added.
* fast/dom/Window/window-postmessage-clone-frames.html: Added.
2010-01-27 Oliver Hunt <oliver at apple.com>
Reviewed by Maciej Stachowiak.
MessageEvent.data should deserialize in the context of the MessageEvent's global object
https://bugs.webkit.org/show_bug.cgi?id=34227
Make ScriptValue deserialisation support the provision of a specific global
object to use when creating new objects. This then allows us to make
MessageEvent.data and PopStateEvent.state deserialize in the correct
context.
Test: fast/dom/Window/window-postmessage-clone-frames.html
* bindings/js/JSPopStateEventCustom.cpp:
Remove custom implementation of state getter
* bindings/js/SerializedScriptValue.cpp:
(WebCore::DeserializingTreeWalker::DeserializingTreeWalker):
(WebCore::DeserializingTreeWalker::createOutputArray):
(WebCore::DeserializingTreeWalker::createOutputObject):
(WebCore::DeserializingTreeWalker::convertIfTerminal):
(WebCore::SerializedScriptValueData::deserialize):
(WebCore::SerializedScriptValue::deserialize):
* bindings/js/SerializedScriptValue.h:
(WebCore::SerializedScriptValue::deserialize):
* bindings/scripts/CodeGeneratorJS.pm:
Update bindings generation to pass the correct global object, and to
treat "any" as synonymous with SerializedValue.
* dom/PopStateEvent.idl:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53969 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 71f801f..7d1a148 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,22 @@
+2010-01-27 Oliver Hunt <oliver at apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ MessageEvent.data should deserialize in the context of the MessageEvent's global object
+ https://bugs.webkit.org/show_bug.cgi?id=34227
+
+ Add logic to allow us to create an Object, Array, or Date instance
+ so we can create them in the context of a specific global object,
+ rather than just using the current lexical global object.
+
+ * JavaScriptCore.exp:
+ * runtime/DateInstance.cpp:
+ (JSC::DateInstance::DateInstance):
+ * runtime/DateInstance.h:
+ * runtime/JSGlobalObject.h:
+ (JSC::constructEmptyObject):
+ (JSC::constructEmptyArray):
+
2010-01-27 Alexey Proskuryakov <ap at apple.com>
Reviewed by Darin Adler.
diff --git a/JavaScriptCore/JavaScriptCore.exp b/JavaScriptCore/JavaScriptCore.exp
index 4f8de91..7c93f64 100644
--- a/JavaScriptCore/JavaScriptCore.exp
+++ b/JavaScriptCore/JavaScriptCore.exp
@@ -109,6 +109,7 @@ __ZN3JSC11UStringImpl7s_emptyE
__ZN3JSC11UStringImplD1Ev
__ZN3JSC11checkSyntaxEPNS_9ExecStateERKNS_10SourceCodeE
__ZN3JSC12DateInstance4infoE
+__ZN3JSC12DateInstanceC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEd
__ZN3JSC12DateInstanceC1EPNS_9ExecStateEd
__ZN3JSC12JSGlobalData10ClientDataD2Ev
__ZN3JSC12JSGlobalData11jsArrayVPtrE
diff --git a/JavaScriptCore/runtime/DateInstance.cpp b/JavaScriptCore/runtime/DateInstance.cpp
index 77a92be..b43b183 100644
--- a/JavaScriptCore/runtime/DateInstance.cpp
+++ b/JavaScriptCore/runtime/DateInstance.cpp
@@ -40,6 +40,12 @@ DateInstance::DateInstance(ExecState* exec, NonNullPassRefPtr<Structure> structu
setInternalValue(jsNaN(exec));
}
+DateInstance::DateInstance(ExecState* exec, NonNullPassRefPtr<Structure> structure, double time)
+ : JSWrapperObject(structure)
+{
+ setInternalValue(jsNumber(exec, timeClip(time)));
+}
+
DateInstance::DateInstance(ExecState* exec, double time)
: JSWrapperObject(exec->lexicalGlobalObject()->dateStructure())
{
diff --git a/JavaScriptCore/runtime/DateInstance.h b/JavaScriptCore/runtime/DateInstance.h
index 44b7521..b83d2be 100644
--- a/JavaScriptCore/runtime/DateInstance.h
+++ b/JavaScriptCore/runtime/DateInstance.h
@@ -32,6 +32,7 @@ namespace JSC {
class DateInstance : public JSWrapperObject {
public:
DateInstance(ExecState*, double);
+ DateInstance(ExecState*, NonNullPassRefPtr<Structure>, double);
explicit DateInstance(ExecState*, NonNullPassRefPtr<Structure>);
double internalNumber() const { return internalValue().uncheckedGetNumber(); }
diff --git a/JavaScriptCore/runtime/JSGlobalObject.h b/JavaScriptCore/runtime/JSGlobalObject.h
index 9e4ef49..98d7ef8 100644
--- a/JavaScriptCore/runtime/JSGlobalObject.h
+++ b/JavaScriptCore/runtime/JSGlobalObject.h
@@ -413,11 +413,21 @@ namespace JSC {
{
return new (exec) JSObject(exec->lexicalGlobalObject()->emptyObjectStructure());
}
+
+ inline JSObject* constructEmptyObject(ExecState* exec, JSGlobalObject* globalObject)
+ {
+ return new (exec) JSObject(globalObject->emptyObjectStructure());
+ }
inline JSArray* constructEmptyArray(ExecState* exec)
{
return new (exec) JSArray(exec->lexicalGlobalObject()->arrayStructure());
}
+
+ inline JSArray* constructEmptyArray(ExecState* exec, JSGlobalObject* globalObject)
+ {
+ return new (exec) JSArray(globalObject->arrayStructure());
+ }
inline JSArray* constructEmptyArray(ExecState* exec, unsigned initialLength)
{
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 9417b99..bf387df 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2010-01-27 Oliver Hunt <oliver at apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ MessageEvent.data should deserialize in the context of the MessageEvent's global object
+ https://bugs.webkit.org/show_bug.cgi?id=34227
+
+ Test that the object returned from postMessage.data is created in the correct context
+
+ * fast/dom/Window/resources/window-postmessage-clone-frames-frame.html: Added.
+ * fast/dom/Window/window-postmessage-clone-frames-expected.txt: Added.
+ * fast/dom/Window/window-postmessage-clone-frames.html: Added.
+
2010-01-27 John Abd-El-Malek <jam at chromium.org>
Reviewed by Dimitri Glazkov.
diff --git a/LayoutTests/fast/dom/Window/resources/window-postmessage-clone-frames-frame.html b/LayoutTests/fast/dom/Window/resources/window-postmessage-clone-frames-frame.html
new file mode 100644
index 0000000..8094f59
--- /dev/null
+++ b/LayoutTests/fast/dom/Window/resources/window-postmessage-clone-frames-frame.html
@@ -0,0 +1,7 @@
+<script>
+var tests = [];
+window.onmessage = function (event) {
+ tests.push({event: event, eventData: event.data});
+ event.source.postMessage("blargh", "*");
+}
+</script>
diff --git a/LayoutTests/fast/dom/Window/window-postmessage-clone-frames-expected.txt b/LayoutTests/fast/dom/Window/window-postmessage-clone-frames-expected.txt
new file mode 100644
index 0000000..63db6f2
--- /dev/null
+++ b/LayoutTests/fast/dom/Window/window-postmessage-clone-frames-expected.txt
@@ -0,0 +1,12 @@
+Tests that we clone object hierarchies
+PASS: (frames[0].tests[0]).eventData instanceof (frames[0]).Object is true of type boolean
+PASS: (frames[0].tests[0]).event.data instanceof (frames[0]).Object is true of type boolean
+PASS: (frames[0].tests[1]).eventData instanceof (frames[0]).Array is true of type boolean
+PASS: (frames[0].tests[1]).event.data instanceof (frames[0]).Array is true of type boolean
+PASS: (frames[0].tests[2]).eventData instanceof (frames[0]).Date is true of type boolean
+PASS: (frames[0].tests[2]).event.data instanceof (frames[0]).Date is true of type boolean
+PASS: (frames[0].tests[3]).eventData instanceof (frames[0]).File is true of type boolean
+PASS: (frames[0].tests[3]).event.data instanceof (frames[0]).File is true of type boolean
+PASS: (frames[0].tests[4]).eventData instanceof (frames[0]).FileList is true of type boolean
+PASS: (frames[0].tests[4]).event.data instanceof (frames[0]).FileList is true of type boolean
+
diff --git a/LayoutTests/fast/dom/Window/window-postmessage-clone-frames.html b/LayoutTests/fast/dom/Window/window-postmessage-clone-frames.html
new file mode 100644
index 0000000..bf891d6
--- /dev/null
+++ b/LayoutTests/fast/dom/Window/window-postmessage-clone-frames.html
@@ -0,0 +1,116 @@
+<html>
+<head></head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<input type="file" id="fileInput">
+<iframe src="resources/window-postmessage-clone-frames-frame.html" onload="startTest()"></iframe>
+<script>
+if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+}
+
+var console = document.getElementById("console");
+
+var tests = [];
+
+function equal(actual, expected)
+{
+ if (typeof actual !== typeof expected)
+ return false;
+ if (actual === expected)
+ return true;
+ if ((actual instanceof Date) || (expected instanceof Date)) {
+ if ((actual instanceof Date) && (expected instanceof Date))
+ return (expected instanceof Date) && actual.getTime() == expected.getTime();
+ return false;
+ }
+ if (Array.isArray(actual) || Array.isArray(expected)) {
+ if (!Array.isArray(actual) || !Array.isArray(expected))
+ return false;
+ if (actual.length != expected.length)
+ return false;
+ for (var i = 0; i < actual.length; i++) {
+ if ((i in actual) ^ (i in expected))
+ return false;
+ if (!equal(actual[i], expected[i]))
+ return false;
+ }
+ return true;
+ }
+ if (actual.constructor !== expected.constructor)
+ return false;
+ if ("object" != typeof actual)
+ return false;
+ var keys = Object.keys(actual);
+ if (!equal(keys, Object.keys(expected)))
+ return false;
+ for (var i = 0; i < keys.length; i++) {
+ if (!equal(actual[keys[i]], expected[keys[i]]))
+ return false;
+ }
+ return true;
+}
+
+function safeToString(o) {
+ if (o instanceof Date)
+ return o.toISOString();
+ if (typeof o !== "object" || !o)
+ return o;
+ try {
+ return o.toString();
+ } catch (e) {
+ return Object.prototype.toString.call(o) + "(default toString threw "+e+")";
+ }
+}
+
+function shouldBe(actual, expected)
+{
+ var actualValue = eval(actual);
+ var expectedValue = eval(expected);
+ if (equal(actualValue, expectedValue))
+ console.innerHTML += "PASS: " + actual + " is " + safeToString(expectedValue) + " of type " + typeof actualValue + "<br>";
+ else
+ console.innerHTML += "FAIL: " + actual + " is " + actualValue + " should be " + expectedValue + " of type " + typeof expectedValue + "<br>";
+}
+var i = 0;
+window.onmessage = function(evt) {
+ shouldBe("(frames[0].tests["+i+"]).eventData instanceof (frames[0])."+tests[i].constructor, "true");
+ shouldBe("(frames[0].tests["+i+"]).event.data instanceof (frames[0])."+tests[i].constructor, "true");
+ i++;
+ if (tests.length === i && window.layoutTestController)
+ layoutTestController.notifyDone();
+}
+
+function tryPostMessage(message, constructor) {
+ try {
+ var value = eval(message);
+ frames[0].postMessage(value, "*");
+ tests.push({constructor: constructor});
+ } catch(e) {
+ console.innerHTML += "FAIL: 'postMessage("+message+")' should not throw but threw " + e + "<br>";
+ }
+}
+
+document.getElementById("description").innerHTML = "Tests that we clone object hierarchies";
+
+function startTest() {
+ tryPostMessage('({})', "Object");
+ tryPostMessage('[]', "Array");
+ tryPostMessage('new Date', "Date");
+ var fileInput = document.getElementById("fileInput");
+ var fileRect = fileInput.getClientRects()[0];
+ var targetX = fileRect.left + fileRect.width / 2;
+ var targetY = fileRect.top + fileRect.height / 2;
+ if (window.eventSender) {
+ eventSender.beginDragWithFiles(['get-file-upload.html']);
+ eventSender.mouseMoveTo(targetX, targetY);
+ eventSender.mouseUp();
+ tryPostMessage('fileInput.files[0]', "File");
+ tryPostMessage('fileInput.files', "FileList");
+ }
+}
+</script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 8ba12d1..ab05b8b 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,33 @@
+2010-01-27 Oliver Hunt <oliver at apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ MessageEvent.data should deserialize in the context of the MessageEvent's global object
+ https://bugs.webkit.org/show_bug.cgi?id=34227
+
+ Make ScriptValue deserialisation support the provision of a specific global
+ object to use when creating new objects. This then allows us to make
+ MessageEvent.data and PopStateEvent.state deserialize in the correct
+ context.
+
+ Test: fast/dom/Window/window-postmessage-clone-frames.html
+
+ * bindings/js/JSPopStateEventCustom.cpp:
+ Remove custom implementation of state getter
+ * bindings/js/SerializedScriptValue.cpp:
+ (WebCore::DeserializingTreeWalker::DeserializingTreeWalker):
+ (WebCore::DeserializingTreeWalker::createOutputArray):
+ (WebCore::DeserializingTreeWalker::createOutputObject):
+ (WebCore::DeserializingTreeWalker::convertIfTerminal):
+ (WebCore::SerializedScriptValueData::deserialize):
+ (WebCore::SerializedScriptValue::deserialize):
+ * bindings/js/SerializedScriptValue.h:
+ (WebCore::SerializedScriptValue::deserialize):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ Update bindings generation to pass the correct global object, and to
+ treat "any" as synonymous with SerializedValue.
+ * dom/PopStateEvent.idl:
+
2010-01-27 Nicholas Young <nicholas.young at nokia.com>
Reviewed by Eric Carlson.
diff --git a/WebCore/bindings/js/JSPopStateEventCustom.cpp b/WebCore/bindings/js/JSPopStateEventCustom.cpp
index ee86a09..3f5fd7e 100644
--- a/WebCore/bindings/js/JSPopStateEventCustom.cpp
+++ b/WebCore/bindings/js/JSPopStateEventCustom.cpp
@@ -45,13 +45,4 @@ JSValue JSPopStateEvent::initPopStateEvent(ExecState* exec, const ArgList& args)
return jsUndefined();
}
-JSC::JSValue JSPopStateEvent::state(JSC::ExecState* exec) const
-{
- SerializedScriptValue* object = static_cast<PopStateEvent*>(impl())->state();
- if (!object)
- return JSC::jsNull();
-
- return object->deserialize(exec);
-}
-
} // namespace WebCore
diff --git a/WebCore/bindings/js/SerializedScriptValue.cpp b/WebCore/bindings/js/SerializedScriptValue.cpp
index 3573e35..b97b6cf 100644
--- a/WebCore/bindings/js/SerializedScriptValue.cpp
+++ b/WebCore/bindings/js/SerializedScriptValue.cpp
@@ -613,10 +613,10 @@ struct DeserializingTreeWalker : public BaseWalker {
typedef JSObject* OutputObject;
typedef SerializedObject::PropertyNameList PropertyList;
- DeserializingTreeWalker(ExecState* exec, bool mustCopy)
+ DeserializingTreeWalker(ExecState* exec, JSGlobalObject* globalObject, bool mustCopy)
: BaseWalker(exec)
- , m_globalObject(exec->lexicalGlobalObject())
- , m_isDOMGlobalObject(m_globalObject->inherits(&JSDOMGlobalObject::s_info))
+ , m_globalObject(globalObject)
+ , m_isDOMGlobalObject(globalObject->inherits(&JSDOMGlobalObject::s_info))
, m_mustCopy(mustCopy)
{
}
@@ -645,14 +645,14 @@ struct DeserializingTreeWalker : public BaseWalker {
JSArray* createOutputArray(unsigned length)
{
- JSArray* array = constructEmptyArray(m_exec);
+ JSArray* array = constructEmptyArray(m_exec, m_globalObject);
array->setLength(length);
return array;
}
JSObject* createOutputObject()
{
- return constructEmptyObject(m_exec);
+ return constructEmptyObject(m_exec, m_globalObject);
}
uint32_t length(RefPtr<SerializedArray> array)
@@ -695,11 +695,11 @@ struct DeserializingTreeWalker : public BaseWalker {
case SerializedScriptValueData::NumberType:
return jsNumber(m_exec, value.asDouble());
case SerializedScriptValueData::DateType:
- return new (m_exec) DateInstance(m_exec, value.asDouble());
+ return new (m_exec) DateInstance(m_exec, m_globalObject->dateStructure(), value.asDouble());
case SerializedScriptValueData::FileType:
if (!m_isDOMGlobalObject)
return jsNull();
- return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_exec->lexicalGlobalObject()), File::create(value.asString().crossThreadString()));
+ return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_globalObject), File::create(value.asString().crossThreadString()));
case SerializedScriptValueData::FileListType: {
if (!m_isDOMGlobalObject)
return jsNull();
@@ -708,7 +708,7 @@ struct DeserializingTreeWalker : public BaseWalker {
unsigned length = serializedFileList->length();
for (unsigned i = 0; i < length; i++)
result->append(File::create(serializedFileList->item(i)));
- return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_exec->lexicalGlobalObject()), result.get());
+ return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_globalObject), result.get());
}
case SerializedScriptValueData::EmptyType:
ASSERT_NOT_REACHED();
@@ -753,15 +753,16 @@ struct DeserializingTreeWalker : public BaseWalker {
}
private:
+ void* operator new(size_t);
JSGlobalObject* m_globalObject;
bool m_isDOMGlobalObject;
bool m_mustCopy;
};
-JSValue SerializedScriptValueData::deserialize(ExecState* exec, bool mustCopy) const
+JSValue SerializedScriptValueData::deserialize(ExecState* exec, JSGlobalObject* global, bool mustCopy) const
{
JSLock lock(SilenceAssertionsOnly);
- DeserializingTreeWalker context(exec, mustCopy);
+ DeserializingTreeWalker context(exec, global, mustCopy);
return walk<DeserializingTreeWalker>(context, *this);
}
@@ -936,7 +937,7 @@ PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(JSContextRef ori
JSValueRef SerializedScriptValue::deserialize(JSContextRef destinationContext, JSValueRef* exception)
{
ExecState* exec = toJS(destinationContext);
- JSValue value = deserialize(exec);
+ JSValue value = deserialize(exec, exec->lexicalGlobalObject());
if (exec->hadException()) {
if (exception)
*exception = toRef(exec, exec->exception());
diff --git a/WebCore/bindings/js/SerializedScriptValue.h b/WebCore/bindings/js/SerializedScriptValue.h
index d3159fc..347d8f2 100644
--- a/WebCore/bindings/js/SerializedScriptValue.h
+++ b/WebCore/bindings/js/SerializedScriptValue.h
@@ -65,7 +65,7 @@ namespace WebCore {
SerializedType type() const { return m_type; }
static SerializedScriptValueData serialize(JSC::ExecState*, JSC::JSValue);
- JSC::JSValue deserialize(JSC::ExecState*, bool mustCopy) const;
+ JSC::JSValue deserialize(JSC::ExecState*, JSC::JSGlobalObject*, bool mustCopy) const;
~SerializedScriptValueData()
{
@@ -196,11 +196,11 @@ namespace WebCore {
return m_value.asString();
}
- JSC::JSValue deserialize(JSC::ExecState* exec)
+ JSC::JSValue deserialize(JSC::ExecState* exec, JSC::JSGlobalObject* globalObject)
{
if (!m_value)
return JSC::jsNull();
- return m_value.deserialize(exec, m_mustCopy);
+ return m_value.deserialize(exec, globalObject, m_mustCopy);
}
JSValueRef deserialize(JSContextRef, JSValueRef* exception);
diff --git a/WebCore/bindings/scripts/CodeGeneratorJS.pm b/WebCore/bindings/scripts/CodeGeneratorJS.pm
index 151edf1..b134539 100644
--- a/WebCore/bindings/scripts/CodeGeneratorJS.pm
+++ b/WebCore/bindings/scripts/CodeGeneratorJS.pm
@@ -1846,7 +1846,7 @@ sub JSValueToNative
return "$value.toString(exec)";
}
- if ($type eq "SerializedScriptValue") {
+ if ($type eq "SerializedScriptValue" or $type eq "any") {
$implIncludes{"SerializedScriptValue.h"} = 1;
return "SerializedScriptValue::create(exec, $value)";
}
@@ -1951,9 +1951,9 @@ sub NativeToJSValue
$joinedName = $type;
$joinedName =~ s/Abs|Rel//;
$implIncludes{"$joinedName.h"} = 1;
- } elsif ($type eq "SerializedScriptValue") {
- $implIncludes{"$type.h"} = 1;
- return "$value->deserialize(exec)";
+ } elsif ($type eq "SerializedScriptValue" or $type eq "any") {
+ $implIncludes{"SerializedScriptValue.h"} = 1;
+ return "$value ? $value->deserialize(exec, castedThis->globalObject()) : jsNull()";
} else {
# Default, include header with same name.
$implIncludes{"JS$type.h"} = 1;
diff --git a/WebCore/dom/PopStateEvent.idl b/WebCore/dom/PopStateEvent.idl
index b9ef692..f9c9a71 100644
--- a/WebCore/dom/PopStateEvent.idl
+++ b/WebCore/dom/PopStateEvent.idl
@@ -32,7 +32,7 @@ module events {
in boolean cancelableArg,
in any stateArg);
- readonly attribute [CustomGetter] any state;
+ readonly attribute [V8CustomGetter] any state;
};
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list