<!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>[204291] 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/204291">204291</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2016-08-09 13:31:42 -0700 (Tue, 09 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>
Source/WebCore:
Replace NodeOrString with std::variant&lt;Ref&lt;Node&gt;, String&gt;
https://bugs.webkit.org/show_bug.cgi?id=160638

Reviewed by Anders Carlsson.

* WebCore.xcodeproj/project.pbxproj:
Remove NodeOrString.h/cpp

* bindings/js/JSNodeOrString.cpp:
* bindings/js/JSNodeOrString.h:
* dom/ContainerNode.cpp:
(WebCore::ContainerNode::append):
(WebCore::ContainerNode::prepend):
* dom/ContainerNode.h:
* dom/Node.cpp:
(WebCore::nodeSetPreTransformedFromNodeOrStringVector):
(WebCore::firstFollowingSiblingNotInNodeSet):
(WebCore::Node::convertNodesOrStringsIntoNode):
(WebCore::Node::before):
(WebCore::Node::after):
(WebCore::Node::replaceWith):
* dom/Node.h:
Replace NodeOrString with std::variant&lt;Ref&lt;Node&gt;, String&gt; and move convertNodesOrStringsIntoNode
into Node.

* dom/NodeOrString.cpp: Removed.
* dom/NodeOrString.h: Removed.

Source/WTF:
Replace NodeOrString with std::variant&lt;RefPtr&lt;Node&gt;, String&gt;
https://bugs.webkit.org/show_bug.cgi?id=160638

Reviewed by Anders Carlsson.

* wtf/StdLibExtras.h:
(WTF::Visitor::Visitor):
(WTF::makeVisitor):
Add WTF::makeVisitor() which takes a list of lambdas to use
an an overload set for a visitor object.

Also, re-export std::experimental::variant (and helpers) in the std
namespace using type aliasing.

* wtf/Variant.h:
Make std::experimental::variant work in WebCore.

Tools:
Replace NodeOrString with std::variant&lt;RefPtr&lt;Node&gt;, String&gt;
https://bugs.webkit.org/show_bug.cgi?id=160638

Reviewed by Anders Carlsson.

* TestWebKitAPI/CMakeLists.txt:
* TestWebKitAPI/Tests/WTF/Variant.cpp:
Add additional tests for the initial state of std::variant and using
makeVisitor for visiting.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfStdLibExtrash">trunk/Source/WTF/wtf/StdLibExtras.h</a></li>
<li><a href="#trunkSourceWTFwtfVarianth">trunk/Source/WTF/wtf/Variant.h</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSNodeOrStringcpp">trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSNodeOrStringh">trunk/Source/WebCore/bindings/js/JSNodeOrString.h</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="#trunkSourceWebCoredomDOMAllInOnecpp">trunk/Source/WebCore/dom/DOMAllInOne.cpp</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="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPICMakeListstxt">trunk/Tools/TestWebKitAPI/CMakeLists.txt</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFVariantcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoredomNodeOrStringcpp">trunk/Source/WebCore/dom/NodeOrString.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodeOrStringh">trunk/Source/WebCore/dom/NodeOrString.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WTF/ChangeLog        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,5 +1,24 @@
</span><span class="cx"> 2016-08-06  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Replace NodeOrString with std::variant&lt;RefPtr&lt;Node&gt;, String&gt;
+        https://bugs.webkit.org/show_bug.cgi?id=160638
+
+        Reviewed by Anders Carlsson.
+
+        * wtf/StdLibExtras.h:
+        (WTF::Visitor::Visitor):
+        (WTF::makeVisitor):
+        Add WTF::makeVisitor() which takes a list of lambdas to use
+        an an overload set for a visitor object.
+
+        Also, re-export std::experimental::variant (and helpers) in the std
+        namespace using type aliasing.
+
+        * wtf/Variant.h:
+        Make std::experimental::variant work in WebCore.
+
+2016-08-06  Sam Weinig  &lt;sam@webkit.org&gt;
+
</ins><span class="cx">         WTF needs a variant implementation
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=160618
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtfStdLibExtrash"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/StdLibExtras.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/StdLibExtras.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WTF/wtf/StdLibExtras.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &lt;string.h&gt;
</span><span class="cx"> #include &lt;wtf/Assertions.h&gt;
</span><span class="cx"> #include &lt;wtf/CheckedArithmetic.h&gt;
</span><ins>+#include &lt;wtf/Variant.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> // This was used to declare and define a static local variable (static T;) so that
</span><span class="cx"> //  it was leaked so that its destructors were not called at exit.
</span><span class="lines">@@ -309,6 +310,36 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Visitor adapted from http://stackoverflow.com/questions/25338795/is-there-a-name-for-this-tuple-creation-idiom
+
+template &lt;class A, class... B&gt;
+struct Visitor : Visitor&lt;A&gt;, Visitor&lt;B...&gt; {
+    Visitor(A a, B... b)
+        : Visitor&lt;A&gt;(a)
+        , Visitor&lt;B...&gt;(b...)
+    {
+    }
+
+    using Visitor&lt;A&gt;::operator ();
+    using Visitor&lt;B...&gt;::operator ();
+};
+  
+template &lt;class A&gt;
+struct Visitor&lt;A&gt; : A {
+    Visitor(A a)
+        : A(a)
+    {
+    }
+
+    using A::operator();
+};

+template &lt;class... F&gt;
+auto makeVisitor(F... f)
+{
+    return Visitor&lt;F...&gt;(f...);
+}
+
</ins><span class="cx"> } // namespace WTF
</span><span class="cx"> 
</span><span class="cx"> // This version of placement new omits a 0 check.
</span><span class="lines">@@ -372,6 +403,14 @@
</span><span class="cx">     return move(forward&lt;T&gt;(value));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;typename... Types&gt;
+using variant = std::experimental::variant&lt;Types...&gt;;
+
+using std::experimental::get;
+using std::experimental::get_if;
+using std::experimental::holds_alternative;
+using std::experimental::visit;
+
</ins><span class="cx"> } // namespace std
</span><span class="cx"> 
</span><span class="cx"> #define WTFMove(value) std::move&lt;WTF::CheckMoveParameter&gt;(value)
</span></span></pre></div>
<a id="trunkSourceWTFwtfVarianth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Variant.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Variant.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WTF/wtf/Variant.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include &lt;functional&gt;
</ins><span class="cx"> #include &lt;limits.h&gt;
</span><span class="cx"> #include &lt;new&gt;
</span><span class="cx"> #include &lt;stddef.h&gt;
</span><span class="lines">@@ -48,30 +49,25 @@
</span><span class="cx"> #include &lt;utility&gt;
</span><span class="cx"> #include &lt;wtf/Compiler.h&gt;
</span><span class="cx"> 
</span><ins>+#if COMPILER(MSVC)
+#pragma warning(push)
+#pragma warning(disable:4245)
+#pragma warning(disable:4521)
+#pragma warning(disable:4522)
+#pragma warning(disable:4814)
+#endif
+
</ins><span class="cx"> namespace std {
</span><span class="cx"> namespace experimental {
</span><span class="cx"> 
</span><span class="cx"> #if COMPILER_SUPPORTS(EXCEPTIONS)
</span><del>-
</del><span class="cx"> #define __THROW_EXCEPTION(__exception) throw __exception;
</span><del>-#define __CONST_EXPR_THROW_EXCPETION_IF(__predicate, __exception) \
-    do { \
-        if ((__predicate)) { \
-            throw __exception; \
-        } \
-    while (0); \
-
</del><ins>+#define __NOEXCEPT noexcept
+#define __NOEXCEPT_(__exception) noexcept(__exception)
</ins><span class="cx"> #else
</span><del>-
-static inline void __crash_helper(bool){
-    CRASH();
-}
-static inline constexpr bool __constexpr_crash_if(bool test){
-    return !test ? true : (__crash_helper(test), false);
-}
-
-#define __THROW_EXCEPTION(...) CRASH();
-#define __CONST_EXPR_THROW_EXCPETION_IF(__predicate, __exception) __constexpr_crash_if((__predicate));
</del><ins>+#define __THROW_EXCEPTION(__exception) do { (void)__exception; CRASH(); } while (0);
+#define __NOEXCEPT
+#define __NOEXCEPT_(...)
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> struct __in_place_private{
</span><span class="lines">@@ -117,6 +113,11 @@
</span><span class="cx">     {}
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;typename T&gt;
+NO_RETURN_DUE_TO_CRASH inline T __throw_bad_variant_access(const char* what_arg){
+    __THROW_EXCEPTION(bad_variant_access(what_arg))
+}
+
</ins><span class="cx"> template&lt;ptrdiff_t _Offset,typename _Type,typename ... _Types&gt;
</span><span class="cx"> struct __type_index_helper;
</span><span class="cx"> 
</span><span class="lines">@@ -306,7 +307,7 @@
</span><span class="cx"> template&lt;typename _Target,typename ... _Args&gt;
</span><span class="cx"> struct __storage_nothrow_constructible{
</span><span class="cx">     static const bool __value=
</span><del>-        noexcept(_Target(std::declval&lt;_Args&gt;()...));
</del><ins>+        std::is_nothrow_constructible&lt;_Target, _Args...&gt;::value;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ... _Types&gt;
</span><span class="lines">@@ -535,7 +536,7 @@
</span><span class="cx">     _Type&amp; __get(in_place_index_t&lt;0&gt;){
</span><span class="cx">         return __variant_storage&lt;_Type&gt;::__get(__val);
</span><span class="cx">     }
</span><del>-    constexpr _Type&amp;&amp; __get_rref(in_place_index_t&lt;0&gt;){
</del><ins>+    /*constexpr*/ _Type&amp;&amp; __get_rref(in_place_index_t&lt;0&gt;){
</ins><span class="cx">         return __variant_storage&lt;_Type&gt;::__get_rref(__val);
</span><span class="cx">     }
</span><span class="cx">     constexpr const _Type&amp; __get(in_place_index_t&lt;0&gt;) const{
</span><span class="lines">@@ -626,7 +627,7 @@
</span><span class="cx">         return __head.__get(in_place&lt;0&gt;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    constexpr _Head&amp;&amp; __get_rref(in_place_index_t&lt;0&gt;){
</del><ins>+    /*constexpr*/ _Head&amp;&amp; __get_rref(in_place_index_t&lt;0&gt;){
</ins><span class="cx">         return __head.__get_rref(in_place&lt;0&gt;);
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -645,7 +646,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template&lt;size_t _Index&gt;
</span><del>-    constexpr typename __indexed_type&lt;_Index-1,_Rest...&gt;::__type&amp;&amp; __get_rref(
</del><ins>+    /*constexpr*/ typename __indexed_type&lt;_Index-1,_Rest...&gt;::__type&amp;&amp; __get_rref(
</ins><span class="cx">         in_place_index_t&lt;_Index&gt;){
</span><span class="cx">         return __rest.__get_rref(in_place&lt;_Index-1&gt;);
</span><span class="cx">     }
</span><span class="lines">@@ -1169,10 +1170,10 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;ptrdiff_t _Index,typename _Storage&gt;
</span><span class="cx"> struct __backup_storage_ops&lt;_Index,_Index,_Storage&gt;{
</span><del>-    static void __move_construct_func(_Storage * __dest,_Storage&amp; __source){
</del><ins>+    static void __move_construct_func(_Storage *,_Storage&amp;){
</ins><span class="cx">         __THROW_EXCEPTION(std::bad_alloc());
</span><span class="cx">     };
</span><del>-    static void __destroy_func(_Storage * __obj){
</del><ins>+    static void __destroy_func(_Storage *){
</ins><span class="cx">         __THROW_EXCEPTION(std::bad_alloc());
</span><span class="cx">     };
</span><span class="cx"> };
</span><span class="lines">@@ -1529,13 +1530,13 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     constexpr variant()
</span><del>-        noexcept(noexcept(typename __indexed_type&lt;0,_Types...&gt;::__type())):
</del><ins>+        __NOEXCEPT_(noexcept(typename __indexed_type&lt;0,_Types...&gt;::__type())):
</ins><span class="cx">         __storage(in_place&lt;0&gt;),
</span><span class="cx">         __index(0)
</span><span class="cx">     {}
</span><span class="cx"> 
</span><span class="cx">     constexpr variant(typename std::conditional&lt;__all_move_constructible&lt;_Types...&gt;::value,variant,__private_type&gt;::type&amp;&amp; __other)
</span><del>-    noexcept(__noexcept_variant_move_construct&lt;_Types...&gt;::value):
</del><ins>+    __NOEXCEPT_(__noexcept_variant_move_construct&lt;_Types...&gt;::value):
</ins><span class="cx">         __index(__move_construct(__other))
</span><span class="cx">     {}
</span><span class="cx"> 
</span><span class="lines">@@ -1542,7 +1543,7 @@
</span><span class="cx">     constexpr variant(typename std::conditional&lt;!__all_move_constructible&lt;_Types...&gt;::value,variant,__private_type&gt;::type&amp;&amp; __other)=delete;
</span><span class="cx">     
</span><span class="cx">     constexpr variant(typename std::conditional&lt;__all_copy_constructible&lt;_Types...&gt;::value,variant,__private_type&gt;::type&amp; __other)
</span><del>-    noexcept(__noexcept_variant_non_const_copy_construct&lt;_Types...&gt;::value):
</del><ins>+    __NOEXCEPT_(__noexcept_variant_non_const_copy_construct&lt;_Types...&gt;::value):
</ins><span class="cx">         __index(__copy_construct(__other))
</span><span class="cx">     {}
</span><span class="cx"> 
</span><span class="lines">@@ -1549,7 +1550,7 @@
</span><span class="cx">     constexpr variant(typename std::conditional&lt;!__all_copy_constructible&lt;_Types...&gt;::value,variant,__private_type&gt;::type&amp; __other)=delete;
</span><span class="cx"> 
</span><span class="cx">     constexpr variant(typename std::conditional&lt;__all_copy_constructible&lt;_Types...&gt;::value,variant,__private_type&gt;::type const&amp; __other)
</span><del>-    noexcept(__noexcept_variant_const_copy_construct&lt;_Types...&gt;::value):
</del><ins>+    __NOEXCEPT_(__noexcept_variant_const_copy_construct&lt;_Types...&gt;::value):
</ins><span class="cx">         __index(__copy_construct(__other))
</span><span class="cx">     {}
</span><span class="cx"> 
</span><span class="lines">@@ -1668,7 +1669,7 @@
</span><span class="cx">         typename std::conditional&lt;__all_move_constructible&lt;_Types...&gt;::value &amp;&amp;
</span><span class="cx">                                       __all_move_assignable&lt;_Types...&gt;::value,
</span><span class="cx">                                   variant, __private_type&gt;::type &amp;&amp;
</span><del>-            __other) noexcept(__noexcept_variant_move_assign&lt;_Types...&gt;::value) {
</del><ins>+            __other) __NOEXCEPT_(__noexcept_variant_move_assign&lt;_Types...&gt;::value) {
</ins><span class="cx">         if (__other.valueless_by_exception()) {
</span><span class="cx">             __destroy_self();
</span><span class="cx">         }
</span><span class="lines">@@ -1694,10 +1695,10 @@
</span><span class="cx">         __direct_replace&lt;_Index&gt;(std::forward&lt;_Args&gt;(__args)...);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    constexpr bool valueless_by_exception() const noexcept{
</del><ins>+    constexpr bool valueless_by_exception() const __NOEXCEPT{
</ins><span class="cx">         return __index==-1;
</span><span class="cx">     }
</span><del>-    constexpr ptrdiff_t index() const noexcept{
</del><ins>+    constexpr ptrdiff_t index() const __NOEXCEPT{
</ins><span class="cx">         return __index;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1706,7 +1707,7 @@
</span><span class="cx">             __all_swappable&lt;_Types...&gt;::value &amp;&amp;
</span><span class="cx">                 __all_move_constructible&lt;_Types...&gt;::value,
</span><span class="cx">             variant, __private_type&gt;::type
</span><del>-            &amp;__other) noexcept(__noexcept_variant_swap&lt;_Types...&gt;::value) {
</del><ins>+            &amp;__other) __NOEXCEPT_(__noexcept_variant_swap&lt;_Types...&gt;::value) {
</ins><span class="cx">         if (__other.index() == index()) {
</span><span class="cx">             if(!valueless_by_exception())
</span><span class="cx">                 __swap_op_table&lt;variant&gt;::__apply[index()](*this,__other);
</span><span class="lines">@@ -1724,10 +1725,10 @@
</span><span class="cx"> public:
</span><span class="cx">     variant()=delete;
</span><span class="cx">     
</span><del>-    constexpr bool valueless_by_exception() const noexcept{
</del><ins>+    constexpr bool valueless_by_exception() const __NOEXCEPT{
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    constexpr ptrdiff_t index() const noexcept{
</del><ins>+    constexpr ptrdiff_t index() const __NOEXCEPT{
</ins><span class="cx">         return -1;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1738,7 +1739,7 @@
</span><span class="cx"> typename std::enable_if&lt;__all_swappable&lt;_Types...&gt;::value &amp;&amp;
</span><span class="cx">                             __all_move_constructible&lt;_Types...&gt;::value,
</span><span class="cx">                         void&gt;::type
</span><del>-swap(variant&lt;_Types...&gt; &amp;__lhs, variant&lt;_Types...&gt; &amp;__rhs) noexcept(
</del><ins>+swap(variant&lt;_Types...&gt; &amp;__lhs, variant&lt;_Types...&gt; &amp;__rhs) __NOEXCEPT_(
</ins><span class="cx">     __noexcept_variant_swap&lt;_Types...&gt;::value) {
</span><span class="cx">     __lhs.swap(__rhs);
</span><span class="cx"> }
</span><span class="lines">@@ -1783,26 +1784,34 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;ptrdiff_t _Index,typename ... _Types&gt;
</span><span class="cx"> constexpr typename __indexed_type&lt;_Index,_Types...&gt;::__type const&amp; get(variant&lt;_Types...&gt; const&amp; __v){
</span><del>-    __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access(&quot;Bad variant index in get&quot;));
-    return *(&amp;__variant_accessor&lt;_Index,_Types...&gt;::get(__v));
</del><ins>+    return *(
+        (_Index!=__v.index())
+            ? &amp;__throw_bad_variant_access&lt;typename __indexed_type&lt;_Index,_Types...&gt;::__type const&amp;&gt;(&quot;Bad variant index in get&quot;)
+            : &amp;__variant_accessor&lt;_Index,_Types...&gt;::get(__v)
+    );
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;ptrdiff_t _Index,typename ... _Types&gt;
</span><span class="cx"> constexpr typename __indexed_type&lt;_Index,_Types...&gt;::__type&amp; get(variant&lt;_Types...&gt;&amp; __v){
</span><del>-    __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access(&quot;Bad variant index in get&quot;));
-    return *(&amp;__variant_accessor&lt;_Index,_Types...&gt;::get(__v));
</del><ins>+    return *(
+        (_Index!=__v.index())
+            ? &amp;__throw_bad_variant_access&lt;typename __indexed_type&lt;_Index,_Types...&gt;::__type&amp;&gt;(&quot;Bad variant index in get&quot;)
+            : &amp;__variant_accessor&lt;_Index,_Types...&gt;::get(__v)
+    );
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;ptrdiff_t _Index,typename ... _Types&gt;
</span><span class="cx"> constexpr typename __indexed_type&lt;_Index,_Types...&gt;::__type&amp;&amp; get(variant&lt;_Types...&gt;&amp;&amp; __v){
</span><del>-    __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access(&quot;Bad variant index in get&quot;));
-    return __variant_accessor&lt;_Index,_Types...&gt;::get(std::move(__v));
</del><ins>+    return __variant_accessor&lt;_Index,_Types...&gt;::get(
+        (((_Index!=__v.index()) ? __throw_bad_variant_access&lt;int&gt;(&quot;Bad variant index in get&quot;) : 0), std::move(__v))
+    );
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;ptrdiff_t _Index,typename ... _Types&gt;
</span><span class="cx"> constexpr const typename __indexed_type&lt;_Index,_Types...&gt;::__type&amp;&amp; get(variant&lt;_Types...&gt; const&amp;&amp; __v){
</span><del>-    __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access(&quot;Bad variant index in get&quot;));
-    return __variant_accessor&lt;_Index,_Types...&gt;::get(std::move(__v));
</del><ins>+    return __variant_accessor&lt;_Index,_Types...&gt;::get(
+        (((_Index!=__v.index()) ? __throw_bad_variant_access&lt;int&gt;(&quot;Bad variant index in get&quot;) : 0), std::move(__v))
+    );
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename _Type,typename ... _Types&gt;
</span><span class="lines">@@ -1829,7 +1838,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename _Type,typename ... _Types&gt;
</span><del>-constexpr bool holds_alternative(variant&lt;_Types...&gt; const&amp; __v) noexcept{
</del><ins>+constexpr bool holds_alternative(variant&lt;_Types...&gt; const&amp; __v) __NOEXCEPT{
</ins><span class="cx">     return __v.index()==__type_index&lt;_Type,_Types...&gt;::__value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1868,8 +1877,9 @@
</span><span class="cx"> template&lt;typename _Visitor,typename ... _Types&gt;
</span><span class="cx"> constexpr typename __visitor_return_type&lt;_Visitor,_Types...&gt;::__type
</span><span class="cx"> visit(_Visitor&amp;&amp; __visitor,variant&lt;_Types...&gt;&amp; __v){
</span><del>-    __CONST_EXPR_THROW_EXCPETION_IF(__v.valueless_by_exception(), bad_variant_access(&quot;Visiting of empty variant&quot;));
-    return __visitor_table&lt;_Visitor,_Types...&gt;::__trampoline[__v.index()](__visitor,__v);
</del><ins>+    return (__v.valueless_by_exception())
+        ? __throw_bad_variant_access&lt;typename __visitor_return_type&lt;_Visitor,_Types...&gt;::__type&gt;(&quot;Visiting of empty variant&quot;)
+        : __visitor_table&lt;_Visitor,_Types...&gt;::__trampoline[__v.index()](__visitor,__v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename _Visitor,typename ... _Variants&gt;
</span><span class="lines">@@ -1938,8 +1948,8 @@
</span><span class="cx"> struct __visit_helper2&lt;-1,_VariantIndex,_Indices...&gt;{
</span><span class="cx">     template&lt;typename _Visitor,typename ... _Variants&gt;
</span><span class="cx">     static constexpr typename __multi_visitor_return_type&lt;_Visitor,_Variants...&gt;::__type
</span><del>-    __visit(_Visitor&amp; __visitor,_Variants&amp;&amp; ... __v){
-        __CONST_EXPR_THROW_EXCPETION_IF(true, bad_variant_access(&quot;Visiting of empty variant&quot;));
</del><ins>+    __visit(_Visitor&amp;,_Variants&amp;&amp; ...){
+        __throw_bad_variant_access&lt;typename __multi_visitor_return_type&lt;_Visitor,_Variants...&gt;::__type&gt;(&quot;Visiting of empty variant&quot;);
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -2040,7 +2050,7 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> struct hash&lt;experimental::monostate&gt;{
</span><del>-    size_t operator()(experimental::monostate) noexcept{
</del><ins>+    size_t operator()(experimental::monostate) __NOEXCEPT{
</ins><span class="cx">         return 42;
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="lines">@@ -2047,7 +2057,7 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ... _Types&gt;
</span><span class="cx"> struct hash&lt;experimental::variant&lt;_Types...&gt;&gt;{
</span><del>-    size_t operator()(experimental::variant&lt;_Types...&gt; const &amp;v) noexcept {
</del><ins>+    size_t operator()(experimental::variant&lt;_Types...&gt; const &amp;v) __NOEXCEPT {
</ins><span class="cx">         return std::hash&lt;ptrdiff_t&gt;()(v.index()) ^
</span><span class="cx">                experimental::visit(experimental::__hash_visitor(), v);
</span><span class="cx">     }
</span><span class="lines">@@ -2054,3 +2064,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace std
</span><ins>+
+#if COMPILER(MSVC)
+#pragma warning(pop)
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1487,7 +1487,6 @@
</span><span class="cx">     dom/Node.cpp
</span><span class="cx">     dom/NodeFilterCondition.cpp
</span><span class="cx">     dom/NodeIterator.cpp
</span><del>-    dom/NodeOrString.cpp
</del><span class="cx">     dom/NodeRareData.cpp
</span><span class="cx">     dom/NodeTraversal.cpp
</span><span class="cx">     dom/OverflowEvent.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/ChangeLog        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2016-08-06  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Replace NodeOrString with std::variant&lt;Ref&lt;Node&gt;, String&gt;
+        https://bugs.webkit.org/show_bug.cgi?id=160638
+
+        Reviewed by Anders Carlsson.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        Remove NodeOrString.h/cpp
+
+        * bindings/js/JSNodeOrString.cpp:
+        * bindings/js/JSNodeOrString.h:
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::append):
+        (WebCore::ContainerNode::prepend):
+        * dom/ContainerNode.h:
+        * dom/Node.cpp:
+        (WebCore::nodeSetPreTransformedFromNodeOrStringVector):
+        (WebCore::firstFollowingSiblingNotInNodeSet):
+        (WebCore::Node::convertNodesOrStringsIntoNode):
+        (WebCore::Node::before):
+        (WebCore::Node::after):
+        (WebCore::Node::replaceWith):
+        * dom/Node.h:
+        Replace NodeOrString with std::variant&lt;Ref&lt;Node&gt;, String&gt; and move convertNodesOrStringsIntoNode
+        into Node.
+
+        * dom/NodeOrString.cpp: Removed.
+        * dom/NodeOrString.h: Removed.
+
</ins><span class="cx"> 2016-08-09  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         It should be possible to re-initialize a CustomEvent after it's been dispatched
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -2844,8 +2844,6 @@
</span><span class="cx">                 7CE683471921821500F4D928 /* UserMessageHandlerDescriptorTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE683461921821500F4D928 /* UserMessageHandlerDescriptorTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7CE6CBFB187F370700D46BF5 /* FormatConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE6CBFA187F370700D46BF5 /* FormatConverter.h */; };
</span><span class="cx">                 7CE6CBFD187F394900D46BF5 /* FormatConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CE6CBFC187F394900D46BF5 /* FormatConverter.cpp */; };
</span><del>-                7CEAC1071B483D1D00334482 /* NodeOrString.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CEAC1061B483D1D00334482 /* NodeOrString.h */; };
-                7CEAC1091B483D7F00334482 /* NodeOrString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAC1081B483D7F00334482 /* NodeOrString.cpp */; };
</del><span class="cx">                 7CFDC57C1AC1D80500E24A57 /* ContentExtensionError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */; };
</span><span class="cx">                 7CFDC57D1AC1D80500E24A57 /* ContentExtensionError.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7D4C96DC1AD4483500365A50 /* JSFetchHeaders.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7D4C96D81AD4483500365A50 /* JSFetchHeaders.cpp */; };
</span><span class="lines">@@ -10263,8 +10261,6 @@
</span><span class="cx">                 7CE683461921821500F4D928 /* UserMessageHandlerDescriptorTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMessageHandlerDescriptorTypes.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7CE6CBFA187F370700D46BF5 /* FormatConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatConverter.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7CE6CBFC187F394900D46BF5 /* FormatConverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatConverter.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                7CEAC1061B483D1D00334482 /* NodeOrString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeOrString.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7CEAC1081B483D7F00334482 /* NodeOrString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodeOrString.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionError.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionError.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7D4C96D81AD4483500365A50 /* JSFetchHeaders.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFetchHeaders.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -24132,8 +24128,6 @@
</span><span class="cx">                                 1A750D870A90E394000FF215 /* NodeIterator.idl */,
</span><span class="cx">                                 A81872100977D3C0005826D9 /* NodeList.h */,
</span><span class="cx">                                 85ACA9FA0A9B631000671E90 /* NodeList.idl */,
</span><del>-                                7CEAC1081B483D7F00334482 /* NodeOrString.cpp */,
-                                7CEAC1061B483D1D00334482 /* NodeOrString.h */,
</del><span class="cx">                                 4FAB48661643A67E00F70C07 /* NodeRareData.cpp */,
</span><span class="cx">                                 63189AE20E83A33300012E41 /* NodeRareData.h */,
</span><span class="cx">                                 63D7B32C0E78CD3F00F7617C /* NodeRenderStyle.h */,
</span><span class="lines">@@ -26892,7 +26886,6 @@
</span><span class="cx">                                 854FE7330A2297BE0058D7AD /* NodeFilterCondition.h in Headers */,
</span><span class="cx">                                 854FE7350A2297BE0058D7AD /* NodeIterator.h in Headers */,
</span><span class="cx">                                 A818721B0977D3C0005826D9 /* NodeList.h in Headers */,
</span><del>-                                7CEAC1071B483D1D00334482 /* NodeOrString.h in Headers */,
</del><span class="cx">                                 63189AE30E83A33300012E41 /* NodeRareData.h in Headers */,
</span><span class="cx">                                 63D7B32D0E78CD3F00F7617C /* NodeRenderStyle.h in Headers */,
</span><span class="cx">                                 E43105BB16750F1600DB2FB8 /* NodeTraversal.h in Headers */,
</span><span class="lines">@@ -30694,7 +30687,6 @@
</span><span class="cx">                                 A8C4A80009D563270003AC8D /* Node.cpp in Sources */,
</span><span class="cx">                                 854FE7320A2297BE0058D7AD /* NodeFilterCondition.cpp in Sources */,
</span><span class="cx">                                 854FE7340A2297BE0058D7AD /* NodeIterator.cpp in Sources */,
</span><del>-                                7CEAC1091B483D7F00334482 /* NodeOrString.cpp in Sources */,
</del><span class="cx">                                 4FFC022B1643B710004E1638 /* NodeRareData.cpp in Sources */,
</span><span class="cx">                                 E43105B816750F0C00DB2FB8 /* NodeTraversal.cpp in Sources */,
</span><span class="cx">                                 33503CC71017A1B1003B47E1 /* Notification.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSNodeOrStringcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -33,17 +33,17 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-Vector&lt;NodeOrString&gt; toNodeOrStringVector(ExecState&amp; state)
</del><ins>+Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt; toNodeOrStringVector(ExecState&amp; state)
</ins><span class="cx"> {
</span><span class="cx">     size_t argumentCount = state.argumentCount();
</span><span class="cx"> 
</span><del>-    Vector&lt;NodeOrString&gt; result;
</del><ins>+    Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt; result;
</ins><span class="cx">     result.reserveInitialCapacity(argumentCount);
</span><span class="cx"> 
</span><span class="cx">     for (size_t i = 0; i &lt; argumentCount; ++i) {
</span><span class="cx">         JSValue value = state.uncheckedArgument(i);
</span><span class="cx">         if (auto* node = jsDynamicCast&lt;JSNode*&gt;(value))
</span><del>-            result.uncheckedAppend(&amp;node-&gt;wrapped());
</del><ins>+            result.uncheckedAppend(node-&gt;wrapped());
</ins><span class="cx">         else {
</span><span class="cx">             String string = value.toWTFString(&amp;state);
</span><span class="cx">             if (state.hadException())
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSNodeOrStringh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSNodeOrString.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSNodeOrString.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/bindings/js/JSNodeOrString.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -26,7 +26,8 @@
</span><span class="cx"> #ifndef JSNodeOrString_h
</span><span class="cx"> #define JSNodeOrString_h
</span><span class="cx"> 
</span><del>-#include &quot;NodeOrString.h&quot;
</del><ins>+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/Variant.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -35,8 +36,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-Vector&lt;NodeOrString&gt; toNodeOrStringVector(JSC::ExecState&amp;);
</del><ins>+class Node;
</ins><span class="cx"> 
</span><ins>+Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt; toNodeOrStringVector(JSC::ExecState&amp;);
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // JSNodeOrStringVector_h
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -44,7 +44,6 @@
</span><span class="cx"> #include &quot;MutationEvent.h&quot;
</span><span class="cx"> #include &quot;NameNodeList.h&quot;
</span><span class="cx"> #include &quot;NoEventDispatchAssertion.h&quot;
</span><del>-#include &quot;NodeOrString.h&quot;
</del><span class="cx"> #include &quot;NodeRareData.h&quot;
</span><span class="cx"> #include &quot;NodeRenderStyle.h&quot;
</span><span class="cx"> #include &quot;RadioNodeList.h&quot;
</span><span class="lines">@@ -873,9 +872,9 @@
</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&lt;NodeOrString&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</del><ins>+void ContainerNode::append(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;Node&gt; node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+    RefPtr&lt;Node&gt; node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx">     if (ec || !node)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -882,9 +881,9 @@
</span><span class="cx">     appendChild(*node, ec);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ContainerNode::prepend(Vector&lt;NodeOrString&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</del><ins>+void ContainerNode::prepend(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;Node&gt; node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+    RefPtr&lt;Node&gt; node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx">     if (ec || !node)
</span><span class="cx">         return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/ContainerNode.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -99,8 +99,8 @@
</span><span class="cx">     Element* firstElementChild() const;
</span><span class="cx">     Element* lastElementChild() const;
</span><span class="cx">     unsigned childElementCount() const;
</span><del>-    void append(Vector&lt;NodeOrString&gt;&amp;&amp;, ExceptionCode&amp;);
-    void prepend(Vector&lt;NodeOrString&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    void append(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
+    void prepend(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
</ins><span class="cx"> 
</span><span class="cx">     bool ensurePreInsertionValidity(Node&amp; newChild, Node* refChild, ExceptionCode&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomDOMAllInOnecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DOMAllInOne.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DOMAllInOne.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/DOMAllInOne.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -112,7 +112,6 @@
</span><span class="cx"> #include &quot;Node.cpp&quot;
</span><span class="cx"> #include &quot;NodeFilterCondition.cpp&quot;
</span><span class="cx"> #include &quot;NodeIterator.cpp&quot;
</span><del>-#include &quot;NodeOrString.cpp&quot;
</del><span class="cx"> #include &quot;NodeRareData.cpp&quot;
</span><span class="cx"> #include &quot;NodeTraversal.cpp&quot;
</span><span class="cx"> #include &quot;OverflowEvent.cpp&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/Node.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -53,7 +53,6 @@
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;MutationEvent.h&quot;
</span><span class="cx"> #include &quot;NoEventDispatchAssertion.h&quot;
</span><del>-#include &quot;NodeOrString.h&quot;
</del><span class="cx"> #include &quot;NodeRenderStyle.h&quot;
</span><span class="cx"> #include &quot;ProcessingInstruction.h&quot;
</span><span class="cx"> #include &quot;ProgressEvent.h&quot;
</span><span class="lines">@@ -438,19 +437,18 @@
</span><span class="cx">     return downcast&lt;ContainerNode&gt;(*this).appendChild(newChild, ec);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static HashSet&lt;RefPtr&lt;Node&gt;&gt; nodeSetPreTransformedFromNodeOrStringVector(const Vector&lt;NodeOrString&gt;&amp; nodeOrStringVector)
</del><ins>+static HashSet&lt;RefPtr&lt;Node&gt;&gt; nodeSetPreTransformedFromNodeOrStringVector(const Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp; vector)
</ins><span class="cx"> {
</span><span class="cx">     HashSet&lt;RefPtr&lt;Node&gt;&gt; nodeSet;
</span><del>-    for (auto&amp; nodeOrString : nodeOrStringVector) {
-        switch (nodeOrString.type()) {
-        case NodeOrString::Type::String:
-            break;
-        case NodeOrString::Type::Node:
-            nodeSet.add(&amp;nodeOrString.node());
-            break;
-        }
-    }
</del><span class="cx"> 
</span><ins>+    auto visitor = WTF::makeVisitor(
+        [&amp;](const Ref&lt;Node&gt;&amp; node) { nodeSet.add(const_cast&lt;Node*&gt;(node.ptr())); },
+        [](const String&amp;) { }
+    );
+
+    for (const auto&amp; variant : vector)
+        std::visit(visitor, variant);
+
</ins><span class="cx">     return nodeSet;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -472,8 +470,35 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Node::before(Vector&lt;NodeOrString&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</del><ins>+RefPtr&lt;Node&gt; Node::convertNodesOrStringsIntoNode(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</ins><span class="cx"> {
</span><ins>+    if (nodeOrStringVector.isEmpty())
+        return nullptr;
+
+    Vector&lt;Ref&lt;Node&gt;&gt; nodes;
+    nodes.reserveInitialCapacity(nodeOrStringVector.size());
+
+    auto visitor = WTF::makeVisitor(
+        [&amp;](Ref&lt;Node&gt;&amp; node) { nodes.uncheckedAppend(node.copyRef()); },
+        [&amp;](String&amp; string) { nodes.uncheckedAppend(Text::create(document(), string)); }
+    );
+
+    for (auto&amp; variant : nodeOrStringVector)
+        std::visit(visitor, variant);
+
+    if (nodes.size() == 1)
+        return WTFMove(nodes.first());
+
+    auto nodeToReturn = DocumentFragment::create(document());
+    for (auto&amp; node : nodes) {
+        if (!nodeToReturn-&gt;appendChild(node, ec))
+            return nullptr;
+    }
+    return WTFMove(nodeToReturn);
+}
+
+void Node::before(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
+{
</ins><span class="cx">     RefPtr&lt;ContainerNode&gt; parent = parentNode();
</span><span class="cx">     if (!parent)
</span><span class="cx">         return;
</span><span class="lines">@@ -481,7 +506,7 @@
</span><span class="cx">     auto nodeSet = nodeSetPreTransformedFromNodeOrStringVector(nodeOrStringVector);
</span><span class="cx">     auto viablePreviousSibling = firstPrecedingSiblingNotInNodeSet(*this, nodeSet);
</span><span class="cx"> 
</span><del>-    auto node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+    auto node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx">     if (ec || !node)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -493,7 +518,7 @@
</span><span class="cx">     parent-&gt;insertBefore(*node, viablePreviousSibling.get(), ec);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Node::after(Vector&lt;NodeOrString&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</del><ins>+void Node::after(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;ContainerNode&gt; parent = parentNode();
</span><span class="cx">     if (!parent)
</span><span class="lines">@@ -502,7 +527,7 @@
</span><span class="cx">     auto nodeSet = nodeSetPreTransformedFromNodeOrStringVector(nodeOrStringVector);
</span><span class="cx">     auto viableNextSibling = firstFollowingSiblingNotInNodeSet(*this, nodeSet);
</span><span class="cx"> 
</span><del>-    auto node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+    auto node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx">     if (ec || !node)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -509,7 +534,7 @@
</span><span class="cx">     parent-&gt;insertBefore(*node, viableNextSibling.get(), ec);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Node::replaceWith(Vector&lt;NodeOrString&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</del><ins>+void Node::replaceWith(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;ContainerNode&gt; parent = parentNode();
</span><span class="cx">     if (!parent)
</span><span class="lines">@@ -518,7 +543,7 @@
</span><span class="cx">     auto nodeSet = nodeSetPreTransformedFromNodeOrStringVector(nodeOrStringVector);
</span><span class="cx">     auto viableNextSibling = firstFollowingSiblingNotInNodeSet(*this, nodeSet);
</span><span class="cx"> 
</span><del>-    auto node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+    auto node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx">     if (ec)
</span><span class="cx">         return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/Node.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include &lt;wtf/ListHashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/TypeCasts.h&gt;
</span><ins>+#include &lt;wtf/Variant.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> // This needs to be here because Document.h also depends on it.
</span><span class="cx"> #define DUMP_NODE_STATISTICS 0
</span><span class="lines">@@ -51,7 +52,6 @@
</span><span class="cx"> class NamedNodeMap;
</span><span class="cx"> class NodeList;
</span><span class="cx"> class NodeListsNodeData;
</span><del>-class NodeOrString;
</del><span class="cx"> class NodeRareData;
</span><span class="cx"> class QualifiedName;
</span><span class="cx"> class RenderBox;
</span><span class="lines">@@ -208,9 +208,9 @@
</span><span class="cx">     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&lt;NodeOrString&gt;&amp;&amp;, ExceptionCode&amp;);
-    void after(Vector&lt;NodeOrString&gt;&amp;&amp;, ExceptionCode&amp;);
-    void replaceWith(Vector&lt;NodeOrString&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    void before(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
+    void after(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
+    void replaceWith(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void remove(ExceptionCode&amp;);
</span><span class="cx"> 
</span><span class="cx">     // Other methods (not part of DOM)
</span><span class="lines">@@ -661,6 +661,8 @@
</span><span class="cx">     void setStyleChange(StyleChangeType changeType) { m_nodeFlags = (m_nodeFlags &amp; ~StyleChangeMask) | changeType; }
</span><span class="cx">     void updateAncestorsForStyleRecalc();
</span><span class="cx"> 
</span><ins>+    RefPtr&lt;Node&gt; convertNodesOrStringsIntoNode(Vector&lt;std::variant&lt;Ref&lt;Node&gt;, String&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
+
</ins><span class="cx"> private:
</span><span class="cx">     virtual PseudoId customPseudoId() const
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeOrStringcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/dom/NodeOrString.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/NodeOrString.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/NodeOrString.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,63 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;NodeOrString.h&quot;
-
-#include &quot;DocumentFragment.h&quot;
-#include &quot;Text.h&quot;
-
-namespace WebCore {
-
-RefPtr&lt;Node&gt; convertNodesOrStringsIntoNode(Node&amp; context, Vector&lt;NodeOrString&gt;&amp;&amp; nodeOrStringVector, ExceptionCode&amp; ec)
-{
-    if (nodeOrStringVector.isEmpty())
-        return nullptr;
-
-    Vector&lt;Ref&lt;Node&gt;&gt; nodes;
-    nodes.reserveInitialCapacity(nodeOrStringVector.size());
-    for (auto&amp; nodeOrString : nodeOrStringVector) {
-        switch (nodeOrString.type()) {
-        case NodeOrString::Type::String:
-            nodes.uncheckedAppend(Text::create(context.document(), nodeOrString.string()));
-            break;
-        case NodeOrString::Type::Node:
-            nodes.uncheckedAppend(nodeOrString.node());
-            break;
-        }
-    }
-
-    if (nodes.size() == 1)
-        return WTFMove(nodes.first());
-
-    auto nodeToReturn = DocumentFragment::create(context.document());
-    for (auto&amp; node : nodes) {
-        if (!nodeToReturn-&gt;appendChild(node, ec))
-            return nullptr;
-    }
-    return WTFMove(nodeToReturn);
-}
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoredomNodeOrStringh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/dom/NodeOrString.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/NodeOrString.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/NodeOrString.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,163 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef NodeOrString_h
-#define NodeOrString_h
-
-#include &quot;Node.h&quot;
-#include &lt;wtf/StdLibExtras.h&gt;
-#include &lt;wtf/Vector.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
-
-namespace WebCore {
-
-class NodeOrString {
-public:
-    enum class Type {
-        String,
-        Node
-    };
-
-    NodeOrString(const String&amp; string)
-        : m_type(Type::String)
-    {
-        m_data.string = string.impl();
-        m_data.string-&gt;ref();
-    }
-
-    NodeOrString(Node* node)
-        : m_type(Type::Node)
-    {
-        m_data.node = node;
-        m_data.node-&gt;ref();
-    }
-
-    NodeOrString(const NodeOrString&amp; other)
-        : m_type(other.m_type)
-    {
-        switch (m_type) {
-        case Type::String:
-            m_data.string = other.m_data.string;
-            m_data.string-&gt;ref();
-            break;
-        case Type::Node:
-            m_data.node = other.m_data.node;
-            m_data.node-&gt;ref();
-            break;
-        }
-    }
-
-    NodeOrString(NodeOrString&amp;&amp; other)
-        : m_type(other.m_type)
-    {
-        switch (m_type) {
-        case Type::String:
-            m_data.string = std::exchange(other.m_data.string, nullptr);
-            break;
-        case Type::Node:
-            m_data.node = std::exchange(other.m_data.node, nullptr);
-            break;
-        }
-    }
-
-    NodeOrString&amp; operator=(const NodeOrString&amp; other)
-    {
-        if (this == &amp;other)
-            return *this;
-
-        derefData();
-
-        m_type = other.m_type;
-        switch (m_type) {
-        case Type::String:
-            m_data.string = other.m_data.string;
-            m_data.string-&gt;ref();
-            break;
-        case Type::Node:
-            m_data.node = other.m_data.node;
-            m_data.node-&gt;ref();
-            break;
-        }
-
-        return *this;
-    }
-
-    NodeOrString&amp; operator=(NodeOrString&amp;&amp; other)
-    {
-        if (this == &amp;other)
-            return *this;
-
-        derefData();
-
-        m_type = other.m_type;
-        switch (m_type) {
-        case Type::String:
-            m_data.string = std::exchange(other.m_data.string, nullptr);
-            break;
-        case Type::Node:
-            m_data.node = std::exchange(other.m_data.node, nullptr);
-            break;
-        }
-
-        return *this;
-    }
-
-    ~NodeOrString()
-    {
-        derefData();
-    }
-
-    Type type() const { return m_type; }
-
-    Node&amp; node() const { ASSERT(m_type == Type::Node); ASSERT(m_data.node); return *m_data.node; }
-    StringImpl&amp; string() const { ASSERT(m_type == Type::String); ASSERT(m_data.string); return *m_data.string; }
-    
-private:
-    void derefData()
-    {
-        switch (m_type) {
-        case Type::String:
-            if (m_data.string)
-                m_data.string-&gt;deref();
-            break;
-        case Type::Node:
-            if (m_data.node)
-                m_data.node-&gt;deref();
-            break;
-        }
-    }
-
-    Type m_type;
-    union {
-        StringImpl* string;
-        Node* node;
-    } m_data;
-};
-
-RefPtr&lt;Node&gt; convertNodesOrStringsIntoNode(Node&amp; context, Vector&lt;NodeOrString&gt;&amp;&amp;, ExceptionCode&amp;);
-
-} // namespace WebCore
-
-#endif // NodeOrString_h
</del></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Tools/ChangeLog        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2016-08-06  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Replace NodeOrString with std::variant&lt;RefPtr&lt;Node&gt;, String&gt;
+        https://bugs.webkit.org/show_bug.cgi?id=160638
+
+        Reviewed by Anders Carlsson.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/Tests/WTF/Variant.cpp:
+        Add additional tests for the initial state of std::variant and using
+        makeVisitor for visiting.
+
</ins><span class="cx"> 2016-08-09  Aakash Jain  &lt;aakash_jain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         EWS logging should ensure the logging to file is stopped on queue termination
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPICMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/CMakeLists.txt (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/CMakeLists.txt        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Tools/TestWebKitAPI/CMakeLists.txt        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -76,6 +76,7 @@
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/StringView.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/TemporaryChange.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/UniqueRef.cpp
</span><ins>+    ${TESTWEBKITAPI_DIR}/Tests/WTF/Variant.cpp
</ins><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/Vector.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/WTFString.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/WeakPtr.cpp
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFVariantcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -26,26 +26,52 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Counters.h&quot;
</span><del>-#include &quot;MoveOnly.h&quot;
</del><span class="cx"> #include &quot;RefLogger.h&quot;
</span><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><ins>+#include &lt;wtf/StdLibExtras.h&gt;
</ins><span class="cx"> #include &lt;wtf/Variant.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace TestWebKitAPI {
</span><span class="cx"> 
</span><ins>+TEST(WTF_Variant, Initial)
+{
+    std::variant&lt;int, double&gt; v1;
+    EXPECT_TRUE(v1.index() == 0);
+    EXPECT_TRUE(std::get&lt;int&gt;(v1) == 0);
+
+    struct T {
+        T() : value(15) { }
+        int value;
+    };
+
+    std::variant&lt;T, int&gt; v2;
+    EXPECT_TRUE(v2.index() == 0);
+    EXPECT_TRUE(std::get&lt;T&gt;(v2).value == 15);
+}
+
</ins><span class="cx"> TEST(WTF_Variant, Basic)
</span><span class="cx"> {
</span><del>-    std::experimental::variant&lt;int, double&gt; variant = 1;
</del><ins>+    std::variant&lt;int, double&gt; variant = 1;
</ins><span class="cx">     EXPECT_TRUE(variant.index() == 0);
</span><del>-    EXPECT_TRUE(std::experimental::get&lt;int&gt;(variant) == 1);
</del><ins>+    EXPECT_TRUE(std::get&lt;int&gt;(variant) == 1);
+    EXPECT_TRUE(*std::get_if&lt;int&gt;(variant) == 1);
+    EXPECT_TRUE(std::get_if&lt;double&gt;(variant) == nullptr);
+    EXPECT_TRUE(std::holds_alternative&lt;int&gt;(variant));
+    EXPECT_FALSE(std::holds_alternative&lt;double&gt;(variant));
+
+    variant = 1.0;
+    EXPECT_TRUE(variant.index() == 1);
+    EXPECT_TRUE(std::get&lt;double&gt;(variant) == 1);
+    EXPECT_TRUE(*std::get_if&lt;double&gt;(variant) == 1.0);
+    EXPECT_TRUE(std::get_if&lt;int&gt;(variant) == nullptr);
+    EXPECT_TRUE(std::holds_alternative&lt;double&gt;(variant));
+    EXPECT_FALSE(std::holds_alternative&lt;int&gt;(variant));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(WTF_Variant, BasicVisitor)
</span><span class="cx"> {
</span><del>-    typedef std::experimental::variant&lt;int, float, String&gt; Variant;
-
</del><span class="cx">     enum class Type {
</span><span class="cx">         None,
</span><span class="cx">         Int,
</span><span class="lines">@@ -53,7 +79,6 @@
</span><span class="cx">         String,
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     struct Visitor {
</span><span class="cx">         Visitor(Type&amp; t)
</span><span class="cx">             : type(t)
</span><span class="lines">@@ -69,30 +94,60 @@
</span><span class="cx"> 
</span><span class="cx">     Type type = Type::None;
</span><span class="cx"> 
</span><del>-    Variant variant = 8;
-    std::experimental::visit(Visitor(type), variant);
</del><ins>+    std::variant&lt;int, float, String&gt; variant = 8;
+    std::visit(Visitor(type), variant);
</ins><span class="cx">     EXPECT_TRUE(Type::Int == type);
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     variant = 1.0f;
</span><del>-    std::experimental::visit(Visitor(type), variant);
</del><ins>+    std::visit(Visitor(type), variant);
</ins><span class="cx">     EXPECT_TRUE(Type::Float == type);
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     variant = &quot;hello&quot;;
</span><del>-    std::experimental::visit(Visitor(type), variant);
</del><ins>+    std::visit(Visitor(type), variant);
</ins><span class="cx">     EXPECT_TRUE(Type::String == type);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(WTF_Variant, VisitorUsingMakeVisitor)
+{
+    enum class Type {
+        None,
+        Int,
+        Float,
+        String,
+    };
+
+    Type type = Type::None;
+
+    auto visitor = WTF::makeVisitor(
+        [&amp;](int) { type = Type::Int; },
+        [&amp;](float) { type = Type::Float; },
+        [&amp;](String) { type = Type::String; }
+    );
+
+    std::variant&lt;int, float, String&gt; variant = 8;
+    std::visit(visitor, variant);
+    EXPECT_TRUE(Type::Int == type);
+
+
+    variant = 1.0f;
+    std::visit(visitor, variant);
+    EXPECT_TRUE(Type::Float == type);
+
+
+    variant = &quot;hello&quot;;
+    std::visit(visitor, variant);
+    EXPECT_TRUE(Type::String == type);
+}
+
</ins><span class="cx"> TEST(WTF_Variant, ConstructorDestructor)
</span><span class="cx"> {
</span><del>-    typedef std::experimental::variant&lt;std::unique_ptr&lt;ConstructorDestructorCounter&gt;, int&gt; Variant;

</del><span class="cx">     ConstructorDestructorCounter::TestingScope scope;
</span><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         auto uniquePtr = std::make_unique&lt;ConstructorDestructorCounter&gt;();
</span><del>-        Variant v = WTFMove(uniquePtr);
</del><ins>+        std::variant&lt;std::unique_ptr&lt;ConstructorDestructorCounter&gt;, int&gt; v = WTFMove(uniquePtr);
</ins><span class="cx"> 
</span><span class="cx">         EXPECT_EQ(1u, ConstructorDestructorCounter::constructionCount);
</span><span class="cx">         EXPECT_EQ(0u, ConstructorDestructorCounter::destructionCount);
</span><span class="lines">@@ -102,14 +157,12 @@
</span><span class="cx">     EXPECT_EQ(1u, ConstructorDestructorCounter::destructionCount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TEST(WTF_Variant, RefCounting)
</del><ins>+TEST(WTF_Variant, RefPtr)
</ins><span class="cx"> {
</span><del>-    typedef std::experimental::variant&lt;RefPtr&lt;RefLogger&gt;, int&gt; Variant;
-
</del><span class="cx">     {
</span><span class="cx">         RefLogger a(&quot;a&quot;);
</span><span class="cx">         RefPtr&lt;RefLogger&gt; ref(&amp;a);
</span><del>-        Variant v = ref;
</del><ins>+        std::variant&lt;RefPtr&lt;RefLogger&gt;, int&gt; v = ref;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT_STREQ(&quot;ref(a) ref(a) deref(a) deref(a) &quot;, takeLogStr().c_str());
</span><span class="lines">@@ -117,10 +170,21 @@
</span><span class="cx">     {
</span><span class="cx">         RefLogger a(&quot;a&quot;);
</span><span class="cx">         RefPtr&lt;RefLogger&gt; ref(&amp;a);
</span><del>-        Variant v = WTFMove(ref);
</del><ins>+        std::variant&lt;RefPtr&lt;RefLogger&gt;, int&gt; v = WTFMove(ref);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT_STREQ(&quot;ref(a) deref(a) &quot;, takeLogStr().c_str());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(WTF_Variant, Ref)
+{
+    {
+        RefLogger a(&quot;a&quot;);
+        Ref&lt;RefLogger&gt; ref(a);
+        std::variant&lt;Ref&lt;RefLogger&gt;, int&gt; v = WTFMove(ref);
+    }
+
+    ASSERT_STREQ(&quot;ref(a) deref(a) &quot;, takeLogStr().c_str());
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre>
</div>
</div>

</body>
</html>