| <!DOCTYPE html> |
| <script src="../../../resources/testharness.js"></script> |
| <script src="../../../resources/testharnessreport.js"></script> |
| |
| <template id="template"> |
| <svg> |
| <defs> |
| <g id="used-group"> |
| <rect |
| id="rect" |
| is="x-rect" |
| x="10" y="10" |
| width="100" height="100" |
| fill="red"/> |
| </g> |
| </defs> |
| <use xlink:href="#used-group"/> |
| </svg> |
| </template> |
| |
| <div id="container"></div> |
| |
| <script> |
| "use strict"; |
| |
| var instances = []; |
| |
| function createPrototype(superClass) { |
| class ElementType extends superClass { |
| get ownerScope() { |
| var scope = this.parentNode; |
| while (scope && scope.parentNode) |
| scope = scope.parentNode; |
| return scope; |
| } |
| createdCallback() { |
| this.instanceId = instances.length; |
| instances[this.instanceId] = this; |
| assert_false(this.ownerScope instanceof ShadowRoot, |
| "Should not call createdCallback in UA ShadowRoot."); |
| } |
| attachedCallback() { |
| assert_false(this.ownerScope instanceof ShadowRoot, |
| "Should not call attachedCallback in UA ShadowRoot."); |
| assert_equals(instances[this.instanceId], this); |
| } |
| detachedCallback() { |
| assert_false(this.ownerScope instanceof ShadowRoot, |
| "Should not call detachedCallback in UA ShadowRoot."); |
| assert_equals(instances[this.instanceId], this); |
| } |
| attributeChangedCallback() { |
| assert_unreached("attributeChangedCallback should never be called."); |
| } |
| }; |
| return ElementType.prototype; |
| } |
| |
| // <rect is=x-rect> |
| var XRectElement = document.registerElement('x-rect', { |
| extends: 'rect', |
| prototype: createPrototype(SVGRectElement), |
| }); |
| |
| // <x-test> |
| var XTestElement = document.registerElement('x-test', { |
| prototype: createPrototype(HTMLElement), |
| }); |
| |
| test(function () { |
| var template = document.getElementById("template"); |
| var svg = document.importNode(template.content, true).firstElementChild; |
| var usedGroup = svg.getElementById("used-group"); |
| document.body.appendChild(svg); |
| |
| // Force a recreation of the use trees. |
| document.body.offsetTop; |
| assert_array_equals([usedGroup.firstElementChild], instances); |
| |
| var elements = [ |
| usedGroup.firstElementChild, |
| new XRectElement(), |
| new XTestElement(), |
| new XRectElement(), |
| ]; |
| |
| // Add another <rect is=x-rect>, and a child <x-test> that also contains one. |
| usedGroup.appendChild(elements[1]); |
| var test = usedGroup.appendChild(elements[2]); |
| test.appendChild(elements[3]); |
| |
| // Force a recreation of the use trees. |
| document.body.offsetTop; |
| assert_array_equals(elements, instances); |
| |
| for (var i = 0; i < instances.length; ++i) { |
| assert_true(instances[i].ownerScope instanceof Document, |
| "No instances should be inside a ShadowRoot."); |
| } |
| }, "SVG <use> shadow trees should not be exposed through custom elements."); |
| </script> |