<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[207381] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/207381">207381</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2016-10-15 14:52:09 -0700 (Sat, 15 Oct 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>MessageEvent's source property should be a (DOMWindow or MessagePort)? rather than a EventTarget?
https://bugs.webkit.org/show_bug.cgi?id=163475
Reviewed by Simon Fraser.
Source/WebCore:
Start fleshing out union support, starting with MessageEvent.
- Simplify things a bit for now by requiring interface types to use RefPtr<T> as their type when
used in sequences and unions. We should revisit this later, and see if we can use Ref<T> where
possible, but it causes complications for dictionaries, since they want a Ref<T> uninitialized.
* bindings/generic/IDLTypes.h:
Switch IDLInterface to use RefPtr<T> as its implementation type.
* bindings/js/JSDOMConvert.h:
(WebCore::Detail::VariadicConverterBase::convert):
- Remove isJSDOMWrapperType() optimization. It was not correct, due to not being able to detect window
and window shell, and not always an optimization, e.g. in the case of a single interface.
- Switch from JSC::jsDynamicCast<WrapperType*>() to WrapperType::toWrapped() which can be faster and
handles window and window shell correctly.
- Also fix an issue where we would wrongly assert that one interface had to match.
* bindings/js/JSDOMWrapper.h:
(WebCore::isJSDOMWrapperType): Deleted.
Remove unused predicate.
* bindings/scripts/IDLParser.pm:
(parseType):
Add missing support for nullable unions.
* bindings/scripts/test/JS/JSTestObj.cpp:
* bindings/scripts/test/TestObj.idl:
Add new tests for unions (both non-null and nullable) in dictionaries.
* dom/ContainerNode.cpp:
(WebCore::ContainerNode::append):
(WebCore::ContainerNode::prepend):
* dom/ContainerNode.h:
* dom/Node.cpp:
(WebCore::nodeSetPreTransformedFromNodeOrStringVector):
(WebCore::Node::convertNodesOrStringsIntoNode):
(WebCore::Node::before):
(WebCore::Node::after):
(WebCore::Node::replaceWith):
* dom/Node.h:
Add using declaration for NodeOrString and change it to use RefPtr<Node>.
* bindings/js/JSMessageEventCustom.cpp:
(WebCore::handleInitMessageEvent):
* dom/MessageEvent.cpp:
(WebCore::MessageEvent::MessageEvent):
(WebCore::MessageEvent::create):
(WebCore::MessageEvent::initMessageEvent):
(WebCore::MessageEvent::source):
(WebCore::isValidSource): Deleted.
* dom/MessageEvent.h:
* dom/MessageEvent.idl:
* page/DOMWindow.cpp:
(WebCore::PostMessageTimer::event):
Change MessageEvent's source to be a std::experimental::variant<RefPtr<DOMWindow>, RefPtr<MessagePort>>.
For now, we only enforce this on setting, and leave the getter a EventTarget?, but that should not be
observable, and will rectified in subsequent patches.
Source/WTF:
* wtf/Variant.h:
Add missing return statement that was tripping up some compilers.
LayoutTests:
* fast/dom/message-port-deleted-by-accessor.html:
Switch source parameter to null to avoid accidental type error.
* fast/events/constructors/message-event-constructor-expected.txt:
* fast/events/constructors/message-event-constructor.html:
Update test expect a thrown type error, as is now expected, for non-window or MessagePort EventTargets.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastdommessageportdeletedbyaccessorhtml">trunk/LayoutTests/fast/dom/message-port-deleted-by-accessor.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsconstructorsmessageeventconstructorexpectedtxt">trunk/LayoutTests/fast/events/constructors/message-event-constructor-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsconstructorsmessageeventconstructorhtml">trunk/LayoutTests/fast/events/constructors/message-event-constructor.html</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfVarianth">trunk/Source/WTF/wtf/Variant.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsgenericIDLTypesh">trunk/Source/WebCore/bindings/generic/IDLTypes.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMConverth">trunk/Source/WebCore/bindings/js/JSDOMConvert.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMWrapperh">trunk/Source/WebCore/bindings/js/JSDOMWrapper.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMessageEventCustomcpp">trunk/Source/WebCore/bindings/js/JSMessageEventCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsIDLParserpm">trunk/Source/WebCore/bindings/scripts/IDLParser.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestTestObjidl">trunk/Source/WebCore/bindings/scripts/test/TestObj.idl</a></li>
<li><a href="#trunkSourceWebCoredomContainerNodecpp">trunk/Source/WebCore/dom/ContainerNode.cpp</a></li>
<li><a href="#trunkSourceWebCoredomContainerNodeh">trunk/Source/WebCore/dom/ContainerNode.h</a></li>
<li><a href="#trunkSourceWebCoredomMessageEventcpp">trunk/Source/WebCore/dom/MessageEvent.cpp</a></li>
<li><a href="#trunkSourceWebCoredomMessageEventh">trunk/Source/WebCore/dom/MessageEvent.h</a></li>
<li><a href="#trunkSourceWebCoredomMessageEventidl">trunk/Source/WebCore/dom/MessageEvent.idl</a></li>
<li><a href="#trunkSourceWebCoredomNodecpp">trunk/Source/WebCore/dom/Node.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodeh">trunk/Source/WebCore/dom/Node.h</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/LayoutTests/ChangeLog        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-10-15 Sam Weinig <sam@webkit.org>
+
+ MessageEvent's source property should be a (DOMWindow or MessagePort)? rather than a EventTarget?
+ https://bugs.webkit.org/show_bug.cgi?id=163475
+
+ Reviewed by Simon Fraser.
+
+ * fast/dom/message-port-deleted-by-accessor.html:
+ Switch source parameter to null to avoid accidental type error.
+
+ * fast/events/constructors/message-event-constructor-expected.txt:
+ * fast/events/constructors/message-event-constructor.html:
+ Update test expect a thrown type error, as is now expected, for non-window or MessagePort EventTargets.
+
</ins><span class="cx"> 2016-10-15 Antoine Quint <graouts@apple.com>
</span><span class="cx">
</span><span class="cx"> [Modern Media Controls] macOS inline controls
</span></span></pre></div>
<a id="trunkLayoutTestsfastdommessageportdeletedbyaccessorhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/message-port-deleted-by-accessor.html (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/message-port-deleted-by-accessor.html        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/LayoutTests/fast/dom/message-port-deleted-by-accessor.html        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -9,10 +9,10 @@
</span><span class="cx"> channel = new MessageChannel;
</span><span class="cx"> event = document.createEvent("MessageEvent");
</span><span class="cx">
</span><del>- event.initMessageEvent(0, 0, 0, 0, 0, 0, 0, [channel.port1, channel.port2]);
</del><ins>+ event.initMessageEvent(0, 0, 0, 0, 0, 0, null, [channel.port1, channel.port2]);
</ins><span class="cx">
</span><span class="cx"> Array.prototype.__defineSetter__(0, function() {
</span><del>- event.initMessageEvent(0, 0, 0, 0, 0, 0, 0, [ ]);
</del><ins>+ event.initMessageEvent(0, 0, 0, 0, 0, 0, null, [ ]);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> event.ports;
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsconstructorsmessageeventconstructorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/events/constructors/message-event-constructor-expected.txt (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/constructors/message-event-constructor-expected.txt        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/LayoutTests/fast/events/constructors/message-event-constructor-expected.txt        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -62,8 +62,8 @@
</span><span class="cx"> PASS new MessageEvent('eventType', { source: this }).source is this
</span><span class="cx"> PASS new MessageEvent('eventType', { ports: [channel.port1], source: channel.port1 }).source is channel.port1
</span><span class="cx"> PASS new MessageEvent('eventType', { source: test_object }).source threw exception TypeError: Type error.
</span><del>-PASS new MessageEvent('eventType', { source: document }).source is null
-PASS new MessageEvent('eventType', { source: document.body }).source is null
</del><ins>+PASS new MessageEvent('eventType', { source: document }).source threw exception TypeError: Type error.
+PASS new MessageEvent('eventType', { source: document.body }).source threw exception TypeError: Type error.
</ins><span class="cx"> PASS new MessageEvent('eventType', { source: undefined }).source is null
</span><span class="cx"> PASS new MessageEvent('eventType', { source: null }).source is null
</span><span class="cx"> PASS new MessageEvent('eventType', { source: false }).source threw exception TypeError: Type error.
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsconstructorsmessageeventconstructorhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/events/constructors/message-event-constructor.html (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/constructors/message-event-constructor.html        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/LayoutTests/fast/events/constructors/message-event-constructor.html        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -77,8 +77,8 @@
</span><span class="cx">
</span><span class="cx"> // Unacceptable source objects (not a Window or a MessagePort).
</span><span class="cx"> shouldThrowErrorName("new MessageEvent('eventType', { source: test_object }).source", "TypeError");
</span><del>-shouldBe("new MessageEvent('eventType', { source: document }).source", "null");
-shouldBe("new MessageEvent('eventType', { source: document.body }).source", "null");
</del><ins>+shouldThrowErrorName("new MessageEvent('eventType', { source: document }).source", "TypeError");
+shouldThrowErrorName("new MessageEvent('eventType', { source: document.body }).source", "TypeError");
</ins><span class="cx"> shouldBe("new MessageEvent('eventType', { source: undefined }).source", "null");
</span><span class="cx"> shouldBe("new MessageEvent('eventType', { source: null }).source", "null");
</span><span class="cx"> shouldThrowErrorName("new MessageEvent('eventType', { source: false }).source", "TypeError");
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WTF/ChangeLog        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-10-15 Sam Weinig <sam@webkit.org>
+
+ MessageEvent's source property should be a (DOMWindow or MessagePort)? rather than a EventTarget?
+ https://bugs.webkit.org/show_bug.cgi?id=163475
+
+ Reviewed by Simon Fraser.
+
+ * wtf/Variant.h:
+ Add missing return statement that was tripping up some compilers.
+
</ins><span class="cx"> 2016-10-12 Ryan Haddad <ryanhaddad@apple.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed, rolling out r207225.
</span></span></pre></div>
<a id="trunkSourceWTFwtfVarianth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Variant.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Variant.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WTF/wtf/Variant.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -1944,7 +1944,7 @@
</span><span class="cx"> template<typename _Visitor,typename ... _Variants>
</span><span class="cx"> static constexpr typename __multi_visitor_return_type<_Visitor,_Variants...>::__type
</span><span class="cx"> __visit(_Visitor&,_Variants&& ...){
</span><del>- __throw_bad_variant_access<typename __multi_visitor_return_type<_Visitor,_Variants...>::__type>("Visiting of empty variant");
</del><ins>+ return __throw_bad_variant_access<typename __multi_visitor_return_type<_Visitor,_Variants...>::__type>("Visiting of empty variant");
</ins><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/ChangeLog        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -1,3 +1,67 @@
</span><ins>+2016-10-14 Sam Weinig <sam@webkit.org>
+
+ MessageEvent's source property should be a (DOMWindow or MessagePort)? rather than a EventTarget?
+ https://bugs.webkit.org/show_bug.cgi?id=163475
+
+ Reviewed by Simon Fraser.
+
+ Start fleshing out union support, starting with MessageEvent.
+ - Simplify things a bit for now by requiring interface types to use RefPtr<T> as their type when
+ used in sequences and unions. We should revisit this later, and see if we can use Ref<T> where
+ possible, but it causes complications for dictionaries, since they want a Ref<T> uninitialized.
+
+ * bindings/generic/IDLTypes.h:
+ Switch IDLInterface to use RefPtr<T> as its implementation type.
+
+ * bindings/js/JSDOMConvert.h:
+ (WebCore::Detail::VariadicConverterBase::convert):
+ - Remove isJSDOMWrapperType() optimization. It was not correct, due to not being able to detect window
+ and window shell, and not always an optimization, e.g. in the case of a single interface.
+ - Switch from JSC::jsDynamicCast<WrapperType*>() to WrapperType::toWrapped() which can be faster and
+ handles window and window shell correctly.
+ - Also fix an issue where we would wrongly assert that one interface had to match.
+
+ * bindings/js/JSDOMWrapper.h:
+ (WebCore::isJSDOMWrapperType): Deleted.
+ Remove unused predicate.
+
+ * bindings/scripts/IDLParser.pm:
+ (parseType):
+ Add missing support for nullable unions.
+
+ * bindings/scripts/test/JS/JSTestObj.cpp:
+ * bindings/scripts/test/TestObj.idl:
+ Add new tests for unions (both non-null and nullable) in dictionaries.
+
+ * dom/ContainerNode.cpp:
+ (WebCore::ContainerNode::append):
+ (WebCore::ContainerNode::prepend):
+ * dom/ContainerNode.h:
+ * dom/Node.cpp:
+ (WebCore::nodeSetPreTransformedFromNodeOrStringVector):
+ (WebCore::Node::convertNodesOrStringsIntoNode):
+ (WebCore::Node::before):
+ (WebCore::Node::after):
+ (WebCore::Node::replaceWith):
+ * dom/Node.h:
+ Add using declaration for NodeOrString and change it to use RefPtr<Node>.
+
+ * bindings/js/JSMessageEventCustom.cpp:
+ (WebCore::handleInitMessageEvent):
+ * dom/MessageEvent.cpp:
+ (WebCore::MessageEvent::MessageEvent):
+ (WebCore::MessageEvent::create):
+ (WebCore::MessageEvent::initMessageEvent):
+ (WebCore::MessageEvent::source):
+ (WebCore::isValidSource): Deleted.
+ * dom/MessageEvent.h:
+ * dom/MessageEvent.idl:
+ * page/DOMWindow.cpp:
+ (WebCore::PostMessageTimer::event):
+ Change MessageEvent's source to be a std::experimental::variant<RefPtr<DOMWindow>, RefPtr<MessagePort>>.
+ For now, we only enforce this on setting, and leave the getter a EventTarget?, but that should not be
+ observable, and will rectified in subsequent patches.
+
</ins><span class="cx"> 2016-10-15 Chris Dumez <cdumez@apple.com>
</span><span class="cx">
</span><span class="cx"> Add support for reportValidity() on form and form control elements
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsgenericIDLTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/generic/IDLTypes.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -84,9 +84,9 @@
</span><span class="cx">
</span><span class="cx"> struct IDLObject : IDLUnsupportedType { };
</span><span class="cx">
</span><del>-template<typename T> struct IDLInterface : IDLType<std::reference_wrapper<T>> {
</del><ins>+template<typename T> struct IDLInterface : IDLType<RefPtr<T>> {
</ins><span class="cx"> using RawType = T;
</span><del>- using NullableType = T*;
</del><ins>+ using NullableType = RefPtr<T>;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename T> struct IDLDictionary : IDLType<T> { };
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMConverth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMConvert.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -515,25 +515,23 @@
</span><span class="cx"> // 2. If types includes object, then return the IDL value that is a reference to the object V.
</span><span class="cx"> // (FIXME: Add support for object and step 4.2)
</span><span class="cx"> if (brigand::any<TypeList, IsIDLInterface<brigand::_1>>::value) {
</span><del>- if (isJSDOMWrapperType(value)) {
- Optional<ReturnType> returnValue;
- brigand::for_each<InterfaceTypeList>([&](auto&& type) {
- if (returnValue)
- return;
-
- using ImplementationType = typename WTF::RemoveCVAndReference<decltype(type)>::type::type::RawType;
- using WrapperType = typename JSDOMWrapperConverterTraits<ImplementationType>::WrapperClass;
</del><ins>+ Optional<ReturnType> returnValue;
+ brigand::for_each<InterfaceTypeList>([&](auto&& type) {
+ if (returnValue)
+ return;
+
+ using ImplementationType = typename WTF::RemoveCVAndReference<decltype(type)>::type::type::RawType;
+ using WrapperType = typename JSDOMWrapperConverterTraits<ImplementationType>::WrapperClass;
</ins><span class="cx">
</span><del>- auto* castedValue = JSC::jsDynamicCast<WrapperType*>(value);
- if (!castedValue)
- return;
-
- returnValue = ReturnType(castedValue->wrapped());
- });
- ASSERT(returnValue);
</del><ins>+ auto* castedValue = WrapperType::toWrapped(value);
+ if (!castedValue)
+ return;
+
+ returnValue = ReturnType(castedValue);
+ });
</ins><span class="cx">
</span><ins>+ if (returnValue)
</ins><span class="cx"> return WTFMove(returnValue.value());
</span><del>- }
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // FIXME: Add support for steps 5 - 12.
</span><span class="lines">@@ -592,13 +590,13 @@
</span><span class="cx"> auto result = Converter<IDLType>::convert(state, value);
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, Nullopt);
</span><span class="cx">
</span><del>- return result;
</del><ins>+ return WTFMove(result);
</ins><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename T>
</span><span class="cx"> struct VariadicConverterBase<IDLInterface<T>> {
</span><del>- using Item = typename IDLInterface<T>::ImplementationType;
</del><ins>+ using Item = std::reference_wrapper<T>;
</ins><span class="cx">
</span><span class="cx"> static Optional<Item> convert(JSC::ExecState& state, JSC::JSValue value)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMWrapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMWrapper.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMWrapper.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/js/JSDOMWrapper.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -86,13 +86,6 @@
</span><span class="cx"> Ref<ImplementationClass> m_wrapped;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-ALWAYS_INLINE bool isJSDOMWrapperType(JSC::JSValue value)
-{
- if (UNLIKELY(!value.isCell()))
- return false;
- return value.asCell()->type() >= JSDOMWrapperType;
-}
-
</del><span class="cx"> template<typename ImplementationClass> struct JSDOMWrapperConverterTraits;
</span><span class="cx">
</span><span class="cx"> template<typename JSClass, typename Enable = void>
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMessageEventCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMessageEventCustom.cpp (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMessageEventCustom.cpp        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/js/JSMessageEventCustom.cpp        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include "JSDOMBinding.h"
</span><span class="cx"> #include "JSDOMWindow.h"
</span><span class="cx"> #include "JSEventTarget.h"
</span><ins>+#include "JSMessagePort.h"
</ins><span class="cx"> #include "JSMessagePortCustom.h"
</span><span class="cx"> #include "MessageEvent.h"
</span><span class="cx"> #include <runtime/JSArray.h>
</span><span class="lines">@@ -112,7 +113,7 @@
</span><span class="cx"> bool cancelableArg = state.argument(2).toBoolean(&state);
</span><span class="cx"> const String originArg = valueToUSVString(&state, state.argument(4));
</span><span class="cx"> const String lastEventIdArg = state.argument(5).toString(&state)->value(&state);
</span><del>- DOMWindow* sourceArg = JSDOMWindow::toWrapped(state.argument(6));
</del><ins>+ auto sourceArg = convert<IDLNullable<IDLUnion<IDLInterface<DOMWindow>, IDLInterface<MessagePort>>>>(state, state.argument(6));
</ins><span class="cx"> std::unique_ptr<MessagePortArray> messagePorts;
</span><span class="cx"> std::unique_ptr<ArrayBufferArray> arrayBuffers;
</span><span class="cx"> if (!state.argument(7).isUndefinedOrNull()) {
</span><span class="lines">@@ -125,7 +126,7 @@
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, JSValue());
</span><span class="cx">
</span><span class="cx"> MessageEvent& event = jsEvent->wrapped();
</span><del>- event.initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, WTFMove(messagePorts));
</del><ins>+ event.initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, WTFMove(sourceArg), WTFMove(messagePorts));
</ins><span class="cx"> jsEvent->m_data.set(vm, jsEvent, dataArg.jsValue());
</span><span class="cx"> return jsUndefined();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsIDLParserpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/IDLParser.pm (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/IDLParser.pm        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/scripts/IDLParser.pm        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -1951,7 +1951,9 @@
</span><span class="cx"> my $self = shift;
</span><span class="cx"> my $next = $self->nextToken();
</span><span class="cx"> if ($next->value() eq "(") {
</span><del>- return $self->parseUnionType();
</del><ins>+ my $unionType = $self->parseUnionType();
+ $unionType->isNullable($self->parseNull());
+ return $unionType;
</ins><span class="cx"> }
</span><span class="cx"> if ($next->type() == IdentifierToken || $next->value() =~ /$nextType_1/) {
</span><span class="cx"> return $self->parseSingleType();
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -566,6 +566,12 @@
</span><span class="cx"> RETURN_IF_EXCEPTION(throwScope, Nullopt);
</span><span class="cx"> } else
</span><span class="cx"> result.nullableStringWithDefault = String();
</span><ins>+ JSValue nullableUnionMemberValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "nullableUnionMember"));
+ if (!nullableUnionMemberValue.isUndefined()) {
+ result.nullableUnionMember = convert<IDLNullable<IDLUnion<IDLLong, IDLInterface<Node>>>>(state, nullableUnionMemberValue);
+ RETURN_IF_EXCEPTION(throwScope, Nullopt);
+ } else
+ result.nullableUnionMember = Nullopt;
</ins><span class="cx"> JSValue restrictedDoubleValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "restrictedDouble"));
</span><span class="cx"> if (!restrictedDoubleValue.isUndefined()) {
</span><span class="cx"> result.restrictedDouble = convert<IDLDouble>(state, restrictedDoubleValue);
</span><span class="lines">@@ -625,6 +631,11 @@
</span><span class="cx"> result.stringWithoutDefault = convert<IDLDOMString>(state, stringWithoutDefaultValue);
</span><span class="cx"> RETURN_IF_EXCEPTION(throwScope, Nullopt);
</span><span class="cx"> }
</span><ins>+ JSValue unionMemberValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "unionMember"));
+ if (!unionMemberValue.isUndefined()) {
+ result.unionMember = convert<IDLUnion<IDLLong, IDLInterface<Node>>>(state, unionMemberValue);
+ RETURN_IF_EXCEPTION(throwScope, Nullopt);
+ }
</ins><span class="cx"> JSValue unrestrictedDoubleValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "unrestrictedDouble"));
</span><span class="cx"> if (!unrestrictedDoubleValue.isUndefined()) {
</span><span class="cx"> result.unrestrictedDouble = convert<IDLUnrestrictedDouble>(state, unrestrictedDoubleValue);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestTestObjidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/TestObj.idl (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/TestObj.idl        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/bindings/scripts/test/TestObj.idl        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -458,6 +458,8 @@
</span><span class="cx"> any anyValueWithNullDefault = null;
</span><span class="cx"> AnyTypedef anyTypedefValue;
</span><span class="cx"> TestDictionaryThatShouldTolerateNull dictionaryMember;
</span><ins>+ (long or Node) unionMember;
+ (long or Node)? nullableUnionMember = null;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> dictionary TestDictionaryThatShouldNotTolerateNull {
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.cpp        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -877,7 +877,7 @@
</span><span class="cx"> return std::distance(children.begin(), children.end());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ContainerNode::append(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void ContainerNode::append(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<Node> node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</span><span class="cx"> if (ec || !node)
</span><span class="lines">@@ -886,7 +886,7 @@
</span><span class="cx"> appendChild(*node, ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ContainerNode::prepend(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void ContainerNode::prepend(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<Node> node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</span><span class="cx"> if (ec || !node)
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/ContainerNode.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -100,8 +100,8 @@
</span><span class="cx"> WEBCORE_EXPORT Element* firstElementChild() const;
</span><span class="cx"> WEBCORE_EXPORT Element* lastElementChild() const;
</span><span class="cx"> WEBCORE_EXPORT unsigned childElementCount() const;
</span><del>- void append(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&&, ExceptionCode&);
- void prepend(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&&, ExceptionCode&);
</del><ins>+ void append(Vector<NodeOrString>&&, ExceptionCode&);
+ void prepend(Vector<NodeOrString>&&, ExceptionCode&);
</ins><span class="cx">
</span><span class="cx"> bool ensurePreInsertionValidity(Node& newChild, Node* refChild, ExceptionCode&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoredomMessageEventcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessageEvent.cpp (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessageEvent.cpp        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/MessageEvent.cpp        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> #include "MessageEvent.h"
</span><span class="cx">
</span><span class="cx"> #include "Blob.h"
</span><del>-#include "DOMWindow.h"
</del><span class="cx"> #include "EventNames.h"
</span><span class="cx"> #include <runtime/JSCInlines.h>
</span><span class="cx">
</span><span class="lines">@@ -37,37 +36,31 @@
</span><span class="cx">
</span><span class="cx"> using namespace JSC;
</span><span class="cx">
</span><del>-static inline bool isValidSource(EventTarget* source)
-{
- return !source || source->toDOMWindow() || source->isMessagePort();
-}
-
</del><span class="cx"> inline MessageEvent::MessageEvent()
</span><span class="cx"> : m_dataType(DataTypeScriptValue)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline MessageEvent::MessageEvent(ExecState& state, const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
</del><ins>+inline MessageEvent::MessageEvent(ExecState& state, const AtomicString& type, Init& initializer, IsTrusted isTrusted)
</ins><span class="cx"> : Event(type, initializer, isTrusted)
</span><span class="cx"> , m_dataType(DataTypeScriptValue)
</span><span class="cx"> , m_dataAsScriptValue(state.vm(), initializer.data)
</span><span class="cx"> , m_origin(initializer.origin)
</span><span class="cx"> , m_lastEventId(initializer.lastEventId)
</span><del>- , m_source(isValidSource(initializer.source.get()) ? initializer.source : nullptr)
</del><ins>+ , m_source(WTFMove(initializer.source))
</ins><span class="cx"> , m_ports(std::make_unique<MessagePortArray>(initializer.ports))
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline MessageEvent::MessageEvent(RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId, EventTarget* source, std::unique_ptr<MessagePortArray> ports)
</del><ins>+inline MessageEvent::MessageEvent(RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source, std::unique_ptr<MessagePortArray> ports)
</ins><span class="cx"> : Event(eventNames().messageEvent, false, false)
</span><span class="cx"> , m_dataType(DataTypeSerializedScriptValue)
</span><span class="cx"> , m_dataAsSerializedScriptValue(WTFMove(data))
</span><span class="cx"> , m_origin(origin)
</span><span class="cx"> , m_lastEventId(lastEventId)
</span><del>- , m_source(source)
</del><ins>+ , m_source(WTFMove(source))
</ins><span class="cx"> , m_ports(WTFMove(ports))
</span><span class="cx"> {
</span><del>- ASSERT(isValidSource(source));
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> inline MessageEvent::MessageEvent(const AtomicString& type, RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId)
</span><span class="lines">@@ -103,9 +96,9 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Ref<MessageEvent> MessageEvent::create(std::unique_ptr<MessagePortArray> ports, RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId, EventTarget* source)
</del><ins>+Ref<MessageEvent> MessageEvent::create(std::unique_ptr<MessagePortArray> ports, RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source)
</ins><span class="cx"> {
</span><del>- return adoptRef(*new MessageEvent(WTFMove(data), origin, lastEventId, source, WTFMove(ports)));
</del><ins>+ return adoptRef(*new MessageEvent(WTFMove(data), origin, lastEventId, WTFMove(source), WTFMove(ports)));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Ref<MessageEvent> MessageEvent::create(const AtomicString& type, RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId)
</span><span class="lines">@@ -133,7 +126,7 @@
</span><span class="cx"> return adoptRef(*new MessageEvent);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Ref<MessageEvent> MessageEvent::create(ExecState& state, const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
</del><ins>+Ref<MessageEvent> MessageEvent::create(ExecState& state, const AtomicString& type, Init& initializer, IsTrusted isTrusted)
</ins><span class="cx"> {
</span><span class="cx"> return adoptRef(*new MessageEvent(state, type, initializer, isTrusted));
</span><span class="cx"> }
</span><span class="lines">@@ -142,7 +135,7 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const Deprecated::ScriptValue& data, const String& origin, const String& lastEventId, DOMWindow* source, std::unique_ptr<MessagePortArray> ports)
</del><ins>+void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const Deprecated::ScriptValue& data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source, std::unique_ptr<MessagePortArray> ports)
</ins><span class="cx"> {
</span><span class="cx"> if (dispatched())
</span><span class="cx"> return;
</span><span class="lines">@@ -155,11 +148,11 @@
</span><span class="cx"> m_triedToSerialize = false;
</span><span class="cx"> m_origin = origin;
</span><span class="cx"> m_lastEventId = lastEventId;
</span><del>- m_source = source;
</del><ins>+ m_source = WTFMove(source);
</ins><span class="cx"> m_ports = WTFMove(ports);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, std::unique_ptr<MessagePortArray> ports)
</del><ins>+void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source, std::unique_ptr<MessagePortArray> ports)
</ins><span class="cx"> {
</span><span class="cx"> if (dispatched())
</span><span class="cx"> return;
</span><span class="lines">@@ -170,10 +163,23 @@
</span><span class="cx"> m_dataAsSerializedScriptValue = data;
</span><span class="cx"> m_origin = origin;
</span><span class="cx"> m_lastEventId = lastEventId;
</span><del>- m_source = source;
</del><ins>+ m_source = WTFMove(source);
</ins><span class="cx"> m_ports = WTFMove(ports);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+EventTarget* MessageEvent::source() const
+{
+ if (!m_source)
+ return nullptr;
+
+ auto visitor = WTF::makeVisitor(
+ [](const RefPtr<DOMWindow>& window) -> EventTarget* { return const_cast<EventTarget*>(static_cast<const EventTarget*>(window.get())); },
+ [](const RefPtr<MessagePort>& messagePort) -> EventTarget* { return const_cast<EventTarget*>(static_cast<const EventTarget*>(messagePort.get())); }
+ );
+
+ return std::experimental::visit(visitor, m_source.value());
+}
+
</ins><span class="cx"> RefPtr<SerializedScriptValue> MessageEvent::trySerializeData(ExecState* exec)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(!m_dataAsScriptValue.hasNoValue());
</span></span></pre></div>
<a id="trunkSourceWebCoredomMessageEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessageEvent.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessageEvent.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/MessageEvent.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -27,18 +27,22 @@
</span><span class="cx">
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><ins>+#include "DOMWindow.h"
</ins><span class="cx"> #include "Event.h"
</span><span class="cx"> #include "MessagePort.h"
</span><span class="cx"> #include "SerializedScriptValue.h"
</span><span class="cx"> #include <bindings/ScriptValue.h>
</span><ins>+#include <wtf/Variant.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class Blob;
</span><span class="cx">
</span><ins>+using MessageEventSource = std::experimental::variant<RefPtr<DOMWindow>, RefPtr<MessagePort>>;
+
</ins><span class="cx"> class MessageEvent final : public Event {
</span><span class="cx"> public:
</span><del>- static Ref<MessageEvent> create(std::unique_ptr<MessagePortArray>, RefPtr<SerializedScriptValue>&&, const String& origin = { }, const String& lastEventId = { }, EventTarget* source = nullptr);
</del><ins>+ static Ref<MessageEvent> create(std::unique_ptr<MessagePortArray>, RefPtr<SerializedScriptValue>&&, const String& origin = { }, const String& lastEventId = { }, Optional<MessageEventSource>&& source = Nullopt);
</ins><span class="cx"> static Ref<MessageEvent> create(const AtomicString& type, RefPtr<SerializedScriptValue>&&, const String& origin, const String& lastEventId);
</span><span class="cx"> static Ref<MessageEvent> create(const String& data, const String& origin = { });
</span><span class="cx"> static Ref<MessageEvent> create(Ref<Blob>&& data, const String& origin);
</span><span class="lines">@@ -49,19 +53,19 @@
</span><span class="cx"> JSC::JSValue data;
</span><span class="cx"> String origin;
</span><span class="cx"> String lastEventId;
</span><del>- RefPtr<EventTarget> source;
</del><ins>+ Optional<MessageEventSource> source;
</ins><span class="cx"> MessagePortArray ports;
</span><span class="cx"> };
</span><del>- static Ref<MessageEvent> create(JSC::ExecState&, const AtomicString& type, const Init&, IsTrusted = IsTrusted::No);
</del><ins>+ static Ref<MessageEvent> create(JSC::ExecState&, const AtomicString& type, Init&, IsTrusted = IsTrusted::No);
</ins><span class="cx">
</span><span class="cx"> virtual ~MessageEvent();
</span><span class="cx">
</span><del>- void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const Deprecated::ScriptValue& data, const String& origin, const String& lastEventId, DOMWindow* source, std::unique_ptr<MessagePortArray>);
- void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, std::unique_ptr<MessagePortArray>);
</del><ins>+ void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const Deprecated::ScriptValue& data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source, std::unique_ptr<MessagePortArray>);
+ void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source, std::unique_ptr<MessagePortArray>);
</ins><span class="cx">
</span><span class="cx"> const String& origin() const { return m_origin; }
</span><span class="cx"> const String& lastEventId() const { return m_lastEventId; }
</span><del>- EventTarget* source() const { return m_source.get(); }
</del><ins>+ EventTarget* source() const;
</ins><span class="cx"> MessagePortArray ports() const { return m_ports ? *m_ports : MessagePortArray(); }
</span><span class="cx">
</span><span class="cx"> // FIXME: Remove this when we have custom ObjC binding support.
</span><span class="lines">@@ -87,8 +91,8 @@
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> MessageEvent();
</span><del>- MessageEvent(JSC::ExecState&, const AtomicString&, const Init&, IsTrusted);
- MessageEvent(RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId, EventTarget* source, std::unique_ptr<MessagePortArray>);
</del><ins>+ MessageEvent(JSC::ExecState&, const AtomicString&, Init&, IsTrusted);
+ MessageEvent(RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId, Optional<MessageEventSource>&& source, std::unique_ptr<MessagePortArray>);
</ins><span class="cx"> MessageEvent(const AtomicString& type, RefPtr<SerializedScriptValue>&& data, const String& origin, const String& lastEventId);
</span><span class="cx"> MessageEvent(const String& data, const String& origin);
</span><span class="cx"> MessageEvent(Ref<Blob>&& data, const String& origin);
</span><span class="lines">@@ -103,7 +107,7 @@
</span><span class="cx"> RefPtr<ArrayBuffer> m_dataAsArrayBuffer;
</span><span class="cx"> String m_origin;
</span><span class="cx"> String m_lastEventId;
</span><del>- RefPtr<EventTarget> m_source;
</del><ins>+ Optional<MessageEventSource> m_source;
</ins><span class="cx"> std::unique_ptr<MessagePortArray> m_ports;
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoredomMessageEventidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessageEvent.idl (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessageEvent.idl        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/MessageEvent.idl        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx"> * Copyright (C) 2007 Henry Mason <hmason@mac.com>
</span><span class="cx"> * Copyright (C) 2011 Google Inc. All rights reserved.
</span><ins>+ * Copyright (C) 2016 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -32,16 +33,16 @@
</span><span class="cx"> ] interface MessageEvent : Event {
</span><span class="cx"> readonly attribute USVString origin;
</span><span class="cx"> readonly attribute DOMString lastEventId;
</span><del>- readonly attribute EventTarget? source; // May be a DOMWindow or a MessagePort.
</del><ins>+ readonly attribute EventTarget? source;
</ins><span class="cx"> [CachedAttribute, CustomGetter] readonly attribute any data;
</span><span class="cx"> readonly attribute FrozenArray<MessagePort> ports;
</span><span class="cx">
</span><span class="cx"> [Custom] void initMessageEvent(optional DOMString typeArg, optional boolean canBubbleArg, optional boolean cancelableArg,
</span><del>- optional any dataArg, optional USVString originArg, optional DOMString lastEventIdArg, optional DOMWindow sourceArg,
</del><ins>+ optional any dataArg, optional USVString originArg, optional DOMString lastEventIdArg, optional (DOMWindow or MessagePort)? sourceArg,
</ins><span class="cx"> optional Array messagePorts);
</span><span class="cx">
</span><span class="cx"> [Custom] void webkitInitMessageEvent(optional DOMString typeArg, optional boolean canBubbleArg, optional boolean cancelableArg,
</span><del>- optional any dataArg, optional USVString originArg, optional DOMString lastEventIdArg, optional DOMWindow sourceArg,
</del><ins>+ optional any dataArg, optional USVString originArg, optional DOMString lastEventIdArg, optional (DOMWindow or MessagePort)? sourceArg,
</ins><span class="cx"> optional Array transferables);
</span><span class="cx"> };
</span><span class="cx">
</span><span class="lines">@@ -49,6 +50,6 @@
</span><span class="cx"> any data = null;
</span><span class="cx"> USVString origin = "";
</span><span class="cx"> DOMString lastEventId = "";
</span><del>- EventTarget? source = null;
</del><ins>+ (DOMWindow or MessagePort)? source = null;
</ins><span class="cx"> sequence<MessagePort> ports = [];
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/Node.cpp        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -435,12 +435,12 @@
</span><span class="cx"> return downcast<ContainerNode>(*this).appendChild(newChild, ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static HashSet<RefPtr<Node>> nodeSetPreTransformedFromNodeOrStringVector(const Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>& vector)
</del><ins>+static HashSet<RefPtr<Node>> nodeSetPreTransformedFromNodeOrStringVector(const Vector<NodeOrString>& vector)
</ins><span class="cx"> {
</span><span class="cx"> HashSet<RefPtr<Node>> nodeSet;
</span><span class="cx">
</span><span class="cx"> auto visitor = WTF::makeVisitor(
</span><del>- [&](const std::reference_wrapper<Node>& node) { nodeSet.add(const_cast<Node*>(&node.get())); },
</del><ins>+ [&](const RefPtr<Node>& node) { nodeSet.add(const_cast<Node*>(node.get())); },
</ins><span class="cx"> [](const String&) { }
</span><span class="cx"> );
</span><span class="cx">
</span><span class="lines">@@ -468,7 +468,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<Node> Node::convertNodesOrStringsIntoNode(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+RefPtr<Node> Node::convertNodesOrStringsIntoNode(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> if (nodeOrStringVector.isEmpty())
</span><span class="cx"> return nullptr;
</span><span class="lines">@@ -477,7 +477,7 @@
</span><span class="cx"> nodes.reserveInitialCapacity(nodeOrStringVector.size());
</span><span class="cx">
</span><span class="cx"> auto visitor = WTF::makeVisitor(
</span><del>- [&](std::reference_wrapper<Node>& node) { nodes.uncheckedAppend(node); },
</del><ins>+ [&](RefPtr<Node>& node) { nodes.uncheckedAppend(*node.get()); },
</ins><span class="cx"> [&](String& string) { nodes.uncheckedAppend(Text::create(document(), string)); }
</span><span class="cx"> );
</span><span class="cx">
</span><span class="lines">@@ -495,7 +495,7 @@
</span><span class="cx"> return WTFMove(nodeToReturn);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Node::before(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void Node::before(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<ContainerNode> parent = parentNode();
</span><span class="cx"> if (!parent)
</span><span class="lines">@@ -516,7 +516,7 @@
</span><span class="cx"> parent->insertBefore(*node, viablePreviousSibling.get(), ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Node::after(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void Node::after(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<ContainerNode> parent = parentNode();
</span><span class="cx"> if (!parent)
</span><span class="lines">@@ -532,7 +532,7 @@
</span><span class="cx"> parent->insertBefore(*node, viableNextSibling.get(), ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Node::replaceWith(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void Node::replaceWith(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<ContainerNode> parent = parentNode();
</span><span class="cx"> if (!parent)
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.h (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.h        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/dom/Node.h        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -63,6 +63,8 @@
</span><span class="cx">
</span><span class="cx"> const int nodeStyleChangeShift = 14;
</span><span class="cx">
</span><ins>+using NodeOrString = std::experimental::variant<RefPtr<Node>, String>;
+
</ins><span class="cx"> // SyntheticStyleChange means that we need to go through the entire style change logic even though
</span><span class="cx"> // no style property has actually changed. It is used to restructure the tree when, for instance,
</span><span class="cx"> // RenderLayers are created or destroyed due to animation changes.
</span><span class="lines">@@ -202,9 +204,9 @@
</span><span class="cx"> WEBCORE_EXPORT Element* nextElementSibling() const;
</span><span class="cx">
</span><span class="cx"> // From the ChildNode - https://dom.spec.whatwg.org/#childnode
</span><del>- void before(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&&, ExceptionCode&);
- void after(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&&, ExceptionCode&);
- void replaceWith(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&&, ExceptionCode&);
</del><ins>+ void before(Vector<NodeOrString>&&, ExceptionCode&);
+ void after(Vector<NodeOrString>&&, ExceptionCode&);
+ void replaceWith(Vector<NodeOrString>&&, ExceptionCode&);
</ins><span class="cx"> WEBCORE_EXPORT void remove(ExceptionCode&);
</span><span class="cx">
</span><span class="cx"> // Other methods (not part of DOM)
</span><span class="lines">@@ -660,7 +662,7 @@
</span><span class="cx"> void setStyleChange(StyleChangeType changeType) { m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType; }
</span><span class="cx"> void updateAncestorsForStyleRecalc();
</span><span class="cx">
</span><del>- RefPtr<Node> convertNodesOrStringsIntoNode(Vector<std::experimental::variant<std::reference_wrapper<Node>, String>>&&, ExceptionCode&);
</del><ins>+ RefPtr<Node> convertNodesOrStringsIntoNode(Vector<NodeOrString>&&, ExceptionCode&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> virtual PseudoId customPseudoId() const
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (207380 => 207381)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2016-10-15 21:31:59 UTC (rev 207380)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2016-10-15 21:52:09 UTC (rev 207381)
</span><span class="lines">@@ -160,7 +160,7 @@
</span><span class="cx">
</span><span class="cx"> Ref<MessageEvent> event(ScriptExecutionContext& context)
</span><span class="cx"> {
</span><del>- return MessageEvent::create(MessagePort::entanglePorts(context, WTFMove(m_channels)), WTFMove(m_message), m_origin, { }, m_source.ptr());
</del><ins>+ return MessageEvent::create(MessagePort::entanglePorts(context, WTFMove(m_channels)), WTFMove(m_message), m_origin, { }, MessageEventSource(RefPtr<DOMWindow>(WTFMove(m_source))));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> SecurityOrigin* targetOrigin() const { return m_targetOrigin.get(); }
</span></span></pre>
</div>
</div>
</body>
</html>