OLD | NEW |
1 function create_window_in_test(t, srcdoc) { | 1 function create_window_in_test(t, srcdoc) { |
2 let p = new Promise((resolve) => { | 2 let p = new Promise((resolve) => { |
3 let f = document.createElement('iframe'); | 3 let f = document.createElement('iframe'); |
4 f.srcdoc = srcdoc ? srcdoc : ''; | 4 f.srcdoc = srcdoc ? srcdoc : ''; |
5 f.onload = (event) => { | 5 f.onload = (event) => { |
6 let w = f.contentWindow; | 6 let w = f.contentWindow; |
7 t.add_cleanup(() => f.parentNode && f.remove()); | 7 t.add_cleanup(() => f.parentNode && f.remove()); |
8 resolve(w); | 8 resolve(w); |
9 }; | 9 }; |
10 document.body.appendChild(f); | 10 document.body.appendChild(f); |
11 }); | 11 }); |
12 return p; | 12 return p; |
13 } | 13 } |
14 | 14 |
15 function test_with_window(f, name, srcdoc) { | 15 function test_with_window(f, name, srcdoc) { |
16 promise_test((t) => { | 16 promise_test((t) => { |
17 return create_window_in_test(t, srcdoc) | 17 return create_window_in_test(t, srcdoc) |
18 .then((w) => { | 18 .then((w) => { |
19 f(w); | 19 f(w); |
20 }); | 20 }); |
21 }, name); | 21 }, name); |
22 } | 22 } |
| 23 |
| 24 function create_attribute_changed_callback_log(element, name, oldValue, newValue
, namespace) { |
| 25 return { |
| 26 type: 'attributeChanged', |
| 27 element: element, |
| 28 name: name, |
| 29 namespace: namespace, |
| 30 oldValue: oldValue, |
| 31 newValue: newValue, |
| 32 actualValue: element.getAttributeNS(namespace, name) |
| 33 }; |
| 34 } |
| 35 |
| 36 function assert_attribute_log_entry(log, expected) { |
| 37 assert_equals(log.type, 'attributeChanged'); |
| 38 assert_equals(log.name, expected.name); |
| 39 assert_equals(log.oldValue, expected.oldValue); |
| 40 assert_equals(log.newValue, expected.newValue); |
| 41 assert_equals(log.actualValue, expected.newValue); |
| 42 assert_equals(log.namespace, expected.namespace); |
| 43 } |
| 44 |
| 45 |
| 46 function define_new_custom_element(observedAttributes) { |
| 47 let log = []; |
| 48 let name = 'custom-element-' + define_new_custom_element._element_number++; |
| 49 |
| 50 class CustomElement extends HTMLElement { |
| 51 constructor() { |
| 52 super(); |
| 53 log.push({type: 'constructed', element: this}); |
| 54 } |
| 55 attributeChangedCallback(...args) { |
| 56 log.push(create_attribute_changed_callback_log(this, ...args)); |
| 57 } |
| 58 connectedCallback() { log.push({type: 'connected', element: this}); } |
| 59 disconnectedCallback() { log.push({type: 'disconnected', element: this})
; } |
| 60 adoptedCallback(oldDocument, newDocument) { log.push({type: 'adopted', e
lement: this, oldDocument: oldDocument, newDocument: newDocument}); } |
| 61 } |
| 62 CustomElement.observedAttributes = observedAttributes; |
| 63 |
| 64 customElements.define(name, CustomElement); |
| 65 |
| 66 return { |
| 67 name: name, |
| 68 takeLog: function () { |
| 69 let currentLog = log; log = []; |
| 70 currentLog.types = () => currentLog.map((entry) => entry.type); |
| 71 currentLog.last = () => currentLog[currentLog.length - 1]; |
| 72 return currentLog; |
| 73 } |
| 74 }; |
| 75 } |
| 76 define_new_custom_element._element_number = 1; |
| 77 |
| 78 function document_types() { |
| 79 return [ |
| 80 { |
| 81 name: 'the document', |
| 82 create: function () { return Promise.resolve(document); }, |
| 83 isOwner: true, |
| 84 hasBrowsingContext: true, |
| 85 }, |
| 86 { |
| 87 name: 'the document of the template elements', |
| 88 create: function () { |
| 89 return new Promise(function (resolve) { |
| 90 var template = document.createElementNS('http://www.w3.org/1
999/xhtml', 'template'); |
| 91 var doc = template.content.ownerDocument; |
| 92 if (!doc.documentElement) |
| 93 doc.appendChild(doc.createElement('html')); |
| 94 resolve(doc); |
| 95 }); |
| 96 }, |
| 97 hasBrowsingContext: false, |
| 98 }, |
| 99 { |
| 100 name: 'a new document', |
| 101 create: function () { |
| 102 return new Promise(function (resolve) { |
| 103 var doc = new Document(); |
| 104 doc.appendChild(doc.createElement('html')); |
| 105 resolve(doc); |
| 106 }); |
| 107 }, |
| 108 hasBrowsingContext: false, |
| 109 }, |
| 110 { |
| 111 name: 'a cloned document', |
| 112 create: function () { |
| 113 return new Promise(function (resolve) { |
| 114 var doc = document.cloneNode(false); |
| 115 doc.appendChild(doc.createElement('html')); |
| 116 resolve(doc); |
| 117 }); |
| 118 }, |
| 119 hasBrowsingContext: false, |
| 120 }, |
| 121 { |
| 122 name: 'a document created by createHTMLDocument', |
| 123 create: function () { |
| 124 return Promise.resolve(document.implementation.createHTMLDocumen
t()); |
| 125 }, |
| 126 hasBrowsingContext: false, |
| 127 }, |
| 128 { |
| 129 name: 'an HTML document created by createDocument', |
| 130 create: function () { |
| 131 return Promise.resolve(document.implementation.createDocument('h
ttp://www.w3.org/1999/xhtml', 'html', null)); |
| 132 }, |
| 133 hasBrowsingContext: false, |
| 134 }, |
| 135 { |
| 136 name: 'the document of an iframe', |
| 137 create: function () { |
| 138 return new Promise(function (resolve, reject) { |
| 139 var iframe = document.createElement('iframe'); |
| 140 iframe.onload = function () { resolve(iframe.contentDocument
); } |
| 141 iframe.onerror = function () { reject('Failed to load an emp
ty iframe'); } |
| 142 document.body.appendChild(iframe); |
| 143 }); |
| 144 }, |
| 145 hasBrowsingContext: true, |
| 146 }, |
| 147 { |
| 148 name: 'an HTML document fetched by XHR', |
| 149 create: function () { |
| 150 return new Promise(function (resolve, reject) { |
| 151 var xhr = new XMLHttpRequest(); |
| 152 xhr.open('GET', 'resources/empty-html-document.html'); |
| 153 xhr.overrideMimeType('text/xml'); |
| 154 xhr.onload = function () { resolve(xhr.responseXML); } |
| 155 xhr.onerror = function () { reject('Failed to fetch the docu
ment'); } |
| 156 xhr.send(); |
| 157 }); |
| 158 }, |
| 159 hasBrowsingContext: false, |
| 160 } |
| 161 ]; |
| 162 } |
OLD | NEW |