| <!DOCTYPE html> |
| <script src='../resources/testharness.js'></script> |
| <script src='../resources/testharnessreport.js'></script> |
| <script> |
| 'use strict'; |
| |
| const safelist = ['custom-element', |
| 'article', 'aside', 'blockquote', 'body', 'div', 'footer', |
| 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', |
| 'header', 'main', 'nav', 'p', 'section', 'span']; |
| |
| test(() => { |
| safelist.forEach((tag) => { |
| ['open', 'closed'].forEach((mode) => { |
| try { |
| const sr = document.createElement(tag).attachShadow({mode: mode}); |
| assert_true(sr instanceof ShadowRoot, "attachShadow is supported for " + tag); |
| } catch (e) { |
| assert_unreached("attachShadow is not supported for " + tag); |
| } |
| }); |
| }); |
| }, 'attachShadow should not fail for an element in the safelist'); |
| |
| test(() => { |
| // Retrieve possible tag names from window object's own property names |
| Object.getOwnPropertyNames(window).forEach((p) => { |
| const res = /^HTML(.*)Element$/.exec(p); |
| if (!res) |
| return; |
| const maybeTagName = res[1].toLowerCase(); |
| if (safelist.includes(maybeTagName) || maybeTagName.indexOf('-') != -1) |
| return; |
| var element; |
| try { |
| element = document.createElement(maybeTagName); |
| } catch (e) { |
| // Okay to ignore when document.createElement fails |
| return; |
| } |
| ['open', 'closed'].forEach((mode) => { |
| assert_throws_dom('NotSupportedError', () => { |
| element.attachShadow({mode: mode}); |
| }), 'attachShadow should throw NotSupportdeError for ' + maybeTagName; |
| }); |
| }); |
| }, 'attachShadow should throw an exception for an element which is not in the safelist'); |
| |
| test(() => { |
| class XFoo extends HTMLElement { |
| constructor() { |
| super(); |
| } |
| } |
| window.customElements.define('x-foo', XFoo); |
| assert_true(new XFoo().attachShadow({mode: 'open'}) instanceof ShadowRoot); |
| }, 'attachShadow should not fail for Custom Elements v1.'); |
| </script> |