CustomElements: adoptedCallback should be invoked in tree order

3.3 For each inclusiveDescendant in node’s shadow-including inclusive
    descendants, in shadow-including tree order, run the adopting steps
    with inclusiveDescendant and oldDocument.

BUG=594918

Review-Url: https://codereview.chromium.org/2247663002
Cr-Commit-Position: refs/heads/master@{#412167}
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/adopt-node.html b/third_party/WebKit/LayoutTests/custom-elements/spec/adopt-node.html
index 4ef1a13..023fb83 100644
--- a/third_party/WebKit/LayoutTests/custom-elements/spec/adopt-node.html
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/adopt-node.html
@@ -8,7 +8,7 @@
 <script>
 'use strict'
 
-// 3.2 For each inclusiveDescendant in node’s shadow-including inclusive descendants that is a custom 
+// 3.2 For each inclusiveDescendant in node’s shadow-including inclusive descendants that is a custom
 // element, enqueue a custom element callback reaction with inclusiveDescendant,
 // callback name "adoptedCallback", and an empty argument list.
 promise_test((t) => {
@@ -26,5 +26,32 @@
       assert_array_equals_callback_invocations(invocations, [ ['adopted', a, []] ]);
     });
 }, 'adopting a custom element to the different document should enqueue an adoptedCallback reaction');
+
+// 3.3 For each inclusiveDescendant in node’s shadow-including inclusive descendants, in
+// shadow-including tree order, run the adopting steps with inclusiveDescendant and oldDocument.
+promise_test((t) => {
+  return Promise.all([
+    create_window_in_test(t),
+    create_window_in_test(t)])
+    .then(([w1, w2]) => {
+      w1.document.body.innerHTML = `
+      <a-a id="a">
+        <p>
+          <a-a id="b"></a-a>
+          <a-a id="c"></a-a>
+        </p>
+        <a-a id="d"></a-a>
+      </a-a>`;
+      let invocations = [];
+      class X extends w1.HTMLElement {
+        adoptedCallback() { invocations.push(this); }
+      }
+      w1.customElements.define('a-a', X);
+      let a = w1.document.getElementById("a");
+      w2.document.adoptNode(a);
+      assert_array_equals(['a', 'b', 'c', 'd'], invocations.map((e) => e.id),
+                      'four elements should have been removed in doc order');
+    });
+}, 'shadow-including inclusive descendants should be adopted in shadow-including tree order');
 </script>
 </body>