<!DOCTYPE html>
<html>
<!--
Test adapted from https://mxr.mozilla.org/chromium/source/src/third_party/WebKit/LayoutTests/fast/dom/TreeWalker/resources/TreeWalker-currentNode.js
-->
<head>
<title>TreeWalker: currentNode</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="traversal-support.js"></script>
<link rel="stylesheet" href="/resources/testharness.css">
<div id=log></div>
</head>
<body>
<div id='parent'>
<div id='subTree'><p>Lorem ipsum <span>dolor <b>sit</b> amet</span>, consectetur <i>adipisicing</i> elit, sed do eiusmod <tt>tempor <b><i>incididunt ut</i> labore</b> et dolore magna</tt> aliqua.</p></div>
</div>
<p>Test TreeWalker currentNode functionality</p>
<script>
// var subTree = document.createElement('div');
// subTree.innerHTML = "<p>Lorem ipsum <span>dolor <b>sit</b> amet</span>, consectetur <i>adipisicing</i> elit, sed do eiusmod <tt>tempor <b><i>incididunt ut</i> labore</b> et dolore magna</tt> aliqua.</p>"
// document.body.appendChild(subTree);
var subTree = document.getElementById("subTree");

var all = function(node) { return true; }

test(function()
{
    var w = document.createTreeWalker(subTree, NodeFilter.SHOW_ELEMENT, all);
    assert_node(w.currentNode, { type: Element, id: 'subTree' });
    assert_equals(w.parentNode(), null);
    assert_node(w.currentNode, { type: Element, id: 'subTree' });
}, "Test that TreeWalker.parent() doesn't set the currentNode to a node not under the root.");

test(function()
{
    var w = document.createTreeWalker(subTree,
                                      NodeFilter.SHOW_ELEMENT
                                      | NodeFilter.SHOW_COMMENT,
                                      all);
    w.currentNode = document.documentElement;
    assert_equals(w.parentNode(), null);
    assert_equals(w.currentNode, document.documentElement);
    w.currentNode = document.documentElement;
    assert_equals(w.nextNode(), document.documentElement.firstChild);
    assert_equals(w.currentNode, document.documentElement.firstChild);
    w.currentNode = document.documentElement;
    assert_equals(w.previousNode(), null);
    assert_equals(w.currentNode, document.documentElement);
    w.currentNode = document.documentElement;
    assert_equals(w.firstChild(), document.documentElement.firstChild);
    assert_equals(w.currentNode, document.documentElement.firstChild);
    w.currentNode = document.documentElement;
    assert_equals(w.lastChild(), document.documentElement.lastChild);
    assert_equals(w.currentNode, document.documentElement.lastChild);
    w.currentNode = document.documentElement;
    assert_equals(w.nextSibling(), null);
    assert_equals(w.currentNode, document.documentElement);
    w.currentNode = document.documentElement;
    assert_equals(w.previousSibling(), null);
    assert_equals(w.currentNode, document.documentElement);
}, "Test that we handle setting the currentNode to arbitrary nodes not under the root element.");

test(function()
{
    var w = document.createTreeWalker(subTree, NodeFilter.SHOW_ELEMENT, all);
    w.currentNode = subTree.previousSibling;
    assert_equals(w.nextNode(), subTree);
    w.currentNode = document.getElementById("parent");
    assert_equals(w.firstChild(), subTree);
}, "Test how we handle the case when the traversed to node is within the root, but the currentElement is not.");
</script>
</body>
</html>
