Index: third_party/WebKit/LayoutTests/imported/wpt/custom-elements/resources/custom-elements-helpers.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/resources/custom-elements-helpers.js b/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/resources/custom-elements-helpers.js |
index 0dfbd6363b22ed36fdf7c9106af3b19c5bf7d503..63fb98b4356cdd716c143030099ad3c2068aa087 100644 |
--- a/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/resources/custom-elements-helpers.js |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/resources/custom-elements-helpers.js |
@@ -20,3 +20,143 @@ function test_with_window(f, name, srcdoc) { |
}); |
}, name); |
} |
+ |
+function create_attribute_changed_callback_log(element, name, oldValue, newValue, namespace) { |
+ return { |
+ type: 'attributeChanged', |
+ element: element, |
+ name: name, |
+ namespace: namespace, |
+ oldValue: oldValue, |
+ newValue: newValue, |
+ actualValue: element.getAttributeNS(namespace, name) |
+ }; |
+} |
+ |
+function assert_attribute_log_entry(log, expected) { |
+ assert_equals(log.type, 'attributeChanged'); |
+ assert_equals(log.name, expected.name); |
+ assert_equals(log.oldValue, expected.oldValue); |
+ assert_equals(log.newValue, expected.newValue); |
+ assert_equals(log.actualValue, expected.newValue); |
+ assert_equals(log.namespace, expected.namespace); |
+} |
+ |
+ |
+function define_new_custom_element(observedAttributes) { |
+ let log = []; |
+ let name = 'custom-element-' + define_new_custom_element._element_number++; |
+ |
+ class CustomElement extends HTMLElement { |
+ constructor() { |
+ super(); |
+ log.push({type: 'constructed', element: this}); |
+ } |
+ attributeChangedCallback(...args) { |
+ log.push(create_attribute_changed_callback_log(this, ...args)); |
+ } |
+ connectedCallback() { log.push({type: 'connected', element: this}); } |
+ disconnectedCallback() { log.push({type: 'disconnected', element: this}); } |
+ adoptedCallback(oldDocument, newDocument) { log.push({type: 'adopted', element: this, oldDocument: oldDocument, newDocument: newDocument}); } |
+ } |
+ CustomElement.observedAttributes = observedAttributes; |
+ |
+ customElements.define(name, CustomElement); |
+ |
+ return { |
+ name: name, |
+ takeLog: function () { |
+ let currentLog = log; log = []; |
+ currentLog.types = () => currentLog.map((entry) => entry.type); |
+ currentLog.last = () => currentLog[currentLog.length - 1]; |
+ return currentLog; |
+ } |
+ }; |
+} |
+define_new_custom_element._element_number = 1; |
+ |
+function document_types() { |
+ return [ |
+ { |
+ name: 'the document', |
+ create: function () { return Promise.resolve(document); }, |
+ isOwner: true, |
+ hasBrowsingContext: true, |
+ }, |
+ { |
+ name: 'the document of the template elements', |
+ create: function () { |
+ return new Promise(function (resolve) { |
+ var template = document.createElementNS('http://www.w3.org/1999/xhtml', 'template'); |
+ var doc = template.content.ownerDocument; |
+ if (!doc.documentElement) |
+ doc.appendChild(doc.createElement('html')); |
+ resolve(doc); |
+ }); |
+ }, |
+ hasBrowsingContext: false, |
+ }, |
+ { |
+ name: 'a new document', |
+ create: function () { |
+ return new Promise(function (resolve) { |
+ var doc = new Document(); |
+ doc.appendChild(doc.createElement('html')); |
+ resolve(doc); |
+ }); |
+ }, |
+ hasBrowsingContext: false, |
+ }, |
+ { |
+ name: 'a cloned document', |
+ create: function () { |
+ return new Promise(function (resolve) { |
+ var doc = document.cloneNode(false); |
+ doc.appendChild(doc.createElement('html')); |
+ resolve(doc); |
+ }); |
+ }, |
+ hasBrowsingContext: false, |
+ }, |
+ { |
+ name: 'a document created by createHTMLDocument', |
+ create: function () { |
+ return Promise.resolve(document.implementation.createHTMLDocument()); |
+ }, |
+ hasBrowsingContext: false, |
+ }, |
+ { |
+ name: 'an HTML document created by createDocument', |
+ create: function () { |
+ return Promise.resolve(document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null)); |
+ }, |
+ hasBrowsingContext: false, |
+ }, |
+ { |
+ name: 'the document of an iframe', |
+ create: function () { |
+ return new Promise(function (resolve, reject) { |
+ var iframe = document.createElement('iframe'); |
+ iframe.onload = function () { resolve(iframe.contentDocument); } |
+ iframe.onerror = function () { reject('Failed to load an empty iframe'); } |
+ document.body.appendChild(iframe); |
+ }); |
+ }, |
+ hasBrowsingContext: true, |
+ }, |
+ { |
+ name: 'an HTML document fetched by XHR', |
+ create: function () { |
+ return new Promise(function (resolve, reject) { |
+ var xhr = new XMLHttpRequest(); |
+ xhr.open('GET', 'resources/empty-html-document.html'); |
+ xhr.overrideMimeType('text/xml'); |
+ xhr.onload = function () { resolve(xhr.responseXML); } |
+ xhr.onerror = function () { reject('Failed to fetch the document'); } |
+ xhr.send(); |
+ }); |
+ }, |
+ hasBrowsingContext: false, |
+ } |
+ ]; |
+} |