[Shadow DOM] Extend a 'path' notation in utility function so that we can specify...
[WebKit-https.git] / LayoutTests / fast / dom / shadow / resources / shadow-dom.js
1 function createShadowRoot()
2 {
3     return {'isShadowRoot': true,
4             'children': Array.prototype.slice.call(arguments)};
5 }
6
7 // This function can take optional child elements, which might be a result of createShadowRoot(), as arguments[2:].
8 function createDOM(tagName, attributes)
9 {
10     var element = document.createElement(tagName);
11     for (var name in attributes)
12         element.setAttribute(name, attributes[name]);
13     var childElements = Array.prototype.slice.call(arguments, 2);
14     for (var i = 0; i < childElements.length; ++i) {
15         var child = childElements[i];
16         if (child.isShadowRoot) {
17             var shadowRoot;
18             if (window.WebKitShadowRoot)
19               shadowRoot = new WebKitShadowRoot(element);
20             else
21               shadowRoot = internals.ensureShadowRoot(element);
22             for (var j = 0; j < child.children.length; ++j)
23                 shadowRoot.appendChild(child.children[j]);
24         } else
25             element.appendChild(child);
26     }
27     return element;
28 }
29
30 function isShadowRoot(node)
31 {
32     // FIXME: window.internals should have internals.isShadowRoot(node).
33     return node.host;
34 }
35
36 // You can spefify youngerShadowRoot by consecutive slashes.
37 // See LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-root.html for actual usages.
38 function getElementInShadowTreeStack(path)
39 {
40     var ids = path.split('/');
41     var node = document.getElementById(ids[0]);
42     for (var i = 1; node != null && i < ids.length; ++i) {
43         if (isShadowRoot(node))
44             node = internals.youngerShadowRoot(node);
45         else
46             node = internals.oldestShadowRoot(node);
47         if (ids[i] != '')
48             node = internals.getElementByIdInShadowRoot(node, ids[i]);
49     }
50     return node;
51 }
52