diff options
author | Ms2ger <Ms2ger@gmail.com> | 2016-12-28 09:51:21 +0100 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2016-12-28 11:34:21 +0100 |
commit | d6ba94ca281bdcc53679e95b28b185e8e6284bc2 (patch) | |
tree | 3f5a249db2324edd2e54e77394bf843767468a19 | |
parent | 81ca858678953105ee97f482eb3900729fa4d696 (diff) | |
download | servo-d6ba94ca281bdcc53679e95b28b185e8e6284bc2.tar.gz servo-d6ba94ca281bdcc53679e95b28b185e8e6284bc2.zip |
Update web-platform-tests to revision 3137d1d2d7757366a69f8a449b458b5057e0e81e
2348 files changed, 89582 insertions, 9636 deletions
diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.operation.clear.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.operation.clear.html.ini new file mode 100644 index 00000000000..8ddda3e4602 --- /dev/null +++ b/tests/wpt/metadata/2dcontext/compositing/2d.composite.operation.clear.html.ini @@ -0,0 +1,5 @@ +[2d.composite.operation.clear.html] + type: testharness + [Canvas test: 2d.composite.operation.clear] + expected: FAIL + diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini new file mode 100644 index 00000000000..fd39e5a9200 --- /dev/null +++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini @@ -0,0 +1,5 @@ +[2d.drawImage.zerocanvas.html] + type: testharness + [Canvas test: 2d.drawImage.zerocanvas] + expected: FAIL + diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html.ini new file mode 100644 index 00000000000..c5c6c54bdb1 --- /dev/null +++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html.ini @@ -0,0 +1,5 @@ +[2d.drawImage.zerosource.html] + type: testharness + [drawImage with zero-sized source rectangle draws nothing without exception] + expected: FAIL + diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 11844dae048..b5300424b2e 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -98,8 +98,8 @@ "url": "/XMLHttpRequest/send-authentication-prompt-manual.htm" }, { - "path": "ambient-light/AmbientLightSensor_onchange-manual.html", - "url": "/ambient-light/AmbientLightSensor_onchange-manual.html" + "path": "ambient-light/AmbientLightSensor_onerror-manual.https.html", + "url": "/ambient-light/AmbientLightSensor_onerror-manual.https.html" }, { "path": "annotation-model/annotations/annotationMusts-manual.html", @@ -134,6 +134,34 @@ "url": "/annotation-protocol/server/server-manual.html" }, { + "path": "annotation-vocab/01-validJSON-LD-manual.html", + "url": "/annotation-vocab/01-validJSON-LD-manual.html" + }, + { + "path": "annotation-vocab/02-context-to-triples-manual.html", + "url": "/annotation-vocab/02-context-to-triples-manual.html" + }, + { + "path": "annotation-vocab/03-graphs-are-isomorphic-manual.html", + "url": "/annotation-vocab/03-graphs-are-isomorphic-manual.html" + }, + { + "path": "annotation-vocab/04-graphs-convert-lossless-manual.html", + "url": "/annotation-vocab/04-graphs-convert-lossless-manual.html" + }, + { + "path": "annotation-vocab/05-ontology-parsed-as-valid-manual.html", + "url": "/annotation-vocab/05-ontology-parsed-as-valid-manual.html" + }, + { + "path": "annotation-vocab/06-ontology-internally-consistent-manual.html", + "url": "/annotation-vocab/06-ontology-internally-consistent-manual.html" + }, + { + "path": "auxclick/auxclick_event-manual.html", + "url": "/auxclick/auxclick_event-manual.html" + }, + { "path": "battery-status/battery-charging-manual.html", "url": "/battery-status/battery-charging-manual.html" }, @@ -158,6 +186,14 @@ "url": "/fullscreen/api/document-exit-fullscreen-manual.html" }, { + "path": "fullscreen/api/document-exit-fullscreen-timing-manual.html", + "url": "/fullscreen/api/document-exit-fullscreen-timing-manual.html" + }, + { + "path": "fullscreen/api/document-exit-fullscreen-twice-manual.html", + "url": "/fullscreen/api/document-exit-fullscreen-twice-manual.html" + }, + { "path": "fullscreen/api/document-fullscreen-element-manual.html", "url": "/fullscreen/api/document-fullscreen-element-manual.html" }, @@ -190,6 +226,26 @@ "url": "/fullscreen/api/element-ready-check-not-in-document-manual.html" }, { + "path": "fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html" + }, + { + "path": "fullscreen/api/element-request-fullscreen-and-move-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-and-move-manual.html" + }, + { + "path": "fullscreen/api/element-request-fullscreen-and-move-to-iframe-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-and-move-to-iframe-manual.html" + }, + { + "path": "fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html" + }, + { + "path": "fullscreen/api/element-request-fullscreen-and-remove-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-and-remove-manual.html" + }, + { "path": "fullscreen/api/element-request-fullscreen-manual.html", "url": "/fullscreen/api/element-request-fullscreen-manual.html" }, @@ -198,6 +254,10 @@ "url": "/fullscreen/api/element-request-fullscreen-non-top-manual.html" }, { + "path": "fullscreen/api/element-request-fullscreen-same-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-same-manual.html" + }, + { "path": "fullscreen/api/element-request-fullscreen-svg-rect-manual.html", "url": "/fullscreen/api/element-request-fullscreen-svg-rect-manual.html" }, @@ -206,10 +266,26 @@ "url": "/fullscreen/api/element-request-fullscreen-svg-svg-manual.html" }, { + "path": "fullscreen/api/element-request-fullscreen-timing-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-timing-manual.html" + }, + { "path": "fullscreen/api/element-request-fullscreen-top-manual.html", "url": "/fullscreen/api/element-request-fullscreen-top-manual.html" }, { + "path": "fullscreen/api/element-request-fullscreen-twice-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-twice-manual.html" + }, + { + "path": "fullscreen/api/element-request-fullscreen-two-elements-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-two-elements-manual.html" + }, + { + "path": "fullscreen/api/element-request-fullscreen-two-iframes-manual.html", + "url": "/fullscreen/api/element-request-fullscreen-two-iframes-manual.html" + }, + { "path": "fullscreen/model/remove-child-manual.html", "url": "/fullscreen/model/remove-child-manual.html" }, @@ -362,6 +438,10 @@ "url": "/html-media-capture/capture_audio_cancel-manual.html" }, { + "path": "html-media-capture/capture_fallback_file_upload-manual.html", + "url": "/html-media-capture/capture_fallback_file_upload-manual.html" + }, + { "path": "html-media-capture/capture_image-manual.html", "url": "/html-media-capture/capture_image-manual.html" }, @@ -810,6 +890,14 @@ "url": "/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrollamount-effect-manual.html" }, { + "path": "html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start-manual.html", + "url": "/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start-manual.html" + }, + { + "path": "html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop-manual.html", + "url": "/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop-manual.html" + }, + { "path": "html/semantics/embedded-content/media-elements/audio_controls_present-manual.html", "url": "/html/semantics/embedded-content/media-elements/audio_controls_present-manual.html" }, @@ -1182,6 +1270,10 @@ "url": "/pointerevents/pointerevent_attributes_nohover_pointers-manual.html" }, { + "path": "pointerevents/pointerevent_boundary_events_in_capturing-manual.html", + "url": "/pointerevents/pointerevent_boundary_events_in_capturing-manual.html" + }, + { "path": "pointerevents/pointerevent_capture_mouse-manual.html", "url": "/pointerevents/pointerevent_capture_mouse-manual.html" }, @@ -1202,10 +1294,6 @@ "url": "/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html" }, { - "path": "pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html", - "url": "/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html" - }, - { "path": "pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html", "url": "/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html" }, @@ -1294,6 +1382,14 @@ "url": "/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html" }, { + "path": "pointerevents/pointerevent_sequence_at_implicit_release_on_click-manual.html", + "url": "/pointerevents/pointerevent_sequence_at_implicit_release_on_click-manual.html" + }, + { + "path": "pointerevents/pointerevent_sequence_at_implicit_release_on_drag-manual.html", + "url": "/pointerevents/pointerevent_sequence_at_implicit_release_on_drag-manual.html" + }, + { "path": "pointerevents/pointerevent_setpointercapture_disconnected-manual.html", "url": "/pointerevents/pointerevent_setpointercapture_disconnected-manual.html" }, @@ -1450,6 +1546,10 @@ "url": "/pointerlock/pointerlock_shadow-manual.html" }, { + "path": "presentation-api/controlling-ua/PresentationAvailability_onchange-manual.html", + "url": "/presentation-api/controlling-ua/PresentationAvailability_onchange-manual.html" + }, + { "path": "presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html", "url": "/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html" }, @@ -4208,46 +4308,6 @@ "url": "/content-security-policy/font-src/font-whitelisted.html" }, { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html" - }, - { "path": "html/dom/elements/global-attributes/dir_auto-EN-L.html", "references": [ [ @@ -12652,6 +12712,10 @@ "url": "/IndexedDB/cursor-overloads.htm" }, { + "path": "IndexedDB/historical.html", + "url": "/IndexedDB/historical.html" + }, + { "path": "IndexedDB/idb_binary_key_conversion.htm", "url": "/IndexedDB/idb_binary_key_conversion.htm" }, @@ -13584,6 +13648,14 @@ "url": "/IndexedDB/idbobjectstore_put9.htm" }, { + "path": "IndexedDB/idbrequest_error.html", + "url": "/IndexedDB/idbrequest_error.html" + }, + { + "path": "IndexedDB/idbrequest_result.html", + "url": "/IndexedDB/idbrequest_result.html" + }, + { "path": "IndexedDB/idbtransaction-oncomplete.htm", "url": "/IndexedDB/idbtransaction-oncomplete.htm" }, @@ -13648,6 +13720,10 @@ "url": "/IndexedDB/list_ordering.htm" }, { + "path": "IndexedDB/name-scopes.html", + "url": "/IndexedDB/name-scopes.html" + }, + { "path": "IndexedDB/objectstore_keyorder.htm", "url": "/IndexedDB/objectstore_keyorder.htm" }, @@ -14692,24 +14768,36 @@ "url": "/XMLHttpRequest/xmlhttprequest-unsent.htm" }, { - "path": "ambient-light/AmbientLightSensor_browsing_context.html", - "url": "/ambient-light/AmbientLightSensor_browsing_context.html" + "path": "accelerometer/idlharness.https.html", + "url": "/accelerometer/idlharness.https.html" + }, + { + "path": "ambient-light/AmbientLightSensor_browsing_context.https.html", + "url": "/ambient-light/AmbientLightSensor_browsing_context.https.html" + }, + { + "path": "ambient-light/AmbientLightSensor_insecure_context.html", + "url": "/ambient-light/AmbientLightSensor_insecure_context.html" }, { - "path": "ambient-light/AmbientLightSensor_onstatechange.html", - "url": "/ambient-light/AmbientLightSensor_onstatechange.html" + "path": "ambient-light/AmbientLightSensor_onchange.https.html", + "url": "/ambient-light/AmbientLightSensor_onchange.https.html" }, { - "path": "ambient-light/AmbientLightSensor_start.html", - "url": "/ambient-light/AmbientLightSensor_start.html" + "path": "ambient-light/AmbientLightSensor_reading.https.html", + "url": "/ambient-light/AmbientLightSensor_reading.https.html" }, { - "path": "ambient-light/AmbientLightSensor_stop.html", - "url": "/ambient-light/AmbientLightSensor_stop.html" + "path": "ambient-light/AmbientLightSensor_start.https.html", + "url": "/ambient-light/AmbientLightSensor_start.https.html" }, { - "path": "ambient-light/idlharness.html", - "url": "/ambient-light/idlharness.html" + "path": "ambient-light/AmbientLightSensor_stop.https.html", + "url": "/ambient-light/AmbientLightSensor_stop.https.html" + }, + { + "path": "ambient-light/idlharness.https.html", + "url": "/ambient-light/idlharness.https.html" }, { "path": "app-uri/appURI_test.html", @@ -14732,6 +14820,10 @@ "url": "/battery-status/battery-promise.html" }, { + "path": "clear-site-data/navigation.html", + "url": "/clear-site-data/navigation.html" + }, + { "path": "compat/webkit-text-fill-color-currentColor.html", "url": "/compat/webkit-text-fill-color-currentColor.html" }, @@ -15236,6 +15328,66 @@ "url": "/content-security-policy/child-src/child-src-worker-blocked.sub.html" }, { + "path": "content-security-policy/embedded-enforcement/allow_csp_from-header.html", + "url": "/content-security-policy/embedded-enforcement/allow_csp_from-header.html" + }, + { + "path": "content-security-policy/embedded-enforcement/embedding_csp-header.html", + "url": "/content-security-policy/embedded-enforcement/embedding_csp-header.html" + }, + { + "path": "content-security-policy/embedded-enforcement/iframe-csp-attribute.html", + "url": "/content-security-policy/embedded-enforcement/iframe-csp-attribute.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-general.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-none.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-self.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html" + }, + { + "path": "content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html", + "url": "/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html" + }, + { "path": "content-security-policy/frame-ancestors/deep-allows-none.sub.html", "url": "/content-security-policy/frame-ancestors/deep-allows-none.sub.html" }, @@ -15424,6 +15576,10 @@ "url": "/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html" }, { + "path": "content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html", + "url": "/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html" + }, + { "path": "content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html", "url": "/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html" }, @@ -15648,6 +15804,10 @@ "url": "/cors/status.htm" }, { + "path": "css-values/unset-value-storage.html", + "url": "/css-values/unset-value-storage.html" + }, + { "path": "cssom-view/HTMLBody-ScrollArea_quirksmode.html", "url": "/cssom-view/HTMLBody-ScrollArea_quirksmode.html" }, @@ -15680,10 +15840,42 @@ "url": "/cssom-view/scrollingElement.html" }, { + "path": "cssom/CSSKeyframesRule.html", + "url": "/cssom/CSSKeyframesRule.html" + }, + { + "path": "cssom/CSSNamespaceRule.html", + "url": "/cssom/CSSNamespaceRule.html" + }, + { + "path": "cssom/CSSRuleList.html", + "url": "/cssom/CSSRuleList.html" + }, + { + "path": "cssom/CSSStyleRule.html", + "url": "/cssom/CSSStyleRule.html" + }, + { + "path": "cssom/CSSStyleSheet.html", + "url": "/cssom/CSSStyleSheet.html" + }, + { + "path": "cssom/MediaList.html", + "url": "/cssom/MediaList.html" + }, + { + "path": "cssom/StyleSheetList.html", + "url": "/cssom/StyleSheetList.html" + }, + { "path": "cssom/serialize-values.html", "url": "/cssom/serialize-values.html" }, { + "path": "cssom/shorthand-serialization.html", + "url": "/cssom/shorthand-serialization.html" + }, + { "path": "custom-elements/CustomElementRegistry.html", "url": "/custom-elements/CustomElementRegistry.html" }, @@ -15868,226 +16060,6 @@ "url": "/custom-elements/upgrading/upgrading-parser-created-element.html" }, { - "path": "custom-elements/v0/concepts/custom-elements-type-naming.html", - "url": "/custom-elements/v0/concepts/custom-elements-type-naming.html" - }, - { - "path": "custom-elements/v0/creating-and-passing-registries/new-registry-test.html", - "url": "/custom-elements/v0/creating-and-passing-registries/new-registry-test.html" - }, - { - "path": "custom-elements/v0/creating-and-passing-registries/no-registry-test.html", - "url": "/custom-elements/v0/creating-and-passing-registries/no-registry-test.html" - }, - { - "path": "custom-elements/v0/creating-and-passing-registries/share-registry-create-document.html", - "url": "/custom-elements/v0/creating-and-passing-registries/share-registry-create-document.html" - }, - { - "path": "custom-elements/v0/creating-and-passing-registries/share-registry-import-document.html", - "url": "/custom-elements/v0/creating-and-passing-registries/share-registry-import-document.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/enqueuing-and-invoking-callbacks/invoke-callbacks.html", - "url": "/custom-elements/v0/custom-element-lifecycle/enqueuing-and-invoking-callbacks/invoke-callbacks.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-move-element-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-move-element-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-change-attribute-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-change-attribute-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-remove-attribute-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-remove-attribute-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-set-attribute-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-set-attribute-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-element-prototype-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-element-prototype-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-order-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-order-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-move-element-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-move-element-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-no-browsing-context-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-no-browsing-context-test.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-with-browsing-context-test.html", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-with-browsing-context-test.html" - }, - { - "path": "custom-elements/v0/instantiating/changing-is-attribute.html", - "url": "/custom-elements/v0/instantiating/changing-is-attribute.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-constructor-is-attribute.html", - "url": "/custom-elements/v0/instantiating/custom-element-constructor-is-attribute.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-constructor-local-name.html", - "url": "/custom-elements/v0/instantiating/custom-element-constructor-local-name.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-constructor-namespace.html", - "url": "/custom-elements/v0/instantiating/custom-element-constructor-namespace.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-constructor-node-document.html", - "url": "/custom-elements/v0/instantiating/custom-element-constructor-node-document.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-constructor-prototype.html", - "url": "/custom-elements/v0/instantiating/custom-element-constructor-prototype.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-prototype.html", - "url": "/custom-elements/v0/instantiating/custom-element-prototype.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-type-is-attribute.html", - "url": "/custom-elements/v0/instantiating/custom-element-type-is-attribute.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-type-local-name-and-is-attribute.html", - "url": "/custom-elements/v0/instantiating/custom-element-type-local-name-and-is-attribute.html" - }, - { - "path": "custom-elements/v0/instantiating/custom-element-type-local-name.html", - "url": "/custom-elements/v0/instantiating/custom-element-type-local-name.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-local-name.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-local-name.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-type-extension.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-type-extension.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-is-attribute.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-is-attribute.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-namespace.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-namespace.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-is-a-type.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-is-a-type.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-unresolved.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-unresolved.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-is-a-local-name.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-is-a-local-name.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element-ns.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element-ns.html" - }, - { - "path": "custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element.html", - "url": "/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element.html" - }, - { - "path": "custom-elements/v0/instantiating/non-configurable-constructor-property.html", - "url": "/custom-elements/v0/instantiating/non-configurable-constructor-property.html" - }, - { - "path": "custom-elements/v0/instantiating/prototype-is-interface-prototype-object.html", - "url": "/custom-elements/v0/instantiating/prototype-is-interface-prototype-object.html" - }, - { - "path": "custom-elements/v0/instantiating/unchanged-attribute.html", - "url": "/custom-elements/v0/instantiating/unchanged-attribute.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-default-namespace.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-default-namespace.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-duplicate-definition.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-duplicate-definition.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-invalid-type.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-invalid-type.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-local-name-lowercased.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-local-name-lowercased.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-name-is-null.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-name-is-null.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-no-interface-for-name.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-no-interface-for-name.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-svg-namespace-name-is-null.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace-name-is-null.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-svg-namespace.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace.html" - }, - { - "path": "custom-elements/v0/registering/definition-construction-algorithm-type-name-lowercased.html", - "url": "/custom-elements/v0/registering/definition-construction-algorithm-type-name-lowercased.html" - }, - { - "path": "custom-elements/v0/registering/element-registration-algorithm-no-registry.html", - "url": "/custom-elements/v0/registering/element-registration-algorithm-no-registry.html" - }, - { - "path": "custom-elements/v0/registering/extensions-to-document-interface/custom-element-name.html", - "url": "/custom-elements/v0/registering/extensions-to-document-interface/custom-element-name.html" - }, - { - "path": "custom-elements/v0/registering/extensions-to-document-interface/custom-element-prototype.html", - "url": "/custom-elements/v0/registering/extensions-to-document-interface/custom-element-prototype.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector-all.html", - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector-all.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector.html", - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-elements-interface-html-element.html", - "url": "/custom-elements/v0/registering/unresolved-elements-interface-html-element.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-elements-interface-html-unknown-element.html", - "url": "/custom-elements/v0/registering/unresolved-elements-interface-html-unknown-element.html" - }, - { - "path": "custom-elements/v0/registering/unresolved-elements-interface-svg-element.html", - "url": "/custom-elements/v0/registering/unresolved-elements-interface-svg-element.html" - }, - { "path": "dom/collections/HTMLCollection-as-proto-length-get-throws.html", "url": "/dom/collections/HTMLCollection-as-proto-length-get-throws.html" }, @@ -16124,6 +16096,10 @@ "url": "/dom/events/CustomEvent.html" }, { + "path": "dom/events/Event-cancelBubble.html", + "url": "/dom/events/Event-cancelBubble.html" + }, + { "path": "dom/events/Event-constants.html", "url": "/dom/events/Event-constants.html" }, @@ -16140,6 +16116,10 @@ "url": "/dom/events/Event-defaultPrevented.html" }, { + "path": "dom/events/Event-dispatch-bubble-canceled.html", + "url": "/dom/events/Event-dispatch-bubble-canceled.html" + }, + { "path": "dom/events/Event-dispatch-bubbles-false.html", "url": "/dom/events/Event-dispatch-bubbles-false.html" }, @@ -16160,6 +16140,10 @@ "url": "/dom/events/Event-dispatch-handlers-changed.html" }, { + "path": "dom/events/Event-dispatch-multiple-cancelBubble.html", + "url": "/dom/events/Event-dispatch-multiple-cancelBubble.html" + }, + { "path": "dom/events/Event-dispatch-multiple-stopPropagation.html", "url": "/dom/events/Event-dispatch-multiple-stopPropagation.html" }, @@ -17560,14 +17544,6 @@ "url": "/encrypted-media/drm-events-session-closed-event.html" }, { - "path": "encrypted-media/drm-events.html", - "url": "/encrypted-media/drm-events.html" - }, - { - "path": "encrypted-media/drm-expiration.html", - "url": "/encrypted-media/drm-expiration.html" - }, - { "path": "encrypted-media/drm-generate-request-disallowed-input.html", "url": "/encrypted-media/drm-generate-request-disallowed-input.html" }, @@ -17576,110 +17552,18 @@ "url": "/encrypted-media/drm-invalid-license.html" }, { - "path": "encrypted-media/drm-keystatuses-multiple-sessions.html", - "url": "/encrypted-media/drm-keystatuses-multiple-sessions.html" - }, - { - "path": "encrypted-media/drm-keystatuses.html", - "url": "/encrypted-media/drm-keystatuses.html" - }, - { "path": "encrypted-media/drm-mp4-onencrypted.html", "url": "/encrypted-media/drm-mp4-onencrypted.html" }, { - "path": "encrypted-media/drm-mp4-playback-destroy-persistent-license.html", - "url": "/encrypted-media/drm-mp4-playback-destroy-persistent-license.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-persistent-license-events.html", - "url": "/encrypted-media/drm-mp4-playback-persistent-license-events.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-persistent-license.html", - "url": "/encrypted-media/drm-mp4-playback-persistent-license.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-persistent-usage-record-events.html", - "url": "/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html", - "url": "/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-multikey.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-multikey.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-multisession.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-multisession.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-two-videos.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-two-videos.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary-waitingforkey.html", - "url": "/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html" - }, - { - "path": "encrypted-media/drm-mp4-playback-temporary.html", - "url": "/encrypted-media/drm-mp4-playback-temporary.html" + "path": "encrypted-media/drm-mp4-requestmediakeysystemaccess.html", + "url": "/encrypted-media/drm-mp4-requestmediakeysystemaccess.html" }, { "path": "encrypted-media/drm-mp4-reset-src-after-setmediakeys.html", "url": "/encrypted-media/drm-mp4-reset-src-after-setmediakeys.html" }, { - "path": "encrypted-media/drm-mp4-setmediakeys-again-after-playback.html", - "url": "/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html" - }, - { - "path": "encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html", - "url": "/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html" - }, - { - "path": "encrypted-media/drm-mp4-setmediakeys-at-same-time.html", - "url": "/encrypted-media/drm-mp4-setmediakeys-at-same-time.html" - }, - { - "path": "encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html", - "url": "/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html" - }, - { - "path": "encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html", - "url": "/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html" - }, - { - "path": "encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html", - "url": "/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html" - }, - { "path": "encrypted-media/drm-mp4-setmediakeys.html", "url": "/encrypted-media/drm-mp4-setmediakeys.html" }, @@ -17700,18 +17584,10 @@ "url": "/encrypted-media/drm-mp4-unique-origin.html" }, { - "path": "encrypted-media/drm-mp4-waiting-for-a-key.html", - "url": "/encrypted-media/drm-mp4-waiting-for-a-key.html" - }, - { "path": "encrypted-media/drm-not-callable-after-createsession.html", "url": "/encrypted-media/drm-not-callable-after-createsession.html" }, { - "path": "encrypted-media/drm-temporary-license-type.html", - "url": "/encrypted-media/drm-temporary-license-type.html" - }, - { "path": "encrypted-media/idlharness.html", "url": "/encrypted-media/idlharness.html" }, @@ -18328,6 +18204,10 @@ "url": "/fetch/api/request/multi-globals/url-parsing.html" }, { + "path": "fetch/api/request/request-bad-port.html", + "url": "/fetch/api/request/request-bad-port.html" + }, + { "path": "fetch/api/request/request-cache-default-conditional.html", "url": "/fetch/api/request/request-cache-default-conditional.html" }, @@ -18492,6 +18372,14 @@ "url": "/fetch/nosniff/worker.html" }, { + "path": "fullscreen/api/document-exit-fullscreen-active-document.html", + "url": "/fullscreen/api/document-exit-fullscreen-active-document.html" + }, + { + "path": "fullscreen/api/document-fullscreen-enabled-active-document.html", + "url": "/fullscreen/api/document-fullscreen-enabled-active-document.html" + }, + { "path": "fullscreen/api/document-fullscreen-enabled.html", "url": "/fullscreen/api/document-fullscreen-enabled.html" }, @@ -18500,6 +18388,14 @@ "url": "/fullscreen/api/document-onfullscreenerror.html" }, { + "path": "fullscreen/api/element-request-fullscreen-not-allowed.html", + "url": "/fullscreen/api/element-request-fullscreen-not-allowed.html" + }, + { + "path": "fullscreen/api/historical.html", + "url": "/fullscreen/api/historical.html" + }, + { "path": "gamepad/idlharness.html", "url": "/gamepad/idlharness.html" }, @@ -18544,6 +18440,10 @@ "url": "/geolocation-API/watchPosition_permission_deny.html" }, { + "path": "gyroscope/idlharness.https.html", + "url": "/gyroscope/idlharness.https.html" + }, + { "path": "hr-time/basic.html", "url": "/hr-time/basic.html" }, @@ -18580,10 +18480,6 @@ "url": "/html-imports/html-link-element/import-attribute.html" }, { - "path": "html-media-capture/capture_fallback_file_upload.html", - "url": "/html-media-capture/capture_fallback_file_upload.html" - }, - { "path": "html-media-capture/capture_reflect.html", "url": "/html-media-capture/capture_reflect.html" }, @@ -18640,6 +18536,10 @@ "url": "/html/browsers/browsing-the-web/history-traversal/popstate_event.html" }, { + "path": "html/browsers/browsing-the-web/history-traversal/same-url.html", + "url": "/html/browsers/browsing-the-web/history-traversal/same-url.html" + }, + { "path": "html/browsers/browsing-the-web/history-traversal/unset_context_name-1.html", "url": "/html/browsers/browsing-the-web/history-traversal/unset_context_name-1.html" }, @@ -20296,6 +20196,26 @@ "url": "/html/semantics/document-metadata/the-link-element/link-style-error-01.html" }, { + "path": "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html", + "url": "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html" + }, + { + "path": "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html", + "url": "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html" + }, + { + "path": "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html", + "url": "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html" + }, + { + "path": "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html", + "url": "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html" + }, + { + "path": "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html", + "url": "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html" + }, + { "path": "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html", "url": "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html" }, @@ -21804,10 +21724,6 @@ "url": "/html/semantics/forms/form-submission-0/getactionurl.html" }, { - "path": "html/semantics/forms/form-submission-0/submit-entity-body.html", - "url": "/html/semantics/forms/form-submission-0/submit-entity-body.html" - }, - { "path": "html/semantics/forms/form-submission-0/url-encoded.html", "url": "/html/semantics/forms/form-submission-0/url-encoded.html" }, @@ -21816,6 +21732,10 @@ "url": "/html/semantics/forms/historical.html" }, { + "path": "html/semantics/forms/resetting-a-form/reset-event.html", + "url": "/html/semantics/forms/resetting-a-form/reset-event.html" + }, + { "path": "html/semantics/forms/resetting-a-form/reset-form.html", "url": "/html/semantics/forms/resetting-a-form/reset-form.html" }, @@ -22132,6 +22052,10 @@ "url": "/html/semantics/forms/the-select-element/select-remove.html" }, { + "path": "html/semantics/forms/the-select-element/select-value.html", + "url": "/html/semantics/forms/the-select-element/select-value.html" + }, + { "path": "html/semantics/forms/the-select-element/selected-index.html", "url": "/html/semantics/forms/the-select-element/selected-index.html" }, @@ -22856,10 +22780,18 @@ "url": "/html/webappapis/atob/base64.html" }, { + "path": "html/webappapis/idle-callbacks/basic.html", + "url": "/html/webappapis/idle-callbacks/basic.html" + }, + { "path": "html/webappapis/idle-callbacks/callback-exception.html", "url": "/html/webappapis/idle-callbacks/callback-exception.html" }, { + "path": "html/webappapis/idle-callbacks/callback-idle-periods.html", + "url": "/html/webappapis/idle-callbacks/callback-idle-periods.html" + }, + { "path": "html/webappapis/idle-callbacks/callback-iframe.html", "url": "/html/webappapis/idle-callbacks/callback-iframe.html" }, @@ -22872,6 +22804,10 @@ "url": "/html/webappapis/idle-callbacks/callback-multiple-calls.html" }, { + "path": "html/webappapis/idle-callbacks/callback-timeout-with-raf.html", + "url": "/html/webappapis/idle-callbacks/callback-timeout-with-raf.html" + }, + { "path": "html/webappapis/idle-callbacks/callback-timeout.html", "url": "/html/webappapis/idle-callbacks/callback-timeout.html" }, @@ -22908,6 +22844,10 @@ "url": "/html/webappapis/scripting/events/event-handler-javascript.html" }, { + "path": "html/webappapis/scripting/events/event-handler-onauxclick.html", + "url": "/html/webappapis/scripting/events/event-handler-onauxclick.html" + }, + { "path": "html/webappapis/scripting/events/event-handler-onresize.html", "url": "/html/webappapis/scripting/events/event-handler-onresize.html" }, @@ -22992,6 +22932,10 @@ "url": "/html/webappapis/scripting/processing-model-2/compile-error-in-setTimeout.html" }, { + "path": "html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html", + "url": "/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html" + }, + { "path": "html/webappapis/scripting/processing-model-2/compile-error-same-origin.html", "url": "/html/webappapis/scripting/processing-model-2/compile-error-same-origin.html" }, @@ -23036,6 +22980,10 @@ "url": "/html/webappapis/scripting/processing-model-2/runtime-error-in-window-onerror.html" }, { + "path": "html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html", + "url": "/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html" + }, + { "path": "html/webappapis/scripting/processing-model-2/runtime-error-same-origin.html", "url": "/html/webappapis/scripting/processing-model-2/runtime-error-same-origin.html" }, @@ -23188,6 +23136,10 @@ "url": "/innerText/setter.html" }, { + "path": "input-events/idlharness.html", + "url": "/input-events/idlharness.html" + }, + { "path": "js/behaviours/SetPrototypeOf-window.html", "url": "/js/behaviours/SetPrototypeOf-window.html" }, @@ -23244,6 +23196,10 @@ "url": "/js/builtins/WeakMap.prototype-properties.html" }, { + "path": "magnetometer/idlharness.https.html", + "url": "/magnetometer/idlharness.https.html" + }, + { "path": "mathml/presentation-markup/fractions/frac-1.html", "url": "/mathml/presentation-markup/fractions/frac-1.html" }, @@ -24732,6 +24688,82 @@ "url": "/navigation-timing/idlharness.html" }, { + "path": "navigation-timing/nav2_idlharness.html", + "url": "/navigation-timing/nav2_idlharness.html" + }, + { + "path": "navigation-timing/nav2_test_attributes_exist.html", + "url": "/navigation-timing/nav2_test_attributes_exist.html" + }, + { + "path": "navigation-timing/nav2_test_attributes_values.html", + "url": "/navigation-timing/nav2_test_attributes_values.html" + }, + { + "path": "navigation-timing/nav2_test_document_open.html", + "url": "/navigation-timing/nav2_test_document_open.html" + }, + { + "path": "navigation-timing/nav2_test_instance_accessors.html", + "url": "/navigation-timing/nav2_test_instance_accessors.html" + }, + { + "path": "navigation-timing/nav2_test_navigate_within_document.html", + "url": "/navigation-timing/nav2_test_navigate_within_document.html" + }, + { + "path": "navigation-timing/nav2_test_navigation_type_backforward.html", + "url": "/navigation-timing/nav2_test_navigation_type_backforward.html" + }, + { + "path": "navigation-timing/nav2_test_navigation_type_navigate.html", + "url": "/navigation-timing/nav2_test_navigation_type_navigate.html" + }, + { + "path": "navigation-timing/nav2_test_navigation_type_reload.html", + "url": "/navigation-timing/nav2_test_navigation_type_reload.html" + }, + { + "path": "navigation-timing/nav2_test_open_blank_page.html", + "url": "/navigation-timing/nav2_test_open_blank_page.html" + }, + { + "path": "navigation-timing/nav2_test_redirect_none.html", + "url": "/navigation-timing/nav2_test_redirect_none.html" + }, + { + "path": "navigation-timing/nav2_test_redirect_server.html", + "url": "/navigation-timing/nav2_test_redirect_server.html" + }, + { + "path": "navigation-timing/nav2_test_redirect_xserver.html", + "url": "/navigation-timing/nav2_test_redirect_xserver.html" + }, + { + "path": "navigation-timing/nav2_test_redirect_xserver_opt_in.html", + "url": "/navigation-timing/nav2_test_redirect_xserver_opt_in.html" + }, + { + "path": "navigation-timing/nav2_test_unique_nav_instances.html", + "url": "/navigation-timing/nav2_test_unique_nav_instances.html" + }, + { + "path": "navigation-timing/nav2_test_unloadEvents_no_previous_document.html", + "url": "/navigation-timing/nav2_test_unloadEvents_no_previous_document.html" + }, + { + "path": "navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html", + "url": "/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html" + }, + { + "path": "navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html", + "url": "/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html" + }, + { + "path": "navigation-timing/nav2_test_unloadEvents_with_previous_document.html", + "url": "/navigation-timing/nav2_test_unloadEvents_with_previous_document.html" + }, + { "path": "navigation-timing/test_document_open.html", "url": "/navigation-timing/test_document_open.html" }, @@ -24840,6 +24872,5854 @@ "url": "/notifications/permission.html" }, { + "path": "offscreen-canvas/compositing/2d.composite.canvas.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.destination-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.destination-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.lighter.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.lighter.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.lighter.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.lighter.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.source-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.source-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.xor.html", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.xor.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.canvas.xor.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.canvas.xor.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.destination-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.destination-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.lighter.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.lighter.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.lighter.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.lighter.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.source-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.source-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.xor.html", + "url": "/offscreen-canvas/compositing/2d.composite.clip.xor.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.clip.xor.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.clip.xor.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.default.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.default.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.default.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.default.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.fill.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.fill.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.image.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.image.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.image.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.image.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.range.html", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.range.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.globalAlpha.range.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.globalAlpha.range.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.destination-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.destination-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.lighter.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.lighter.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.lighter.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.lighter.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.source-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.source-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.xor.html", + "url": "/offscreen-canvas/compositing/2d.composite.image.xor.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.image.xor.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.image.xor.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.casesensitive.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.casesensitive.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.casesensitive.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.casesensitive.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.clear.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.clear.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.clear.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.clear.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.darker.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.darker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.darker.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.darker.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.default.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.default.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.default.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.default.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.get.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.get.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.get.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.get.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.highlight.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.highlight.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.highlight.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.highlight.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.nullsuffix.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.nullsuffix.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.over.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.unrecognised.html", + "url": "/offscreen-canvas/compositing/2d.composite.operation.unrecognised.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.operation.unrecognised.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.operation.unrecognised.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.destination-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.destination-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.lighter.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.lighter.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.lighter.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.lighter.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.source-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.source-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.xor.html", + "url": "/offscreen-canvas/compositing/2d.composite.solid.xor.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.solid.xor.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.solid.xor.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.destination-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.destination-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.lighter.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.lighter.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.lighter.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.lighter.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-over.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-over.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.source-over.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.source-over.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.xor.html", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.xor.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.transparent.xor.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.transparent.xor.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.worker.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.html", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.html" + }, + { + "path": "offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.worker.js", + "url": "/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.worker.html" + }, + { + "path": "offscreen-canvas/conformance-requirements/2d.coordinatespace.html", + "url": "/offscreen-canvas/conformance-requirements/2d.coordinatespace.html" + }, + { + "path": "offscreen-canvas/conformance-requirements/2d.coordinatespace.worker.js", + "url": "/offscreen-canvas/conformance-requirements/2d.coordinatespace.worker.html" + }, + { + "path": "offscreen-canvas/conformance-requirements/2d.missingargs.html", + "url": "/offscreen-canvas/conformance-requirements/2d.missingargs.html" + }, + { + "path": "offscreen-canvas/conformance-requirements/2d.missingargs.worker.js", + "url": "/offscreen-canvas/conformance-requirements/2d.missingargs.worker.html" + }, + { + "path": "offscreen-canvas/conformance-requirements/2d.voidreturn.html", + "url": "/offscreen-canvas/conformance-requirements/2d.voidreturn.html" + }, + { + "path": "offscreen-canvas/conformance-requirements/2d.voidreturn.worker.js", + "url": "/offscreen-canvas/conformance-requirements/2d.voidreturn.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.worker.html" + }, + { + "path": "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.worker.js", + "url": "/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.worker.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.html", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.html" + }, + { + "path": "offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.worker.js", + "url": "/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.worker.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.html", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.html" + }, + { + "path": "offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.worker.js", + "url": "/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.worker.html" + }, + { + "path": "offscreen-canvas/image-smoothing/image.smoothing.html", + "url": "/offscreen-canvas/image-smoothing/image.smoothing.html" + }, + { + "path": "offscreen-canvas/image-smoothing/image.smoothing.worker.js", + "url": "/offscreen-canvas/image-smoothing/image.smoothing.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.butt.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.butt.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.butt.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.butt.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.closed.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.closed.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.closed.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.closed.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.invalid.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.invalid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.invalid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.invalid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.open.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.open.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.open.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.open.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.round.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.round.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.round.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.round.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.square.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.square.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.square.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.square.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.valid.html", + "url": "/offscreen-canvas/line-styles/2d.line.cap.valid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cap.valid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cap.valid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cross.html", + "url": "/offscreen-canvas/line-styles/2d.line.cross.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.cross.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.cross.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.defaults.html", + "url": "/offscreen-canvas/line-styles/2d.line.defaults.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.defaults.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.defaults.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.bevel.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.bevel.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.bevel.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.bevel.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.closed.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.closed.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.closed.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.closed.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.invalid.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.invalid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.invalid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.invalid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.miter.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.miter.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.miter.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.miter.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.open.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.open.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.open.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.open.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.parallel.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.parallel.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.parallel.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.parallel.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.round.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.round.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.round.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.round.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.valid.html", + "url": "/offscreen-canvas/line-styles/2d.line.join.valid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.join.valid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.join.valid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.acute.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.acute.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.acute.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.acute.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.exceeded.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.exceeded.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.exceeded.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.exceeded.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.invalid.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.invalid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.invalid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.invalid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.lineedge.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.lineedge.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.lineedge.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.lineedge.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.obtuse.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.obtuse.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.obtuse.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.obtuse.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.rightangle.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.rightangle.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.rightangle.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.rightangle.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.valid.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.valid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.valid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.valid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.within.html", + "url": "/offscreen-canvas/line-styles/2d.line.miter.within.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.miter.within.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.miter.within.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.union.html", + "url": "/offscreen-canvas/line-styles/2d.line.union.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.union.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.union.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.basic.html", + "url": "/offscreen-canvas/line-styles/2d.line.width.basic.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.basic.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.width.basic.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.invalid.html", + "url": "/offscreen-canvas/line-styles/2d.line.width.invalid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.invalid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.width.invalid.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.scaledefault.html", + "url": "/offscreen-canvas/line-styles/2d.line.width.scaledefault.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.scaledefault.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.width.scaledefault.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.transformed.html", + "url": "/offscreen-canvas/line-styles/2d.line.width.transformed.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.transformed.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.width.transformed.worker.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.valid.html", + "url": "/offscreen-canvas/line-styles/2d.line.width.valid.html" + }, + { + "path": "offscreen-canvas/line-styles/2d.line.width.valid.worker.js", + "url": "/offscreen-canvas/line-styles/2d.line.width.valid.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.4.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.4.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.4.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.4.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.5.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.5.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.5.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.5.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.6.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.6.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.angle.6.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.angle.6.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.default.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.default.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.default.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.default.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.empty.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.empty.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.empty.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.empty.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.end.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.end.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.end.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.end.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.negative.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.negative.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.negative.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.negative.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.nonempty.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.nonempty.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.nonempty.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.nonempty.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.scale.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.scale.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.scale.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.scale.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.scale.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.scale.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.scale.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.scale.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.4.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.4.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.4.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.4.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.5.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.5.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.shape.5.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.shape.5.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.4.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.4.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.twopie.4.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.twopie.4.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.zero.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.zero.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.zero.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.zero.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.zero.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.zero.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.zero.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.zero.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.zeroradius.html", + "url": "/offscreen-canvas/path-objects/2d.path.arc.zeroradius.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arc.zeroradius.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arc.zeroradius.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.negative.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.negative.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.negative.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.negative.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.scale.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.scale.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.scale.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.scale.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.end.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.end.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.start.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.shape.start.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.transformation.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.transformation.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.transformation.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.transformation.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.zero.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.zero.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.zero.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.arcTo.zero.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.beginPath.html", + "url": "/offscreen-canvas/path-objects/2d.path.beginPath.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.beginPath.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.beginPath.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.html", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.html", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.basic.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.basic.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.basic.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.basic.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.basic.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.basic.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.basic.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.basic.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.empty.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.empty.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.empty.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.empty.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.intersect.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.intersect.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.intersect.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.intersect.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.unaffected.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.unaffected.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.unaffected.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.unaffected.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.winding.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.winding.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.winding.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.winding.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.winding.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.clip.winding.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.clip.winding.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.clip.winding.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.closePath.empty.html", + "url": "/offscreen-canvas/path-objects/2d.path.closePath.empty.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.closePath.empty.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.closePath.empty.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.closePath.newline.html", + "url": "/offscreen-canvas/path-objects/2d.path.closePath.newline.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.closePath.newline.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.closePath.newline.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.closePath.nextpoint.html", + "url": "/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.closePath.nextpoint.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.closed.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.closed.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.closed.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.closed.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.overlap.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.overlap.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.overlap.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.overlap.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.add.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.add.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.add.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.add.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.initial.html", + "url": "/offscreen-canvas/path-objects/2d.path.initial.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.initial.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.initial.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.arc.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.arc.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.edge.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.edge.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.empty.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.empty.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.outside.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.outside.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.winding.html", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.isPointInPath.winding.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.html", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.html", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.multiple.html", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.multiple.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.multiple.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.multiple.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.html", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.html", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.html", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.closed.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.closed.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.closed.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.closed.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.end.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.end.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.end.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.end.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.end.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.end.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.end.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.end.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.negative.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.negative.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.negative.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.negative.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.newsubpath.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.newsubpath.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.newsubpath.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.newsubpath.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.nonfinite.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.nonfinite.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.nonfinite.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.selfintersect.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.selfintersect.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.selfintersect.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.selfintersect.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.winding.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.winding.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.winding.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.winding.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.1.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.2.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.3.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.3.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.3.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.3.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.4.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.4.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.4.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.4.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.5.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.5.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.5.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.5.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.6.html", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.6.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.rect.zero.6.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.rect.zero.6.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.empty.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.empty.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.empty.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.empty.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.overlap.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.overlap.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.overlap.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.overlap.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.arc.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.arc.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.closed.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.closed.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.corner.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.corner.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.curve.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.curve.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.line.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.line.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.line.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.line.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.rect.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.prune.rect.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.scale1.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.scale1.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.scale1.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.scale1.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.scale2.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.scale2.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.scale2.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.scale2.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.skew.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.skew.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.skew.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.skew.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.unaffected.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.unaffected.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.unaffected.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.unaffected.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.union.html", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.union.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.stroke.union.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.stroke.union.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.transformation.basic.html", + "url": "/offscreen-canvas/path-objects/2d.path.transformation.basic.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.transformation.basic.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.transformation.basic.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.transformation.changing.html", + "url": "/offscreen-canvas/path-objects/2d.path.transformation.changing.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.transformation.changing.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.transformation.changing.worker.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.transformation.multiple.html", + "url": "/offscreen-canvas/path-objects/2d.path.transformation.multiple.html" + }, + { + "path": "offscreen-canvas/path-objects/2d.path.transformation.multiple.worker.js", + "url": "/offscreen-canvas/path-objects/2d.path.transformation.multiple.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.length.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.length.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.range.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.range.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.round.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.round.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.set.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.set.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.string.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.string.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.created.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.created.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.null.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.null.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.path.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.path.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.worker.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.html", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.html" + }, + { + "path": "offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.worker.js", + "url": "/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.3.html", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.3.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.3.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.3.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.4.html", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.4.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.4.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.4.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.5.html", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.5.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.alpha.5.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.alpha.5.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.html", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.alpha.html", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.alpha.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.alpha.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.alpha.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.basic.html", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.basic.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.basic.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.basic.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.clip.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.clip.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.clip.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.clip.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.clip.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.clip.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.clip.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.clip.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.clip.3.html", + "url": "/offscreen-canvas/shadows/2d.shadow.clip.3.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.clip.3.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.clip.3.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.composite.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.composite.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.composite.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.composite.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.composite.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.composite.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.composite.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.composite.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.composite.3.html", + "url": "/offscreen-canvas/shadows/2d.shadow.composite.3.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.composite.3.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.composite.3.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.blur.html", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.blur.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.blur.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.blur.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.off.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.off.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.off.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.off.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.off.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.off.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.off.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.off.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.x.html", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.x.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.x.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.x.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.y.html", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.y.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.enable.y.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.enable.y.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.alpha.html", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.alpha.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.alpha.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.alpha.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.basic.html", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.basic.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.basic.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.basic.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.alpha.html", + "url": "/offscreen-canvas/shadows/2d.shadow.image.alpha.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.alpha.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.image.alpha.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.basic.html", + "url": "/offscreen-canvas/shadows/2d.shadow.image.basic.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.basic.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.image.basic.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.scale.html", + "url": "/offscreen-canvas/shadows/2d.shadow.image.scale.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.scale.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.image.scale.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.section.html", + "url": "/offscreen-canvas/shadows/2d.shadow.image.section.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.section.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.image.section.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.transparent.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.image.transparent.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.transparent.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.image.transparent.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.transparent.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.image.transparent.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.image.transparent.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.image.transparent.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.negativeX.html", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.negativeX.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.negativeX.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.negativeX.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.negativeY.html", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.negativeY.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.negativeY.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.negativeY.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.positiveX.html", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.positiveX.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.positiveX.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.positiveX.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.positiveY.html", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.positiveY.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.offset.positiveY.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.offset.positiveY.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.outside.html", + "url": "/offscreen-canvas/shadows/2d.shadow.outside.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.outside.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.outside.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.alpha.html", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.alpha.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.alpha.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.alpha.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.basic.html", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.basic.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.basic.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.basic.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.basic.html", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.basic.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.basic.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.basic.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.cap.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.cap.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.cap.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.cap.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.join.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.join.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.join.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.join.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.join.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.join.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.join.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.join.2.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.join.3.html", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.join.3.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.stroke.join.3.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.stroke.join.3.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.transform.1.html", + "url": "/offscreen-canvas/shadows/2d.shadow.transform.1.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.transform.1.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.transform.1.worker.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.transform.2.html", + "url": "/offscreen-canvas/shadows/2d.shadow.transform.2.html" + }, + { + "path": "offscreen-canvas/shadows/2d.shadow.transform.2.worker.js", + "url": "/offscreen-canvas/shadows/2d.shadow.transform.2.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.path.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.path.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.worker.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.html", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.html" + }, + { + "path": "offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.worker.js", + "url": "/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.html", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.html", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.html", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.html", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.html", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.html", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.arguments.missing.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.arguments.missing.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.casesensitive.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.casesensitive.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.casesensitive.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.casesensitive.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.emptystring.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.emptystring.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.emptystring.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.emptystring.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.html", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.colour.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.colour.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.colour.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.colour.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.clip.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.clip.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.different.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.different.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.different.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.different.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.path.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.path.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.path.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.path.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.same.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.same.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.same.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.same.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.transform.html", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/initial.reset.transform.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.w.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.w.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.w.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.w.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.w.html", + "url": "/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.w.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.default.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.default.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.default.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.default.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.idl.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.idl.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.worker.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.large.html", + "url": "/offscreen-canvas/the-offscreen-canvas/size.large.html" + }, + { + "path": "offscreen-canvas/the-offscreen-canvas/size.large.worker.js", + "url": "/offscreen-canvas/the-offscreen-canvas/size.large.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.order.html", + "url": "/offscreen-canvas/transformations/2d.transformation.order.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.order.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.order.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.direction.html", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.direction.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.direction.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.direction.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.html", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.radians.html", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.radians.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.radians.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.radians.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.wrap.html", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.wrap.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.wrap.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.wrap.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.html", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.zero.html", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.zero.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.rotate.zero.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.rotate.zero.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.basic.html", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.basic.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.basic.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.basic.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.large.html", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.large.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.large.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.large.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.multiple.html", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.multiple.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.multiple.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.multiple.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.negative.html", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.negative.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.negative.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.negative.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.nonfinite.html", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.nonfinite.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.zero.html", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.zero.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.scale.zero.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.scale.zero.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.setTransform.multiple.html", + "url": "/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.setTransform.multiple.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.html", + "url": "/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.setTransform.skewed.html", + "url": "/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.setTransform.skewed.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.identity.html", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.identity.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.identity.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.identity.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.multiply.html", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.multiply.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.multiply.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.multiply.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.nonfinite.html", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.nonfinite.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.skewed.html", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.skewed.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.transform.skewed.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.transform.skewed.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.translate.basic.html", + "url": "/offscreen-canvas/transformations/2d.transformation.translate.basic.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.translate.basic.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.translate.basic.worker.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.translate.nonfinite.html", + "url": "/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.html" + }, + { + "path": "offscreen-canvas/transformations/2d.transformation.translate.nonfinite.worker.js", + "url": "/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.worker.html" + }, + { "path": "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete.html", "url": "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete.html" }, @@ -25704,6 +31584,18 @@ "url": "/page-visibility/unload.html" }, { + "path": "payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html", + "url": "/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html" + }, + { + "path": "payment-request/allowpaymentrequest/active-document-same-origin.https.html", + "url": "/payment-request/allowpaymentrequest/active-document-same-origin.https.html" + }, + { + "path": "payment-request/allowpaymentrequest/basic.https.html", + "url": "/payment-request/allowpaymentrequest/basic.https.html" + }, + { "path": "payment-request/interfaces.https.html", "url": "/payment-request/interfaces.https.html" }, @@ -25744,10 +31636,18 @@ "url": "/performance-timeline/po-resource.html" }, { + "path": "pointerevents/idlharness.html", + "url": "/pointerevents/idlharness.html" + }, + { "path": "pointerevents/pointerevent_constructor.html", "url": "/pointerevents/pointerevent_constructor.html" }, { + "path": "pointerevents/pointerevent_on_event_handlers.html", + "url": "/pointerevents/pointerevent_on_event_handlers.html" + }, + { "path": "pointerevents/pointerevent_touch-action-illegal.html", "url": "/pointerevents/pointerevent_touch-action-illegal.html" }, @@ -25764,6 +31664,58 @@ "url": "/pointerlock/idlharness.html" }, { + "path": "preload/avoid_delaying_onload_link_preload.html", + "url": "/preload/avoid_delaying_onload_link_preload.html" + }, + { + "path": "preload/delaying_onload_link_preload_after_discovery.html", + "url": "/preload/delaying_onload_link_preload_after_discovery.html" + }, + { + "path": "preload/download_resources.html", + "url": "/preload/download_resources.html" + }, + { + "path": "preload/dynamic_adding_preload.html", + "url": "/preload/dynamic_adding_preload.html" + }, + { + "path": "preload/link_header_preload.html", + "url": "/preload/link_header_preload.html" + }, + { + "path": "preload/link_header_preload_delay_onload.html", + "url": "/preload/link_header_preload_delay_onload.html" + }, + { + "path": "preload/onerror_event.html", + "url": "/preload/onerror_event.html" + }, + { + "path": "preload/onload_event.html", + "url": "/preload/onload_event.html" + }, + { + "path": "preload/preload-csp.sub.html", + "url": "/preload/preload-csp.sub.html" + }, + { + "path": "preload/preload-default-csp.sub.html", + "url": "/preload/preload-default-csp.sub.html" + }, + { + "path": "preload/preload_with_type.html", + "url": "/preload/preload_with_type.html" + }, + { + "path": "preload/single_download_late_used_preload.html", + "url": "/preload/single_download_late_used_preload.html" + }, + { + "path": "preload/single_download_preload.html", + "url": "/preload/single_download_preload.html" + }, + { "path": "presentation-api/controlling-ua/PresentationRequest_error.html", "url": "/presentation-api/controlling-ua/PresentationRequest_error.html" }, @@ -31200,6 +37152,18 @@ "url": "/resource-timing/resource-timing.html" }, { + "path": "resource-timing/resource_cached.htm", + "url": "/resource-timing/resource_cached.htm" + }, + { + "path": "resource-timing/resource_connection_reuse.html", + "url": "/resource-timing/resource_connection_reuse.html" + }, + { + "path": "resource-timing/resource_dynamic_insertion.html", + "url": "/resource-timing/resource_dynamic_insertion.html" + }, + { "path": "resource-timing/test_resource_timing.html", "url": "/resource-timing/test_resource_timing.html" }, @@ -31320,8 +37284,8 @@ "url": "/selectors/child-indexed-pseudo-class.html" }, { - "path": "service-workers/cache-storage/serviceworker/credentials.html", - "url": "/service-workers/cache-storage/serviceworker/credentials.html" + "path": "service-workers/cache-storage/serviceworker/credentials.https.html", + "url": "/service-workers/cache-storage/serviceworker/credentials.https.html" }, { "path": "service-workers/service-worker/ServiceWorkerGlobalScope/registration-attribute.https.html", @@ -32152,6 +38116,10 @@ "url": "/typedarrays/constructors.html" }, { + "path": "uievents/constructors/inputevent-constructor.html", + "url": "/uievents/constructors/inputevent-constructor.html" + }, + { "path": "uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html", "url": "/uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html" }, @@ -32176,6 +38144,34 @@ "url": "/uievents/legacy-domevents-tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html" }, { + "path": "upgrade-insecure-requests/iframe-redirect-upgrade.https.html", + "url": "/upgrade-insecure-requests/iframe-redirect-upgrade.https.html" + }, + { + "path": "upgrade-insecure-requests/iframe-upgrade.https.html", + "url": "/upgrade-insecure-requests/iframe-upgrade.https.html" + }, + { + "path": "upgrade-insecure-requests/image-redirect-upgrade.https.html", + "url": "/upgrade-insecure-requests/image-redirect-upgrade.https.html" + }, + { + "path": "upgrade-insecure-requests/image-upgrade.https.html", + "url": "/upgrade-insecure-requests/image-upgrade.https.html" + }, + { + "path": "upgrade-insecure-requests/websocket-upgrade.https.html", + "url": "/upgrade-insecure-requests/websocket-upgrade.https.html" + }, + { + "path": "url/a-element-origin-xhtml.xhtml", + "url": "/url/a-element-origin-xhtml.xhtml" + }, + { + "path": "url/a-element-origin.html", + "url": "/url/a-element-origin.html" + }, + { "path": "url/a-element-xhtml.xhtml", "url": "/url/a-element-xhtml.xhtml" }, @@ -32200,6 +38196,10 @@ "url": "/url/url-constructor.html" }, { + "path": "url/url-origin.html", + "url": "/url/url-origin.html" + }, + { "path": "url/url-setters.html", "url": "/url/url-setters.html" }, @@ -32304,6 +38304,10 @@ "url": "/vibration/silent-ignore.html" }, { + "path": "vr/idlharness.html", + "url": "/vr/idlharness.html" + }, + { "path": "web-animations/animation-model/animation-types/discrete-animation.html", "url": "/web-animations/animation-model/animation-types/discrete-animation.html" }, @@ -35364,6 +41368,26 @@ "url": "/webmessaging/Transferred_objects_unusable.sub.htm" }, { + "path": "webmessaging/broadcastchannel/basics.html", + "url": "/webmessaging/broadcastchannel/basics.html" + }, + { + "path": "webmessaging/broadcastchannel/blobs.html", + "url": "/webmessaging/broadcastchannel/blobs.html" + }, + { + "path": "webmessaging/broadcastchannel/interface.html", + "url": "/webmessaging/broadcastchannel/interface.html" + }, + { + "path": "webmessaging/broadcastchannel/sandbox.html", + "url": "/webmessaging/broadcastchannel/sandbox.html" + }, + { + "path": "webmessaging/broadcastchannel/workers.html", + "url": "/webmessaging/broadcastchannel/workers.html" + }, + { "path": "webmessaging/event.data.sub.htm", "url": "/webmessaging/event.data.sub.htm" }, @@ -35400,6 +41424,10 @@ "url": "/webmessaging/message-channels/004.html" }, { + "path": "webmessaging/message-channels/close.html", + "url": "/webmessaging/message-channels/close.html" + }, + { "path": "webmessaging/postMessage_ArrayBuffer.sub.htm", "url": "/webmessaging/postMessage_ArrayBuffer.sub.htm" }, @@ -35668,6 +41696,14 @@ "url": "/webmessaging/without-ports/029.html" }, { + "path": "webrtc/RTCDataChannelEvent-constructor.html", + "url": "/webrtc/RTCDataChannelEvent-constructor.html" + }, + { + "path": "webrtc/RTCPeerConnectionIceEvent-constructor.html", + "url": "/webrtc/RTCPeerConnectionIceEvent-constructor.html" + }, + { "path": "webrtc/datachannel-emptystring.html", "url": "/webrtc/datachannel-emptystring.html" }, @@ -37596,6 +43632,10 @@ "url": "/workers/nested_worker.worker.html" }, { + "path": "workers/opaque-origin.html", + "url": "/workers/opaque-origin.html" + }, + { "path": "workers/postMessage_DataCloneErr.htm", "url": "/workers/postMessage_DataCloneErr.htm" }, @@ -38091,21 +44131,6 @@ "url": "/cors/status-async.htm" }, { - "path": "custom-elements/v0/concepts/custom-elements-type-allowed-chars-first-char.html", - "timeout": "long", - "url": "/custom-elements/v0/concepts/custom-elements-type-allowed-chars-first-char.html" - }, - { - "path": "custom-elements/v0/concepts/custom-elements-type-allowed-chars.html", - "timeout": "long", - "url": "/custom-elements/v0/concepts/custom-elements-type-allowed-chars.html" - }, - { - "path": "custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-test.html", - "timeout": "long", - "url": "/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-test.html" - }, - { "path": "dom/nodes/Document-characterSet-normalization.html", "timeout": "long", "url": "/dom/nodes/Document-characterSet-normalization.html" @@ -38311,6 +44336,46 @@ "url": "/encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html" }, { + "path": "encrypted-media/drm-events.html", + "timeout": "long", + "url": "/encrypted-media/drm-events.html" + }, + { + "path": "encrypted-media/drm-expiration.html", + "timeout": "long", + "url": "/encrypted-media/drm-expiration.html" + }, + { + "path": "encrypted-media/drm-keystatuses-multiple-sessions.html", + "timeout": "long", + "url": "/encrypted-media/drm-keystatuses-multiple-sessions.html" + }, + { + "path": "encrypted-media/drm-keystatuses.html", + "timeout": "long", + "url": "/encrypted-media/drm-keystatuses.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-destroy-persistent-license.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-destroy-persistent-license.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-persistent-license-events.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-persistent-license-events.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-persistent-license.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-persistent-license.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-persistent-usage-record-events.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html" + }, + { "path": "encrypted-media/drm-mp4-playback-persistent-usage-record.html", "timeout": "long", "url": "/encrypted-media/drm-mp4-playback-persistent-usage-record.html" @@ -38326,11 +44391,26 @@ "url": "/encrypted-media/drm-mp4-playback-retrieve-persistent-license.html" }, { + "path": "encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html" + }, + { "path": "encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html", "timeout": "long", "url": "/encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html" }, { + "path": "encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html" + }, + { "path": "encrypted-media/drm-mp4-playback-temporary-events.html", "timeout": "long", "url": "/encrypted-media/drm-mp4-playback-temporary-events.html" @@ -38351,9 +44431,89 @@ "url": "/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html" }, { - "path": "encrypted-media/drm-mp4-requestmediakeysystemaccess.html", + "path": "encrypted-media/drm-mp4-playback-temporary-multikey.html", "timeout": "long", - "url": "/encrypted-media/drm-mp4-requestmediakeysystemaccess.html" + "url": "/encrypted-media/drm-mp4-playback-temporary-multikey.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-multisession.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-multisession.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-two-videos.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-two-videos.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary-waitingforkey.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html" + }, + { + "path": "encrypted-media/drm-mp4-playback-temporary.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-playback-temporary.html" + }, + { + "path": "encrypted-media/drm-mp4-setmediakeys-again-after-playback.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html" + }, + { + "path": "encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html" + }, + { + "path": "encrypted-media/drm-mp4-setmediakeys-at-same-time.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-setmediakeys-at-same-time.html" + }, + { + "path": "encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html" + }, + { + "path": "encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html" + }, + { + "path": "encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html" + }, + { + "path": "encrypted-media/drm-mp4-waiting-for-a-key.html", + "timeout": "long", + "url": "/encrypted-media/drm-mp4-waiting-for-a-key.html" + }, + { + "path": "encrypted-media/drm-temporary-license-type.html", + "timeout": "long", + "url": "/encrypted-media/drm-temporary-license-type.html" }, { "path": "eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm", @@ -38411,6 +44571,11 @@ "url": "/html/browsers/history/the-history-interface/007.html" }, { + "path": "html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html", + "timeout": "long", + "url": "/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html" + }, + { "path": "html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html", "timeout": "long", "url": "/html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html" @@ -38561,6 +44726,11 @@ "url": "/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html" }, { + "path": "html/semantics/forms/form-submission-0/submit-entity-body.html", + "timeout": "long", + "url": "/html/semantics/forms/form-submission-0/submit-entity-body.html" + }, + { "path": "html/semantics/forms/textfieldselection/selection.html", "timeout": "long", "url": "/html/semantics/forms/textfieldselection/selection.html" @@ -39675,83 +45845,7 @@ "local_changes": { "deleted": [], "deleted_reftests": {}, - "items": { - "testharness": { - "css-values/unset-value-storage.html": [ - { - "path": "css-values/unset-value-storage.html", - "url": "/css-values/unset-value-storage.html" - } - ], - "cssom/CSSKeyframesRule.html": [ - { - "path": "cssom/CSSKeyframesRule.html", - "url": "/cssom/CSSKeyframesRule.html" - } - ], - "cssom/CSSNamespaceRule.html": [ - { - "path": "cssom/CSSNamespaceRule.html", - "url": "/cssom/CSSNamespaceRule.html" - } - ], - "cssom/CSSRuleList.html": [ - { - "path": "cssom/CSSRuleList.html", - "url": "/cssom/CSSRuleList.html" - } - ], - "cssom/CSSStyleRule.html": [ - { - "path": "cssom/CSSStyleRule.html", - "url": "/cssom/CSSStyleRule.html" - } - ], - "cssom/CSSStyleSheet.html": [ - { - "path": "cssom/CSSStyleSheet.html", - "url": "/cssom/CSSStyleSheet.html" - } - ], - "cssom/MediaList.html": [ - { - "path": "cssom/MediaList.html", - "url": "/cssom/MediaList.html" - } - ], - "cssom/StyleSheetList.html": [ - { - "path": "cssom/StyleSheetList.html", - "url": "/cssom/StyleSheetList.html" - } - ], - "cssom/shorthand-serialization.html": [ - { - "path": "cssom/shorthand-serialization.html", - "url": "/cssom/shorthand-serialization.html" - } - ], - "fetch/api/request/request-bad-port.html": [ - { - "path": "fetch/api/request/request-bad-port.html", - "url": "/fetch/api/request/request-bad-port.html" - } - ], - "html/semantics/forms/form-submission-0/submit-entity-body.html": [ - { - "path": "html/semantics/forms/form-submission-0/submit-entity-body.html", - "timeout": "long", - "url": "/html/semantics/forms/form-submission-0/submit-entity-body.html" - } - ], - "html/semantics/forms/the-select-element/select-value.html": [ - { - "path": "html/semantics/forms/the-select-element/select-value.html", - "url": "/html/semantics/forms/the-select-element/select-value.html" - } - ] - } - }, + "items": {}, "reftest_nodes": {} }, "reftest_nodes": { @@ -40331,54 +46425,6 @@ "url": "/content-security-policy/font-src/font-whitelisted.html" } ], - "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html": [ - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html" - } - ], - "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html": [ - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html" - } - ], - "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html": [ - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html" - } - ], - "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html": [ - { - "path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html", - "references": [ - [ - "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension-ref.html", - "==" - ] - ], - "url": "/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html" - } - ], "html/dom/elements/global-attributes/dir_auto-EN-L.html": [ { "path": "html/dom/elements/global-attributes/dir_auto-EN-L.html", @@ -43115,18 +49161,6 @@ "url": "/mathml/relations/css-styling/display-1.html" } ], - "mathml/relations/css-styling/lengths-1-ref.html": [ - { - "path": "mathml/relations/css-styling/lengths-1-ref.html", - "references": [ - [ - "/mathml/relations/css-styling/lengths-1-ref.html", - "==" - ] - ], - "url": "/mathml/relations/css-styling/lengths-1-ref.html" - } - ], "mathml/relations/css-styling/lengths-1.html": [ { "path": "mathml/relations/css-styling/lengths-1.html", @@ -46392,7 +52426,7 @@ } ] }, - "rev": "e8bfc205e36ad699601212cd50083870bad9a75d", + "rev": "3137d1d2d7757366a69f8a449b458b5057e0e81e", "url_base": "/", "version": 3 } diff --git a/tests/wpt/metadata/dom/events/Event-cancelBubble.html.ini b/tests/wpt/metadata/dom/events/Event-cancelBubble.html.ini new file mode 100644 index 00000000000..266447e4c08 --- /dev/null +++ b/tests/wpt/metadata/dom/events/Event-cancelBubble.html.ini @@ -0,0 +1,26 @@ +[Event-cancelBubble.html] + type: testharness + [cancelBubble must be false when an event is initially created.] + expected: FAIL + + [Initializing an event must set cancelBubble to false.] + expected: FAIL + + [stopPropagation() must set cancelBubble to true.] + expected: FAIL + + [stopImmediatePropagation() must set cancelBubble to true.] + expected: FAIL + + [Event.cancelBubble=false must have no effect.] + expected: FAIL + + [Event.cancelBubble=false must have no effect during event propagation.] + expected: FAIL + + [cancelBubble must be false after an event has been dispatched.] + expected: FAIL + + [Event.cancelBubble=true must set the stop propagation flag.] + expected: FAIL + diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-bubble-canceled.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-bubble-canceled.html.ini new file mode 100644 index 00000000000..f98def06bcf --- /dev/null +++ b/tests/wpt/metadata/dom/events/Event-dispatch-bubble-canceled.html.ini @@ -0,0 +1,5 @@ +[Event-dispatch-bubble-canceled.html] + type: testharness + [Setting cancelBubble=true prior to dispatchEvent()] + expected: FAIL + diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-multiple-cancelBubble.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-multiple-cancelBubble.html.ini new file mode 100644 index 00000000000..3b40ae33df9 --- /dev/null +++ b/tests/wpt/metadata/dom/events/Event-dispatch-multiple-cancelBubble.html.ini @@ -0,0 +1,5 @@ +[Event-dispatch-multiple-cancelBubble.html] + type: testharness + [Multiple dispatchEvent() and cancelBubble] + expected: FAIL + diff --git a/tests/wpt/metadata/dom/events/Event-initEvent.html.ini b/tests/wpt/metadata/dom/events/Event-initEvent.html.ini new file mode 100644 index 00000000000..5e70cc65e7f --- /dev/null +++ b/tests/wpt/metadata/dom/events/Event-initEvent.html.ini @@ -0,0 +1,5 @@ +[Event-initEvent.html] + type: testharness + [Calling initEvent must unset the stop propagation flag.] + expected: FAIL + diff --git a/tests/wpt/metadata/dom/events/Event-propagation.html.ini b/tests/wpt/metadata/dom/events/Event-propagation.html.ini new file mode 100644 index 00000000000..a1baee903f0 --- /dev/null +++ b/tests/wpt/metadata/dom/events/Event-propagation.html.ini @@ -0,0 +1,5 @@ +[Event-propagation.html] + type: testharness + [After cancelBubble=true] + expected: FAIL + diff --git a/tests/wpt/metadata/dom/nodes/Node-cloneNode.html.ini b/tests/wpt/metadata/dom/nodes/Node-cloneNode.html.ini new file mode 100644 index 00000000000..bf7d693b4db --- /dev/null +++ b/tests/wpt/metadata/dom/nodes/Node-cloneNode.html.ini @@ -0,0 +1,5 @@ +[Node-cloneNode.html] + type: testharness + [implementation.createDocument] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini index 4c228581bae..81cb01e0939 100644 --- a/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini @@ -54,3 +54,21 @@ [Fetch with POST with URLSearchParams body] expected: FAIL + [Fetch with GET and mode "cors" does not need an Origin header] + expected: FAIL + + [Fetch with POST and mode "same-origin" needs an Origin header] + expected: FAIL + + [Fetch with POST and mode "no-cors" needs an Origin header] + expected: FAIL + + [Fetch with PUT and mode "same-origin" needs an Origin header] + expected: FAIL + + [Fetch with TacO and mode "same-origin" needs an Origin header] + expected: FAIL + + [Fetch with TacO and mode "cors" needs an Origin header] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini b/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini index 4361ade4d59..decac375344 100644 --- a/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini @@ -54,3 +54,21 @@ [Fetch with POST with URLSearchParams body] expected: FAIL + [Fetch with GET and mode "cors" does not need an Origin header] + expected: FAIL + + [Fetch with POST and mode "same-origin" needs an Origin header] + expected: FAIL + + [Fetch with POST and mode "no-cors" needs an Origin header] + expected: FAIL + + [Fetch with PUT and mode "same-origin" needs an Origin header] + expected: FAIL + + [Fetch with TacO and mode "same-origin" needs an Origin header] + expected: FAIL + + [Fetch with TacO and mode "cors" needs an Origin header] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/api/headers/headers-basic.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-basic.html.ini new file mode 100644 index 00000000000..0321618e55a --- /dev/null +++ b/tests/wpt/metadata/fetch/api/headers/headers-basic.html.ini @@ -0,0 +1,5 @@ +[headers-basic.html] + type: testharness + [Create headers with existing headers with custom iterator] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/api/headers/headers-idl.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-idl.html.ini deleted file mode 100644 index 0dcbdbf0434..00000000000 --- a/tests/wpt/metadata/fetch/api/headers/headers-idl.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[headers-idl.html] - type: testharness - expected: ERROR diff --git a/tests/wpt/metadata/fetch/api/request/request-idl.html.ini b/tests/wpt/metadata/fetch/api/request/request-idl.html.ini index 7bb88b0081d..b8eb86cce97 100644 --- a/tests/wpt/metadata/fetch/api/request/request-idl.html.ini +++ b/tests/wpt/metadata/fetch/api/request/request-idl.html.ini @@ -1,3 +1,20 @@ [request-idl.html] type: testharness - expected: ERROR + [Request interface: operation arrayBuffer()] + expected: FAIL + + [Request interface: operation blob()] + expected: FAIL + + [Request interface: operation formData()] + expected: FAIL + + [Request interface: operation json()] + expected: FAIL + + [Request interface: operation text()] + expected: FAIL + + [Request interface: new Request("") must inherit property "arrayBuffer" with the proper type (14)] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/api/response/response-consume.html.ini b/tests/wpt/metadata/fetch/api/response/response-consume.html.ini index 4235ac35fee..259a0f14757 100644 --- a/tests/wpt/metadata/fetch/api/response/response-consume.html.ini +++ b/tests/wpt/metadata/fetch/api/response/response-consume.html.ini @@ -81,3 +81,6 @@ [Consume response's body: from fetch to arrayBuffer] expected: FAIL + [Consume response's body: from multipart form data blob to formData] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/api/response/response-idl.html.ini b/tests/wpt/metadata/fetch/api/response/response-idl.html.ini index 6b6489d8871..015543189cb 100644 --- a/tests/wpt/metadata/fetch/api/response/response-idl.html.ini +++ b/tests/wpt/metadata/fetch/api/response/response-idl.html.ini @@ -1,3 +1,26 @@ [response-idl.html] type: testharness - expected: ERROR + [Response interface: attribute body] + expected: FAIL + + [Response interface: operation arrayBuffer()] + expected: FAIL + + [Response interface: operation blob()] + expected: FAIL + + [Response interface: operation formData()] + expected: FAIL + + [Response interface: operation json()] + expected: FAIL + + [Response interface: operation text()] + expected: FAIL + + [Response interface: new Response() must inherit property "body" with the proper type (8)] + expected: FAIL + + [Response interface: new Response() must inherit property "arrayBuffer" with the proper type (11)] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/nosniff/image.html.ini b/tests/wpt/metadata/fetch/nosniff/image.html.ini deleted file mode 100644 index d335ef05fb5..00000000000 --- a/tests/wpt/metadata/fetch/nosniff/image.html.ini +++ /dev/null @@ -1,14 +0,0 @@ -[image.html] - type: testharness - [URL query: ] - expected: FAIL - - [URL query: ?type=] - expected: FAIL - - [URL query: ?type=x] - expected: FAIL - - [URL query: ?type=x/x] - expected: FAIL - diff --git a/tests/wpt/metadata/fullscreen/api/document-exit-fullscreen-active-document.html.ini b/tests/wpt/metadata/fullscreen/api/document-exit-fullscreen-active-document.html.ini new file mode 100644 index 00000000000..160a13ef6bc --- /dev/null +++ b/tests/wpt/metadata/fullscreen/api/document-exit-fullscreen-active-document.html.ini @@ -0,0 +1,5 @@ +[document-exit-fullscreen-active-document.html] + type: testharness + [Document#exitFullscreen() when the document is not the active document] + expected: FAIL + diff --git a/tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-active-document.html.ini b/tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-active-document.html.ini new file mode 100644 index 00000000000..ed8d192b0db --- /dev/null +++ b/tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-active-document.html.ini @@ -0,0 +1,5 @@ +[document-fullscreen-enabled-active-document.html] + type: testharness + [Document#fullscreenEnabled when the document is not the active document] + expected: FAIL + diff --git a/tests/wpt/metadata/fullscreen/api/element-request-fullscreen-not-allowed.html.ini b/tests/wpt/metadata/fullscreen/api/element-request-fullscreen-not-allowed.html.ini new file mode 100644 index 00000000000..ac0d5fe481f --- /dev/null +++ b/tests/wpt/metadata/fullscreen/api/element-request-fullscreen-not-allowed.html.ini @@ -0,0 +1,6 @@ +[element-request-fullscreen-not-allowed.html] + type: testharness + expected: TIMEOUT + [Element#requestFullscreen() when not allowed to request fullscreen] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/same-url.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/same-url.html.ini new file mode 100644 index 00000000000..e5063d4a991 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/same-url.html.ini @@ -0,0 +1,5 @@ +[same-url.html] + type: testharness + [Test same-URL navigation and its effects on history] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html.ini b/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html.ini new file mode 100644 index 00000000000..e40bf7825d7 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html.ini @@ -0,0 +1,47 @@ +[cross-origin-objects-exceptions.html] + type: testharness + [Basic sanity-checking] + expected: FAIL + + [Only whitelisted properties are accessible cross-origin] + expected: FAIL + + [[[GetPrototypeOf\]\] should return null] + expected: FAIL + + [[[SetPrototypeOf\]\] should throw] + expected: FAIL + + [[[PreventExtensions\]\] should throw for cross-origin objects] + expected: FAIL + + [[[GetOwnProperty\]\] - Property descriptors for cross-origin properties should be set up correctly] + expected: FAIL + + [[[Delete\]\] Should throw on cross-origin objects] + expected: FAIL + + [[[DefineOwnProperty\]\] Should throw for cross-origin objects] + expected: FAIL + + [[[Enumerate\]\] should return an empty iterator] + expected: FAIL + + [[[OwnPropertyKeys\]\] should return all properties from cross-origin objects] + expected: FAIL + + [Cross-origin functions get local Function.prototype] + expected: FAIL + + [Cross-origin Window accessors get local Function.prototype] + expected: FAIL + + [Same-origin observers get different functions for cross-origin objects] + expected: FAIL + + [Same-origin observers get different accessors for cross-origin Window] + expected: FAIL + + [Same-origin observers get different accessors for cross-origin Location] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index 24f7bf07de4..54293b1a360 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -9831,3 +9831,156 @@ [MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object\],[object Object\],[object Object\])] expected: FAIL + [Document interface: attribute onauxclick] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type (91)] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onmousewheel" with the proper type (131)] + expected: FAIL + + [Document interface: new Document() must inherit property "onauxclick" with the proper type (91)] + expected: FAIL + + [Document interface: new Document() must inherit property "onmousewheel" with the proper type (131)] + expected: FAIL + + [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type (91)] + expected: FAIL + + [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousewheel" with the proper type (131)] + expected: FAIL + + [HTMLElement interface: attribute onauxclick] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type (19)] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onmousewheel" with the proper type (59)] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type (82)] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type (83)] + expected: FAIL + + [HTMLLinkElement interface: attribute nonce] + expected: FAIL + + [HTMLLinkElement interface: attribute integrity] + expected: FAIL + + [HTMLLinkElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "nonce" with the proper type (5)] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type (6)] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type (9)] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type (10)] + expected: FAIL + + [HTMLAnchorElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type (8)] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type (10)] + expected: FAIL + + [HTMLImageElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type (13)] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type (15)] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type (13)] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type (15)] + expected: FAIL + + [HTMLIFrameElement interface: attribute allowUserMedia] + expected: FAIL + + [HTMLIFrameElement interface: attribute allowPaymentRequest] + expected: FAIL + + [HTMLIFrameElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLIFrameElement interface: operation getSVGDocument()] + expected: FAIL + + [HTMLAreaElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type (8)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type (9)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type (10)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type (11)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type (12)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type (13)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type (14)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type (15)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type (16)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type (17)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type (18)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type (19)] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type (20)] + expected: FAIL + + [HTMLDialogElement interface: operation show()] + expected: FAIL + + [HTMLDialogElement interface: operation showModal()] + expected: FAIL + + [Window interface: attribute onauxclick] + expected: FAIL + + [Window interface: window must inherit property "onauxclick" with the proper type (39)] + expected: FAIL + + [Window interface: window must inherit property "onmousewheel" with the proper type (79)] + expected: FAIL + + [Window interface: window must inherit property "createImageBitmap" with the proper type (120)] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/reflection-metadata.html.ini b/tests/wpt/metadata/html/dom/reflection-metadata.html.ini index 74061a4a1b7..b4c8344e29c 100644 --- a/tests/wpt/metadata/html/dom/reflection-metadata.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-metadata.html.ini @@ -10020,3 +10020,531 @@ [style.type: IDL set to object "test-valueOf"] expected: FAIL + [link.nonce: typeof IDL attribute] + expected: FAIL + + [link.nonce: IDL get with DOM attribute unset] + expected: FAIL + + [link.nonce: setAttribute() to ""] + expected: FAIL + + [link.nonce: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [link.nonce: setAttribute() to undefined] + expected: FAIL + + [link.nonce: setAttribute() to 7] + expected: FAIL + + [link.nonce: setAttribute() to 1.5] + expected: FAIL + + [link.nonce: setAttribute() to true] + expected: FAIL + + [link.nonce: setAttribute() to false] + expected: FAIL + + [link.nonce: setAttribute() to object "[object Object\]"] + expected: FAIL + + [link.nonce: setAttribute() to NaN] + expected: FAIL + + [link.nonce: setAttribute() to Infinity] + expected: FAIL + + [link.nonce: setAttribute() to -Infinity] + expected: FAIL + + [link.nonce: setAttribute() to "\\0"] + expected: FAIL + + [link.nonce: setAttribute() to null] + expected: FAIL + + [link.nonce: setAttribute() to object "test-toString"] + expected: FAIL + + [link.nonce: setAttribute() to object "test-valueOf"] + expected: FAIL + + [link.nonce: IDL set to ""] + expected: FAIL + + [link.nonce: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [link.nonce: IDL set to undefined] + expected: FAIL + + [link.nonce: IDL set to 7] + expected: FAIL + + [link.nonce: IDL set to 1.5] + expected: FAIL + + [link.nonce: IDL set to true] + expected: FAIL + + [link.nonce: IDL set to false] + expected: FAIL + + [link.nonce: IDL set to object "[object Object\]"] + expected: FAIL + + [link.nonce: IDL set to NaN] + expected: FAIL + + [link.nonce: IDL set to Infinity] + expected: FAIL + + [link.nonce: IDL set to -Infinity] + expected: FAIL + + [link.nonce: IDL set to "\\0"] + expected: FAIL + + [link.nonce: IDL set to null] + expected: FAIL + + [link.nonce: IDL set to object "test-toString"] + expected: FAIL + + [link.nonce: IDL set to object "test-valueOf"] + expected: FAIL + + [link.integrity: typeof IDL attribute] + expected: FAIL + + [link.integrity: IDL get with DOM attribute unset] + expected: FAIL + + [link.integrity: setAttribute() to ""] + expected: FAIL + + [link.integrity: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [link.integrity: setAttribute() to undefined] + expected: FAIL + + [link.integrity: setAttribute() to 7] + expected: FAIL + + [link.integrity: setAttribute() to 1.5] + expected: FAIL + + [link.integrity: setAttribute() to true] + expected: FAIL + + [link.integrity: setAttribute() to false] + expected: FAIL + + [link.integrity: setAttribute() to object "[object Object\]"] + expected: FAIL + + [link.integrity: setAttribute() to NaN] + expected: FAIL + + [link.integrity: setAttribute() to Infinity] + expected: FAIL + + [link.integrity: setAttribute() to -Infinity] + expected: FAIL + + [link.integrity: setAttribute() to "\\0"] + expected: FAIL + + [link.integrity: setAttribute() to null] + expected: FAIL + + [link.integrity: setAttribute() to object "test-toString"] + expected: FAIL + + [link.integrity: setAttribute() to object "test-valueOf"] + expected: FAIL + + [link.integrity: IDL set to ""] + expected: FAIL + + [link.integrity: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [link.integrity: IDL set to undefined] + expected: FAIL + + [link.integrity: IDL set to 7] + expected: FAIL + + [link.integrity: IDL set to 1.5] + expected: FAIL + + [link.integrity: IDL set to true] + expected: FAIL + + [link.integrity: IDL set to false] + expected: FAIL + + [link.integrity: IDL set to object "[object Object\]"] + expected: FAIL + + [link.integrity: IDL set to NaN] + expected: FAIL + + [link.integrity: IDL set to Infinity] + expected: FAIL + + [link.integrity: IDL set to -Infinity] + expected: FAIL + + [link.integrity: IDL set to "\\0"] + expected: FAIL + + [link.integrity: IDL set to null] + expected: FAIL + + [link.integrity: IDL set to object "test-toString"] + expected: FAIL + + [link.integrity: IDL set to object "test-valueOf"] + expected: FAIL + + [link.referrerPolicy: typeof IDL attribute] + expected: FAIL + + [link.referrerPolicy: IDL get with DOM attribute unset] + expected: FAIL + + [link.referrerPolicy: setAttribute() to ""] + expected: FAIL + + [link.referrerPolicy: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [link.referrerPolicy: setAttribute() to undefined] + expected: FAIL + + [link.referrerPolicy: setAttribute() to 7] + expected: FAIL + + [link.referrerPolicy: setAttribute() to 1.5] + expected: FAIL + + [link.referrerPolicy: setAttribute() to true] + expected: FAIL + + [link.referrerPolicy: setAttribute() to false] + expected: FAIL + + [link.referrerPolicy: setAttribute() to object "[object Object\]"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to NaN] + expected: FAIL + + [link.referrerPolicy: setAttribute() to Infinity] + expected: FAIL + + [link.referrerPolicy: setAttribute() to -Infinity] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to null] + expected: FAIL + + [link.referrerPolicy: setAttribute() to object "test-toString"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to object "test-valueOf"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "no-referrer"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xno-referrer"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "no-referrer\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "o-referrer"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "NO-REFERRER"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "no-referrer-when-downgrade"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xno-referrer-when-downgrade"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "no-referrer-when-downgrade\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "o-referrer-when-downgrade"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "NO-REFERRER-WHEN-DOWNGRADE"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "same-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xsame-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "same-origin\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "ame-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "SAME-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xorigin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "origin\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "rigin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "ORIGIN"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "strict-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xstrict-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "strict-origin\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "trict-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "STRICT-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xorigin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "origin-when-cross-origin\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "rigin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "strict-origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xstrict-origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "strict-origin-when-cross-origin\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "trict-origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "STRICT-ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "unsafe-url"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "xunsafe-url"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "unsafe-url\\0"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "nsafe-url"] + expected: FAIL + + [link.referrerPolicy: setAttribute() to "UNSAFE-URL"] + expected: FAIL + + [link.referrerPolicy: IDL set to ""] + expected: FAIL + + [link.referrerPolicy: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [link.referrerPolicy: IDL set to undefined] + expected: FAIL + + [link.referrerPolicy: IDL set to 7] + expected: FAIL + + [link.referrerPolicy: IDL set to 1.5] + expected: FAIL + + [link.referrerPolicy: IDL set to true] + expected: FAIL + + [link.referrerPolicy: IDL set to false] + expected: FAIL + + [link.referrerPolicy: IDL set to object "[object Object\]"] + expected: FAIL + + [link.referrerPolicy: IDL set to NaN] + expected: FAIL + + [link.referrerPolicy: IDL set to Infinity] + expected: FAIL + + [link.referrerPolicy: IDL set to -Infinity] + expected: FAIL + + [link.referrerPolicy: IDL set to "\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to null] + expected: FAIL + + [link.referrerPolicy: IDL set to object "test-toString"] + expected: FAIL + + [link.referrerPolicy: IDL set to object "test-valueOf"] + expected: FAIL + + [link.referrerPolicy: IDL set to "no-referrer"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xno-referrer"] + expected: FAIL + + [link.referrerPolicy: IDL set to "no-referrer\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "o-referrer"] + expected: FAIL + + [link.referrerPolicy: IDL set to "NO-REFERRER"] + expected: FAIL + + [link.referrerPolicy: IDL set to "no-referrer-when-downgrade"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xno-referrer-when-downgrade"] + expected: FAIL + + [link.referrerPolicy: IDL set to "no-referrer-when-downgrade\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "o-referrer-when-downgrade"] + expected: FAIL + + [link.referrerPolicy: IDL set to "NO-REFERRER-WHEN-DOWNGRADE"] + expected: FAIL + + [link.referrerPolicy: IDL set to "same-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xsame-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "same-origin\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "ame-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "SAME-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: IDL set to "origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xorigin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "origin\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "rigin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "ORIGIN"] + expected: FAIL + + [link.referrerPolicy: IDL set to "strict-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xstrict-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "strict-origin\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "trict-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "STRICT-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: IDL set to "origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xorigin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "origin-when-cross-origin\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "rigin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: IDL set to "strict-origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xstrict-origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "strict-origin-when-cross-origin\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "trict-origin-when-cross-origin"] + expected: FAIL + + [link.referrerPolicy: IDL set to "STRICT-ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [link.referrerPolicy: IDL set to "unsafe-url"] + expected: FAIL + + [link.referrerPolicy: IDL set to "xunsafe-url"] + expected: FAIL + + [link.referrerPolicy: IDL set to "unsafe-url\\0"] + expected: FAIL + + [link.referrerPolicy: IDL set to "nsafe-url"] + expected: FAIL + + [link.referrerPolicy: IDL set to "UNSAFE-URL"] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/reflection-misc.html.ini b/tests/wpt/metadata/html/dom/reflection-misc.html.ini index c14c806b41a..d5201c817db 100644 --- a/tests/wpt/metadata/html/dom/reflection-misc.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-misc.html.ini @@ -17514,3 +17514,195 @@ [undefinedelement.tabIndex: IDL set to -2147483648] expected: FAIL + [script.nonce: typeof IDL attribute] + expected: FAIL + + [script.nonce: IDL get with DOM attribute unset] + expected: FAIL + + [script.nonce: setAttribute() to ""] + expected: FAIL + + [script.nonce: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [script.nonce: setAttribute() to undefined] + expected: FAIL + + [script.nonce: setAttribute() to 7] + expected: FAIL + + [script.nonce: setAttribute() to 1.5] + expected: FAIL + + [script.nonce: setAttribute() to true] + expected: FAIL + + [script.nonce: setAttribute() to false] + expected: FAIL + + [script.nonce: setAttribute() to object "[object Object\]"] + expected: FAIL + + [script.nonce: setAttribute() to NaN] + expected: FAIL + + [script.nonce: setAttribute() to Infinity] + expected: FAIL + + [script.nonce: setAttribute() to -Infinity] + expected: FAIL + + [script.nonce: setAttribute() to "\\0"] + expected: FAIL + + [script.nonce: setAttribute() to null] + expected: FAIL + + [script.nonce: setAttribute() to object "test-toString"] + expected: FAIL + + [script.nonce: setAttribute() to object "test-valueOf"] + expected: FAIL + + [script.nonce: IDL set to ""] + expected: FAIL + + [script.nonce: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [script.nonce: IDL set to undefined] + expected: FAIL + + [script.nonce: IDL set to 7] + expected: FAIL + + [script.nonce: IDL set to 1.5] + expected: FAIL + + [script.nonce: IDL set to true] + expected: FAIL + + [script.nonce: IDL set to false] + expected: FAIL + + [script.nonce: IDL set to object "[object Object\]"] + expected: FAIL + + [script.nonce: IDL set to NaN] + expected: FAIL + + [script.nonce: IDL set to Infinity] + expected: FAIL + + [script.nonce: IDL set to -Infinity] + expected: FAIL + + [script.nonce: IDL set to "\\0"] + expected: FAIL + + [script.nonce: IDL set to null] + expected: FAIL + + [script.nonce: IDL set to object "test-toString"] + expected: FAIL + + [script.nonce: IDL set to object "test-valueOf"] + expected: FAIL + + [script.integrity: typeof IDL attribute] + expected: FAIL + + [script.integrity: IDL get with DOM attribute unset] + expected: FAIL + + [script.integrity: setAttribute() to ""] + expected: FAIL + + [script.integrity: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [script.integrity: setAttribute() to undefined] + expected: FAIL + + [script.integrity: setAttribute() to 7] + expected: FAIL + + [script.integrity: setAttribute() to 1.5] + expected: FAIL + + [script.integrity: setAttribute() to true] + expected: FAIL + + [script.integrity: setAttribute() to false] + expected: FAIL + + [script.integrity: setAttribute() to object "[object Object\]"] + expected: FAIL + + [script.integrity: setAttribute() to NaN] + expected: FAIL + + [script.integrity: setAttribute() to Infinity] + expected: FAIL + + [script.integrity: setAttribute() to -Infinity] + expected: FAIL + + [script.integrity: setAttribute() to "\\0"] + expected: FAIL + + [script.integrity: setAttribute() to null] + expected: FAIL + + [script.integrity: setAttribute() to object "test-toString"] + expected: FAIL + + [script.integrity: setAttribute() to object "test-valueOf"] + expected: FAIL + + [script.integrity: IDL set to ""] + expected: FAIL + + [script.integrity: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [script.integrity: IDL set to undefined] + expected: FAIL + + [script.integrity: IDL set to 7] + expected: FAIL + + [script.integrity: IDL set to 1.5] + expected: FAIL + + [script.integrity: IDL set to true] + expected: FAIL + + [script.integrity: IDL set to false] + expected: FAIL + + [script.integrity: IDL set to object "[object Object\]"] + expected: FAIL + + [script.integrity: IDL set to NaN] + expected: FAIL + + [script.integrity: IDL set to Infinity] + expected: FAIL + + [script.integrity: IDL set to -Infinity] + expected: FAIL + + [script.integrity: IDL set to "\\0"] + expected: FAIL + + [script.integrity: IDL set to null] + expected: FAIL + + [script.integrity: IDL set to object "test-toString"] + expected: FAIL + + [script.integrity: IDL set to object "test-valueOf"] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/reflection-text.html.ini b/tests/wpt/metadata/html/dom/reflection-text.html.ini index 2ba5073e928..7edf81d53a0 100644 --- a/tests/wpt/metadata/html/dom/reflection-text.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-text.html.ini @@ -34851,3 +34851,339 @@ [wbr.tabIndex: IDL set to -2147483648] expected: FAIL + [a.referrerPolicy: typeof IDL attribute] + expected: FAIL + + [a.referrerPolicy: IDL get with DOM attribute unset] + expected: FAIL + + [a.referrerPolicy: setAttribute() to ""] + expected: FAIL + + [a.referrerPolicy: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [a.referrerPolicy: setAttribute() to undefined] + expected: FAIL + + [a.referrerPolicy: setAttribute() to 7] + expected: FAIL + + [a.referrerPolicy: setAttribute() to 1.5] + expected: FAIL + + [a.referrerPolicy: setAttribute() to true] + expected: FAIL + + [a.referrerPolicy: setAttribute() to false] + expected: FAIL + + [a.referrerPolicy: setAttribute() to object "[object Object\]"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to NaN] + expected: FAIL + + [a.referrerPolicy: setAttribute() to Infinity] + expected: FAIL + + [a.referrerPolicy: setAttribute() to -Infinity] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to null] + expected: FAIL + + [a.referrerPolicy: setAttribute() to object "test-toString"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to object "test-valueOf"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "no-referrer"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xno-referrer"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "no-referrer\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "o-referrer"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "NO-REFERRER"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "no-referrer-when-downgrade"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xno-referrer-when-downgrade"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "no-referrer-when-downgrade\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "o-referrer-when-downgrade"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "NO-REFERRER-WHEN-DOWNGRADE"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "same-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xsame-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "same-origin\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "ame-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "SAME-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xorigin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "origin\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "rigin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "ORIGIN"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "strict-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xstrict-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "strict-origin\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "trict-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "STRICT-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xorigin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "origin-when-cross-origin\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "rigin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "strict-origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xstrict-origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "strict-origin-when-cross-origin\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "trict-origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "STRICT-ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "unsafe-url"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "xunsafe-url"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "unsafe-url\\0"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "nsafe-url"] + expected: FAIL + + [a.referrerPolicy: setAttribute() to "UNSAFE-URL"] + expected: FAIL + + [a.referrerPolicy: IDL set to ""] + expected: FAIL + + [a.referrerPolicy: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "] + expected: FAIL + + [a.referrerPolicy: IDL set to undefined] + expected: FAIL + + [a.referrerPolicy: IDL set to 7] + expected: FAIL + + [a.referrerPolicy: IDL set to 1.5] + expected: FAIL + + [a.referrerPolicy: IDL set to true] + expected: FAIL + + [a.referrerPolicy: IDL set to false] + expected: FAIL + + [a.referrerPolicy: IDL set to object "[object Object\]"] + expected: FAIL + + [a.referrerPolicy: IDL set to NaN] + expected: FAIL + + [a.referrerPolicy: IDL set to Infinity] + expected: FAIL + + [a.referrerPolicy: IDL set to -Infinity] + expected: FAIL + + [a.referrerPolicy: IDL set to "\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to null] + expected: FAIL + + [a.referrerPolicy: IDL set to object "test-toString"] + expected: FAIL + + [a.referrerPolicy: IDL set to object "test-valueOf"] + expected: FAIL + + [a.referrerPolicy: IDL set to "no-referrer"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xno-referrer"] + expected: FAIL + + [a.referrerPolicy: IDL set to "no-referrer\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "o-referrer"] + expected: FAIL + + [a.referrerPolicy: IDL set to "NO-REFERRER"] + expected: FAIL + + [a.referrerPolicy: IDL set to "no-referrer-when-downgrade"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xno-referrer-when-downgrade"] + expected: FAIL + + [a.referrerPolicy: IDL set to "no-referrer-when-downgrade\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "o-referrer-when-downgrade"] + expected: FAIL + + [a.referrerPolicy: IDL set to "NO-REFERRER-WHEN-DOWNGRADE"] + expected: FAIL + + [a.referrerPolicy: IDL set to "same-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xsame-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "same-origin\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "ame-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "SAME-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: IDL set to "origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xorigin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "origin\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "rigin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "ORIGIN"] + expected: FAIL + + [a.referrerPolicy: IDL set to "strict-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xstrict-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "strict-origin\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "trict-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "STRICT-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: IDL set to "origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xorigin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "origin-when-cross-origin\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "rigin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: IDL set to "strict-origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xstrict-origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "strict-origin-when-cross-origin\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "trict-origin-when-cross-origin"] + expected: FAIL + + [a.referrerPolicy: IDL set to "STRICT-ORIGIN-WHEN-CROSS-ORIGIN"] + expected: FAIL + + [a.referrerPolicy: IDL set to "unsafe-url"] + expected: FAIL + + [a.referrerPolicy: IDL set to "xunsafe-url"] + expected: FAIL + + [a.referrerPolicy: IDL set to "unsafe-url\\0"] + expected: FAIL + + [a.referrerPolicy: IDL set to "nsafe-url"] + expected: FAIL + + [a.referrerPolicy: IDL set to "UNSAFE-URL"] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html.ini new file mode 100644 index 00000000000..31cc9479ba2 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html.ini @@ -0,0 +1,3 @@ +[allow-scripts-flag-changing-1.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html.ini new file mode 100644 index 00000000000..ae277f7405b --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html.ini @@ -0,0 +1,3 @@ +[allow-scripts-flag-changing-2.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html.ini new file mode 100644 index 00000000000..a4c2207ab74 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html.ini @@ -0,0 +1,3 @@ +[dynamic-append.html] + type: testharness + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini new file mode 100644 index 00000000000..07dd3f915c2 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini @@ -0,0 +1,3 @@ +[moving-documents.html] + type: testharness + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html.ini new file mode 100644 index 00000000000..e88e24f90d0 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html.ini @@ -0,0 +1,5 @@ +[not-in-shadow-tree.html] + type: testharness + [Meta refresh only applies while in the document tree, not in a shadow tree] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html.ini index 021d2d2fa06..7d040c9c4c0 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html.ini @@ -9,9 +9,3 @@ [iframe-sandbox-allowfullscreen-dialog] expected: FAIL - [iframe-noload-noallowfullscreen] - expected: FAIL - - [iframe-noload-allowfullscreen] - expected: FAIL - diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini new file mode 100644 index 00000000000..3dc6bf39d61 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini @@ -0,0 +1,20 @@ +[basic.html] + type: testharness + [window.requestIdleCallback is defined] + expected: FAIL + + [window.cancelIdleCallback is defined] + expected: FAIL + + [window.requestIdleCallback() returns a number] + expected: FAIL + + [window.cancelIdleCallback() returns undefined] + expected: FAIL + + [requestIdleCallback schedules callbacks] + expected: FAIL + + [cancelIdleCallback cancels callbacks] + expected: FAIL + diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-idle-periods.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-idle-periods.html.ini new file mode 100644 index 00000000000..ac23a24ab20 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-idle-periods.html.ini @@ -0,0 +1,9 @@ +[callback-idle-periods.html] + type: testharness + expected: ERROR + [requestIdleCallback can run multiple different requestIdleCallback callbacks in the same idle period.] + expected: FAIL + + [Check that if an idle callback calls requestIdleCallback the new callback doesn't run in the current idle period.] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini new file mode 100644 index 00000000000..d5f94e35b64 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini @@ -0,0 +1,8 @@ +[callback-timeout-with-raf.html] + type: testharness + [requestIdleCallback not scheduled when event loop is busy.] + expected: FAIL + + [requestIdleCallback scheduled with timeout when event loop is busy.] + expected: FAIL + diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-onauxclick.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-onauxclick.html.ini new file mode 100644 index 00000000000..492f3a98da6 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-onauxclick.html.ini @@ -0,0 +1,3 @@ +[event-handler-onauxclick.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/mozilla-sync b/tests/wpt/metadata/mozilla-sync index 7ba5d85c476..e68ebc02c41 100644 --- a/tests/wpt/metadata/mozilla-sync +++ b/tests/wpt/metadata/mozilla-sync @@ -1 +1 @@ -395981742475612eac7ef0bd484b4ae1bc1dd4a8
\ No newline at end of file +81ca858678953105ee97f482eb3900729fa4d696
\ No newline at end of file diff --git a/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini b/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini new file mode 100644 index 00000000000..5654187aafc --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini @@ -0,0 +1,47 @@ +[nav2_idlharness.html] + type: testharness + [PerformanceNavigationTiming interface: existence and properties of interface object] + expected: FAIL + + [PerformanceNavigationTiming interface object length] + expected: FAIL + + [PerformanceNavigationTiming interface object name] + expected: FAIL + + [PerformanceNavigationTiming interface: existence and properties of interface prototype object] + expected: FAIL + + [PerformanceNavigationTiming interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute unloadEventStart] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute unloadEventEnd] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute domInteractive] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute domContentLoadedEventStart] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute domContentLoadedEventEnd] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute domComplete] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute loadEventStart] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute loadEventEnd] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute type] + expected: FAIL + + [PerformanceNavigationTiming interface: attribute redirectCount] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_attributes_exist.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_attributes_exist.html.ini new file mode 100644 index 00000000000..d5aa84ebe6f --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_attributes_exist.html.ini @@ -0,0 +1,5 @@ +[nav2_test_attributes_exist.html] + type: testharness + [Performance navigation timing entries are observable.] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_attributes_values.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_attributes_values.html.ini new file mode 100644 index 00000000000..c70527cfed7 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_attributes_values.html.ini @@ -0,0 +1,5 @@ +[nav2_test_attributes_values.html] + type: testharness + [Performance navigation timing instance's value is reasonable.] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_document_open.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_document_open.html.ini new file mode 100644 index 00000000000..d2a706e2d16 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_document_open.html.ini @@ -0,0 +1,3 @@ +[nav2_test_document_open.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_instance_accessors.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_instance_accessors.html.ini new file mode 100644 index 00000000000..a75dbdb2c0c --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_instance_accessors.html.ini @@ -0,0 +1,5 @@ +[nav2_test_instance_accessors.html] + type: testharness + [Performance navigation timing entries are accessible through three different accessors.] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_navigate_within_document.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_navigate_within_document.html.ini new file mode 100644 index 00000000000..ab6bcca4ec1 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_navigate_within_document.html.ini @@ -0,0 +1,3 @@ +[nav2_test_navigate_within_document.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_backforward.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_backforward.html.ini new file mode 100644 index 00000000000..32037a0f758 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_backforward.html.ini @@ -0,0 +1,3 @@ +[nav2_test_navigation_type_backforward.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_navigate.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_navigate.html.ini new file mode 100644 index 00000000000..e14d5984612 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_navigate.html.ini @@ -0,0 +1,5 @@ +[nav2_test_navigation_type_navigate.html] + type: testharness + [Navigation type to be navigate.] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_reload.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_reload.html.ini new file mode 100644 index 00000000000..d228bee3e72 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_navigation_type_reload.html.ini @@ -0,0 +1,3 @@ +[nav2_test_navigation_type_reload.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_open_blank_page.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_open_blank_page.html.ini new file mode 100644 index 00000000000..5fe0d9f313f --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_open_blank_page.html.ini @@ -0,0 +1,3 @@ +[nav2_test_open_blank_page.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_redirect_none.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_none.html.ini new file mode 100644 index 00000000000..e3727d63e81 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_none.html.ini @@ -0,0 +1,5 @@ +[nav2_test_redirect_none.html] + type: testharness + [Naivation without redirects.] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_redirect_server.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_server.html.ini new file mode 100644 index 00000000000..90bfeed274c --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_server.html.ini @@ -0,0 +1,3 @@ +[nav2_test_redirect_server.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_redirect_xserver.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_xserver.html.ini new file mode 100644 index 00000000000..809815ce175 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_xserver.html.ini @@ -0,0 +1,3 @@ +[nav2_test_redirect_xserver.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_redirect_xserver_opt_in.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_xserver_opt_in.html.ini new file mode 100644 index 00000000000..f0581f5429f --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_redirect_xserver_opt_in.html.ini @@ -0,0 +1,3 @@ +[nav2_test_redirect_xserver_opt_in.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_unique_nav_instances.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_unique_nav_instances.html.ini new file mode 100644 index 00000000000..695df4f36e3 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_unique_nav_instances.html.ini @@ -0,0 +1,5 @@ +[nav2_test_unique_nav_instances.html] + type: testharness + [Each window has a unique nav timing 2 instance.] + expected: FAIL + diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_no_previous_document.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_no_previous_document.html.ini new file mode 100644 index 00000000000..fc4faa38ddc --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_no_previous_document.html.ini @@ -0,0 +1,3 @@ +[nav2_test_unloadEvents_no_previous_document.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html.ini new file mode 100644 index 00000000000..ed513658727 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html.ini @@ -0,0 +1,3 @@ +[nav2_test_unloadEvents_previous_document_cross_origin.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html.ini new file mode 100644 index 00000000000..334e12092a5 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html.ini @@ -0,0 +1,3 @@ +[nav2_test_unloadEvents_with_cross_origin_redirects.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_with_previous_document.html.ini b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_with_previous_document.html.ini new file mode 100644 index 00000000000..c4b9e3696e7 --- /dev/null +++ b/tests/wpt/metadata/navigation-timing/nav2_test_unloadEvents_with_previous_document.html.ini @@ -0,0 +1,3 @@ +[nav2_test_unloadEvents_with_previous_document.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/metadata/uievents/constructors/inputevent-constructor.html.ini b/tests/wpt/metadata/uievents/constructors/inputevent-constructor.html.ini new file mode 100644 index 00000000000..6cbae2e0058 --- /dev/null +++ b/tests/wpt/metadata/uievents/constructors/inputevent-constructor.html.ini @@ -0,0 +1,14 @@ +[inputevent-constructor.html] + type: testharness + [InputEvent constructor without InputEventInit.] + expected: FAIL + + [InputEvent construtor with InputEventInit where data is null] + expected: FAIL + + [InputEvent construtor with InputEventInit where data is empty string] + expected: FAIL + + [InputEvent construtor with InputEventInit where data is non empty string] + expected: FAIL + diff --git a/tests/wpt/metadata/url/a-element-origin-xhtml.xhtml.ini b/tests/wpt/metadata/url/a-element-origin-xhtml.xhtml.ini new file mode 100644 index 00000000000..a2733e59c15 --- /dev/null +++ b/tests/wpt/metadata/url/a-element-origin-xhtml.xhtml.ini @@ -0,0 +1,8 @@ +[a-element-origin-xhtml.xhtml] + type: testharness + [Parsing origin: <http://[::127.0.0.1\]> against <http://example.org/foo/bar>] + expected: FAIL + + [Parsing origin: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>] + expected: FAIL + diff --git a/tests/wpt/metadata/url/a-element-origin.html.ini b/tests/wpt/metadata/url/a-element-origin.html.ini new file mode 100644 index 00000000000..3a6915a3204 --- /dev/null +++ b/tests/wpt/metadata/url/a-element-origin.html.ini @@ -0,0 +1,8 @@ +[a-element-origin.html] + type: testharness + [Parsing origin: <http://[::127.0.0.1\]> against <http://example.org/foo/bar>] + expected: FAIL + + [Parsing origin: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>] + expected: FAIL + diff --git a/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini b/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini index a922573a689..4ef4002ed19 100644 --- a/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini +++ b/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini @@ -6,3 +6,24 @@ [Parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>] expected: FAIL + [Parsing: <#β> against <http://example.org/foo/bar>] + expected: FAIL + + [Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank>] + expected: FAIL + + [Parsing: <data:test# »> against <about:blank>] + expected: FAIL + + [Parsing: <http://foo.bar/baz?qux#foo\x08bar> against <about:blank>] + expected: FAIL + + [Parsing: <http://10000000000> against <http://other.com/>] + expected: FAIL + + [Parsing: <http://4294967296> against <http://other.com/>] + expected: FAIL + + [Parsing: <http://0xffffffff1> against <http://other.com/>] + expected: FAIL + diff --git a/tests/wpt/metadata/url/a-element.html.ini b/tests/wpt/metadata/url/a-element.html.ini index 2ba0d5823e8..7e402bd312c 100644 --- a/tests/wpt/metadata/url/a-element.html.ini +++ b/tests/wpt/metadata/url/a-element.html.ini @@ -6,3 +6,24 @@ [Parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>] expected: FAIL + [Parsing: <#β> against <http://example.org/foo/bar>] + expected: FAIL + + [Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank>] + expected: FAIL + + [Parsing: <data:test# »> against <about:blank>] + expected: FAIL + + [Parsing: <http://foo.bar/baz?qux#foo\x08bar> against <about:blank>] + expected: FAIL + + [Parsing: <http://10000000000> against <http://other.com/>] + expected: FAIL + + [Parsing: <http://4294967296> against <http://other.com/>] + expected: FAIL + + [Parsing: <http://0xffffffff1> against <http://other.com/>] + expected: FAIL + diff --git a/tests/wpt/metadata/url/url-constructor.html.ini b/tests/wpt/metadata/url/url-constructor.html.ini index 6c177284507..c3721bf9e24 100644 --- a/tests/wpt/metadata/url/url-constructor.html.ini +++ b/tests/wpt/metadata/url/url-constructor.html.ini @@ -6,3 +6,24 @@ [Parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>] expected: FAIL + [Parsing: <#β> against <http://example.org/foo/bar>] + expected: FAIL + + [Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank>] + expected: FAIL + + [Parsing: <data:test# »> against <about:blank>] + expected: FAIL + + [Parsing: <http://foo.bar/baz?qux#foo\x08bar> against <about:blank>] + expected: FAIL + + [Parsing: <http://10000000000> against <http://other.com/>] + expected: FAIL + + [Parsing: <http://4294967296> against <http://other.com/>] + expected: FAIL + + [Parsing: <http://0xffffffff1> against <http://other.com/>] + expected: FAIL + diff --git a/tests/wpt/metadata/url/url-origin.html.ini b/tests/wpt/metadata/url/url-origin.html.ini new file mode 100644 index 00000000000..a78d01831e9 --- /dev/null +++ b/tests/wpt/metadata/url/url-origin.html.ini @@ -0,0 +1,8 @@ +[url-origin.html] + type: testharness + [Origin parsing: <http://[::127.0.0.1\]> against <http://example.org/foo/bar>] + expected: FAIL + + [Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>] + expected: FAIL + diff --git a/tests/wpt/metadata/url/url-setters.html.ini b/tests/wpt/metadata/url/url-setters.html.ini index 12c268fa20b..39590be1596 100644 --- a/tests/wpt/metadata/url/url-setters.html.ini +++ b/tests/wpt/metadata/url/url-setters.html.ini @@ -396,3 +396,18 @@ [<area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is] expected: FAIL + [URL: Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~Éé' Simple percent-encoding; nuls, tabs, and newlines are removed] + expected: FAIL + + [<a>: Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~Éé' Simple percent-encoding; nuls, tabs, and newlines are removed] + expected: FAIL + + [<area>: Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~Éé' Simple percent-encoding; nuls, tabs, and newlines are removed] + expected: FAIL + + [URL: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is] + expected: FAIL + + [<a>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is] + expected: FAIL + diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/reading/read-pixels-test.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/reading/read-pixels-test.html.ini index 78f5aa7b940..22325f1fe6d 100644 --- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/reading/read-pixels-test.html.ini +++ b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/reading/read-pixels-test.html.ini @@ -2,4 +2,3 @@ type: testharness expected: TIMEOUT bug: https://github.com/servo/servo/issues/14380 - diff --git a/tests/wpt/metadata/workers/opaque-origin.html.ini b/tests/wpt/metadata/workers/opaque-origin.html.ini new file mode 100644 index 00000000000..3eb04ccfff3 --- /dev/null +++ b/tests/wpt/metadata/workers/opaque-origin.html.ini @@ -0,0 +1,3 @@ +[opaque-origin.html] + type: testharness + expected: ERROR diff --git a/tests/wpt/mozilla/meta/mozilla/bluetooth/advertisingEvent/watchAdvertisements-succeeds.html.ini b/tests/wpt/mozilla/meta/mozilla/bluetooth/advertisingEvent/watchAdvertisements-succeeds.html.ini index da628804692..1f76e4693ce 100644 --- a/tests/wpt/mozilla/meta/mozilla/bluetooth/advertisingEvent/watchAdvertisements-succeeds.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/bluetooth/advertisingEvent/watchAdvertisements-succeeds.html.ini @@ -2,3 +2,4 @@ type: testharness [watchAdvertisements should succeed.] expected: FAIL + diff --git a/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.operation.clear.html b/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.operation.clear.html index 7212cd05f1e..8f1b834ae27 100644 --- a/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.operation.clear.html +++ b/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.operation.clear.html @@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) { ctx.globalCompositeOperation = 'xor'; ctx.globalCompositeOperation = 'clear'; -_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); +_assertSame(ctx.globalCompositeOperation, 'clear', "ctx.globalCompositeOperation", "'clear'"); }); diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html index e14f5d3b361..5f1c7fa6d6e 100644 --- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html +++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html @@ -25,15 +25,15 @@ ctx.fillRect(0, 0, 100, 50); var canvas2 = document.createElement('canvas'); canvas2.width = 0; canvas2.height = 10; -assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); }); +ctx.drawImage(canvas2, 0, 0); canvas2.width = 10; canvas2.height = 0; -assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); }); +ctx.drawImage(canvas2, 0, 0); canvas2.width = 0; canvas2.height = 0; -assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); }); +ctx.drawImage(canvas2, 0, 0); _assertPixelApprox(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html index 6906284e00a..be04a70588c 100644 --- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html +++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html @@ -8,7 +8,7 @@ <body class="show_output"> <h1>2d.drawImage.zerosource</h1> -<p class="desc">drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR</p> +<p class="desc">drawImage with zero-sized source rectangle draws nothing without exception</p> <p class="output">Actual output:</p> @@ -16,14 +16,14 @@ <p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt=""> <ul id="d"></ul> <script> -var t = async_test("drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR"); +var t = async_test("drawImage with zero-sized source rectangle draws nothing without exception"); _addTest(function(canvas, ctx) { ctx.fillStyle = '#0f0'; ctx.fillRect(0, 0, 100, 50); -assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 1, 0, 0, 100, 50); }); -assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(document.getElementById('red.png'), 10, 10, 1, 0, 0, 0, 100, 50); }); -assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 0, 0, 0, 100, 50); }); +ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 1, 0, 0, 100, 50); +ctx.drawImage(document.getElementById('red.png'), 10, 10, 1, 0, 0, 0, 100, 50); +ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 0, 0, 0, 100, 50); _assertPixelApprox(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/gentest.py b/tests/wpt/web-platform-tests/2dcontext/tools/gentest.py index 079f476d2d3..c15f242d2fa 100644 --- a/tests/wpt/web-platform-tests/2dcontext/tools/gentest.py +++ b/tests/wpt/web-platform-tests/2dcontext/tools/gentest.py @@ -1,787 +1,3 @@ -# Copyright (c) 2010 Philip Taylor -# Released under the BSD license and W3C Test Suite License: see LICENSE.txt +from gentestutils import genTestUtils -# Current code status: -# -# This was originally written for use at -# http://philip.html5.org/tests/canvas/suite/tests/ -# -# It has been adapted for use with the Web Platform Test Suite suite at -# https://github.com/w3c/web-platform-tests/ -# -# The W3C version excludes a number of features (multiple versions of each test -# case of varying verbosity, Mozilla mochitests, semi-automated test harness) -# to focus on simply providing reviewable test cases. It also expects a different -# directory structure. -# This code attempts to support both versions, but the non-W3C version hasn't -# been tested recently and is probably broken. - -# To update or add test cases: -# -# * Modify the tests*.yaml files. -# 'name' is an arbitrary hierarchical name to help categorise tests. -# 'desc' is a rough description of what behaviour the test aims to test. -# 'testing' is a list of references to spec.yaml, to show which spec sentences -# this test case is primarily testing. -# 'code' is JavaScript code to execute, with some special commands starting with '@' -# 'expected' is what the final canvas output should be: a string 'green' or 'clear' -# (100x50 images in both cases), or a string 'size 100 50' (or any other size) -# followed by Python code using Pycairo to generate the image. -# -# * Run "python gentest.py". -# This requires a few Python modules which might not be ubiquitous. -# It has only been tested on Linux. -# It will usually emit some warnings, which ideally should be fixed but can -# generally be safely ignored. -# -# * Test the tests, add new ones to Git, remove deleted ones from Git, etc. - -import re -import codecs -import time -import os -import shutil -import sys -import xml.dom.minidom -from xml.dom.minidom import Node - -import cairo - -try: - import syck as yaml # compatible and lots faster -except ImportError: - import yaml - -# Default mode is for the W3C test suite; the --standalone option -# generates various extra files that aren't needed there -W3CMODE = True -if '--standalone' in sys.argv: - W3CMODE = False - -TESTOUTPUTDIR = '../../2dcontext' -IMAGEOUTPUTDIR = '../../2dcontext' -MISCOUTPUTDIR = './output' -SPECOUTPUTDIR = '../../annotated-spec' - -SPECOUTPUTPATH = '../annotated-spec' # relative to TESTOUTPUTDIR - -def simpleEscapeJS(str): - return str.replace('\\', '\\\\').replace('"', '\\"') - -def escapeJS(str): - str = simpleEscapeJS(str) - str = re.sub(r'\[(\w+)\]', r'[\\""+(\1)+"\\"]', str) # kind of an ugly hack, for nicer failure-message output - return str - -def escapeHTML(str): - return str.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"') - -def expand_nonfinite(method, argstr, tail): - """ - >>> print expand_nonfinite('f', '<0 a>, <0 b>', ';') - f(a, 0); - f(0, b); - f(a, b); - >>> print expand_nonfinite('f', '<0 a>, <0 b c>, <0 d>', ';') - f(a, 0, 0); - f(0, b, 0); - f(0, c, 0); - f(0, 0, d); - f(a, b, 0); - f(a, b, d); - f(a, 0, d); - f(0, b, d); - """ - # argstr is "<valid-1 invalid1-1 invalid2-1 ...>, ..." (where usually - # 'invalid' is Infinity/-Infinity/NaN) - args = [] - for arg in argstr.split(', '): - a = re.match('<(.*)>', arg).group(1) - args.append(a.split(' ')) - calls = [] - # Start with the valid argument list - call = [ args[j][0] for j in range(len(args)) ] - # For each argument alone, try setting it to all its invalid values: - for i in range(len(args)): - for a in args[i][1:]: - c2 = call[:] - c2[i] = a - calls.append(c2) - # For all combinations of >= 2 arguments, try setting them to their - # first invalid values. (Don't do all invalid values, because the - # number of combinations explodes.) - def f(c, start, depth): - for i in range(start, len(args)): - if len(args[i]) > 1: - a = args[i][1] - c2 = c[:] - c2[i] = a - if depth > 0: calls.append(c2) - f(c2, i+1, depth+1) - f(call, 0, 0) - - return '\n'.join('%s(%s)%s' % (method, ', '.join(c), tail) for c in calls) - -# Run with --test argument to run unit tests -if len(sys.argv) > 1 and sys.argv[1] == '--test': - import doctest - doctest.testmod() - sys.exit() - -templates = yaml.load(open('templates.yaml', "r").read()) -name_mapping = yaml.load(open('name2dir.yaml', "r").read()) - -spec_assertions = [] -for s in yaml.load(open('spec.yaml', "r").read())['assertions']: - if 'meta' in s: - eval(compile(s['meta'], '<meta spec assertion>', 'exec'), {}, {'assertions':spec_assertions}) - else: - spec_assertions.append(s) - -tests = [] -for t in sum([ yaml.load(open(f, "r").read()) for f in ['tests.yaml', 'tests2d.yaml', 'tests2dtext.yaml']], []): - if 'DISABLED' in t: - continue - if 'meta' in t: - eval(compile(t['meta'], '<meta test>', 'exec'), {}, {'tests':tests}) - else: - tests.append(t) - -category_names = [] -category_contents_direct = {} -category_contents_all = {} - -spec_ids = {} -for t in spec_assertions: spec_ids[t['id']] = True -spec_refs = {} - -def backref_html(name): - backrefs = [] - c = '' - for p in name.split('.')[:-1]: - c += '.'+p - backrefs.append('<a href="index%s.html">%s</a>.' % (c, p)) - backrefs.append(name.split('.')[-1]) - return ''.join(backrefs) - -def make_flat_image(filename, w, h, r,g,b,a): - if os.path.exists('%s/%s' % (IMAGEOUTPUTDIR, filename)): - return filename - surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) - cr = cairo.Context(surface) - cr.set_source_rgba(r, g, b, a) - cr.rectangle(0, 0, w, h) - cr.fill() - surface.write_to_png('%s/%s' % (IMAGEOUTPUTDIR, filename)) - return filename - -# Ensure the test output directories exist -testdirs = [TESTOUTPUTDIR, IMAGEOUTPUTDIR, MISCOUTPUTDIR] -if not W3CMODE: testdirs.append('%s/mochitests' % MISCOUTPUTDIR) -else: - for map_dir in set(name_mapping.values()): - testdirs.append("%s/%s" % (TESTOUTPUTDIR, map_dir)) -for d in testdirs: - try: os.mkdir(d) - except: pass # ignore if it already exists - -mochitests = [] -used_images = {} - -def expand_test_code(code): - code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code) # must come before '@assert throws' - - code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);', - r'_assertPixel(canvas, \1, \2, "\1", "\2");', - code) - - code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);', - r'_assertPixelApprox(canvas, \1, \2, "\1", "\2", 2);', - code) - - code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);', - r'_assertPixelApprox(canvas, \1, \2, "\1", "\2", \3);', - code) - - code = re.sub(r'@assert throws (\S+_ERR) (.*);', - r'assert_throws("\1", function() { \2; });', - code) - - code = re.sub(r'@assert throws (\S+Error) (.*);', - r'assert_throws(new \1(), function() { \2; });', - code) - - code = re.sub(r'@assert throws (.*);', - r'assert_throws(null, function() { \1; });', - code) - - code = re.sub(r'@assert (.*) === (.*);', - lambda m: '_assertSame(%s, %s, "%s", "%s");' - % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2))) - , code) - - code = re.sub(r'@assert (.*) !== (.*);', - lambda m: '_assertDifferent(%s, %s, "%s", "%s");' - % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2))) - , code) - - code = re.sub(r'@assert (.*) =~ (.*);', - lambda m: 'assert_regexp_match(%s, %s);' - % (m.group(1), m.group(2)) - , code) - - code = re.sub(r'@assert (.*);', - lambda m: '_assert(%s, "%s");' - % (m.group(1), escapeJS(m.group(1))) - , code) - - code = re.sub(r' @moz-todo', '', code) - - code = re.sub(r'@moz-UniversalBrowserRead;', - "" - , code) - - assert('@' not in code) - - return code - -def expand_mochitest_code(code): - code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code) - - code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);', - r'isPixel(ctx, \1, \2, "\1", "\2", 0);', - code) - - code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);', - r'isPixel(ctx, \1, \2, "\1", "\2", 2);', - code) - - code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);', - r'isPixel(ctx, \1, \2, "\1", "\2", \3);', - code) - - code = re.sub(r'@assert throws (\S+_ERR) (.*);', - lambda m: 'var _thrown = undefined; try {\n %s;\n} catch (e) { _thrown = e }; ok(_thrown && _thrown.code == DOMException.%s, "should throw %s");' - % (m.group(2), m.group(1), m.group(1)) - , code) - - code = re.sub(r'@assert throws (\S+Error) (.*);', - lambda m: 'var _thrown = undefined; try {\n %s;\n} catch (e) { _thrown = e }; ok(_thrown && (_thrown instanceof %s), "should throw %s");' - % (m.group(2), m.group(1), m.group(1)) - , code) - - code = re.sub(r'@assert throws (.*);', - lambda m: 'try { var _thrown = false;\n %s;\n} catch (e) { _thrown = true; } finally { ok(_thrown, "should throw exception"); }' - % (m.group(1)) - , code) - - code = re.sub(r'@assert (.*) =~ (.*);', - lambda m: 'ok(%s.match(%s), "%s.match(%s)");' - % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2))) - , code) - - code = re.sub(r'@assert (.*);', - lambda m: 'ok(%s, "%s");' - % (m.group(1), escapeJS(m.group(1))) - , code) - - code = re.sub(r'((?:^|\n|;)\s*)ok(.*;) @moz-todo', - lambda m: '%stodo%s' - % (m.group(1), m.group(2)) - , code) - - code = re.sub(r'((?:^|\n|;)\s*)(is.*;) @moz-todo', - lambda m: '%stodo_%s' - % (m.group(1), m.group(2)) - , code) - - code = re.sub(r'@moz-UniversalBrowserRead;', - "netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');" - , code) - - code = code.replace('../images/', 'image_') - - assert '@' not in code, '@ not in code:\n%s' % code - - return code - -used_tests = {} -for i in range(len(tests)): - test = tests[i] - - name = test['name'] - print "\r(%s)" % name, " "*32, "\t", - - if name in used_tests: - print "Test %s is defined twice" % name - used_tests[name] = 1 - - mapped_name = None - for mn in sorted(name_mapping.keys(), key=len, reverse=True): - if name.startswith(mn): - mapped_name = "%s/%s" % (name_mapping[mn], name) - break - if not mapped_name: - print "LIKELY ERROR: %s has no defined target directory mapping" % name - mapped_name = name - if 'manual' in test: - mapped_name += "-manual" - - cat_total = '' - for cat_part in [''] + name.split('.')[:-1]: - cat_total += cat_part+'.' - if not cat_total in category_names: category_names.append(cat_total) - category_contents_all.setdefault(cat_total, []).append(name) - category_contents_direct.setdefault(cat_total, []).append(name) - - for ref in test.get('testing', []): - if ref not in spec_ids: - print "Test %s uses nonexistent spec point %s" % (name, ref) - spec_refs.setdefault(ref, []).append(name) - #if not (len(test.get('testing', [])) or 'mozilla' in test): - if not test.get('testing', []): - print "Test %s doesn't refer to any spec points" % name - - if test.get('expected', '') == 'green' and re.search(r'@assert pixel .* 0,0,0,0;', test['code']): - print "Probable incorrect pixel test in %s" % name - - code = expand_test_code(test['code']) - - mochitest = not (W3CMODE or 'manual' in test or 'disabled' in test.get('mozilla', {})) - if mochitest: - mochi_code = expand_mochitest_code(test['code']) - - mochi_name = name - if 'mozilla' in test: - if 'throws' in test['mozilla']: - mochi_code = templates['mochitest.exception'] % mochi_code - if 'bug' in test['mozilla']: - mochi_name = "%s - bug %s" % (name, test['mozilla']['bug']) - - if 'desc' in test: - mochi_desc = '<!-- Testing: %s -->\n' % test['desc'] - else: - mochi_desc = '' - - if 'deferTest' in mochi_code: - mochi_setup = '' - mochi_footer = '' - else: - mochi_setup = '' - mochi_footer = 'SimpleTest.finish();\n' - - for f in ['isPixel', 'todo_isPixel', 'deferTest', 'wrapFunction']: - if f in mochi_code: - mochi_setup += templates['mochitest.%s' % f] - else: - if not W3CMODE: - print "Skipping mochitest for %s" % name - mochi_name = '' - mochi_desc = '' - mochi_code = '' - mochi_setup = '' - mochi_footer = '' - - expectation_html = '' - if 'expected' in test and test['expected'] is not None: - expected = test['expected'] - expected_img = None - if expected == 'green': - expected_img = make_flat_image('green-100x50.png', 100, 50, 0,1,0,1) - if W3CMODE: expected_img = "/images/" + expected_img - elif expected == 'clear': - expected_img = make_flat_image('clear-100x50.png', 100, 50, 0,0,0,0) - if W3CMODE: expected_img = "/images/" + expected_img - else: - if ';' in expected: print "Found semicolon in %s" % name - expected = re.sub(r'^size (\d+) (\d+)', - r'surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, \1, \2)\ncr = cairo.Context(surface)', - expected) - - if mapped_name.endswith("-manual"): - png_name = mapped_name[:-len("-manual")] - else: - png_name = mapped_name - expected += "\nsurface.write_to_png('%s/%s.png')\n" % (IMAGEOUTPUTDIR, png_name) - eval(compile(expected, '<test %s>' % test['name'], 'exec'), {}, {'cairo':cairo}) - expected_img = "%s.png" % name - - if expected_img: - expectation_html = ('<p class="output expectedtext">Expected output:' + - '<p><img src="%s" class="output expected" id="expected" alt="">' % (expected_img)) - - canvas = test.get('canvas', 'width="100" height="50"') - - prev = tests[i-1]['name'] if i != 0 else 'index' - next = tests[i+1]['name'] if i != len(tests)-1 else 'index' - - name_wrapped = name.replace('.', '.​') # (see https://bugzilla.mozilla.org/show_bug.cgi?id=376188) - - refs = ''.join('<li><a href="%s/canvas.html#testrefs.%s">%s</a>\n' % (SPECOUTPUTPATH, n,n) for n in test.get('testing', [])) - if not W3CMODE and 'mozilla' in test and 'bug' in test['mozilla']: - refs += '<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=%d">Bugzilla</a>' % test['mozilla']['bug'] - - notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else '' - - scripts = '' - for s in test.get('scripts', []): - scripts += '<script src="%s"></script>\n' % (s) - - images = '' - for i in test.get('images', []): - id = i.split('/')[-1] - if '/' not in i: - used_images[i] = 1 - i = '../images/%s' % i - images += '<img src="%s" id="%s" class="resource">\n' % (i,id) - mochi_images = images.replace('../images/', 'image_') - if W3CMODE: images = images.replace("../images/", "/images/") - - fonts = '' - fonthack = '' - for i in test.get('fonts', []): - fonts += '@font-face {\n font-family: %s;\n src: url("/fonts/%s.ttf");\n}\n' % (i, i) - # Browsers require the font to actually be used in the page - if test.get('fonthack', 1): - fonthack += '<span style="font-family: %s; position: absolute; visibility: hidden">A</span>\n' % i - if fonts: - fonts = '<style>\n%s</style>\n' % fonts - - fallback = test.get('fallback', '<p class="fallback">FAIL (fallback content)</p>') - - desc = test.get('desc', '') - escaped_desc = simpleEscapeJS(desc) - template_params = { - 'name':name, 'name_wrapped':name_wrapped, 'backrefs':backref_html(name), - 'mapped_name':mapped_name, - 'desc':desc, 'escaped_desc':escaped_desc, - 'prev':prev, 'next':next, 'refs':refs, 'notes':notes, 'images':images, - 'fonts':fonts, 'fonthack':fonthack, - 'canvas':canvas, 'expected':expectation_html, 'code':code, 'scripts':scripts, - 'mochi_name':mochi_name, 'mochi_desc':mochi_desc, 'mochi_code':mochi_code, - 'mochi_setup':mochi_setup, 'mochi_footer':mochi_footer, 'mochi_images':mochi_images, - 'fallback':fallback - } - - if W3CMODE: - f = codecs.open('%s/%s.html' % (TESTOUTPUTDIR, mapped_name), 'w', 'utf-8') - f.write(templates['w3c'] % template_params) - else: - f = codecs.open('%s/%s.html' % (TESTOUTPUTDIR, name), 'w', 'utf-8') - f.write(templates['standalone'] % template_params) - - f = codecs.open('%s/framed.%s.html' % (TESTOUTPUTDIR, name), 'w', 'utf-8') - f.write(templates['framed'] % template_params) - - f = codecs.open('%s/minimal.%s.html' % (TESTOUTPUTDIR, name), 'w', 'utf-8') - f.write(templates['minimal'] % template_params) - - if mochitest: - mochitests.append(name) - f = codecs.open('%s/mochitests/test_%s.html' % (MISCOUTPUTDIR, name), 'w', 'utf-8') - f.write(templates['mochitest'] % template_params) - -def write_mochitest_makefile(): - f = open('%s/mochitests/Makefile.in' % MISCOUTPUTDIR, 'w') - f.write(templates['mochitest.Makefile']) - files = ['test_%s.html' % n for n in mochitests] + ['image_%s' % n for n in used_images] - chunksize = 100 - chunks = [] - for i in range(0, len(files), chunksize): - chunk = files[i:i+chunksize] - name = '_TEST_FILES_%d' % (i / chunksize) - chunks.append(name) - f.write('%s = \\\n' % name) - for file in chunk: f.write('\t%s \\\n' % file) - f.write('\t$(NULL)\n\n') - f.write('# split up into groups to work around command-line length limits\n') - for name in chunks: - f.write('libs:: $(%s)\n\t$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)\n\n' % name) - -if not W3CMODE: - for i in used_images: - shutil.copyfile("../../images/%s" % i, "%s/mochitests/image_%s" % (MISCOUTPUTDIR, i)) - write_mochitest_makefile() - -print - -def write_index(): - f = open('%s/index.html' % TESTOUTPUTDIR, 'w') - f.write(templates['index.w3c' if W3CMODE else 'index'] % { 'updated':time.strftime('%Y-%m-%d', time.gmtime()) }) - f.write('\n<ul class="testlist">\n') - depth = 1 - for category in category_names: - name = category[1:-1] or '' - count = len(category_contents_all[category]) - new_depth = category.count('.') - while new_depth < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1 - f.write(' '*depth + templates['index.w3c.category.item' if W3CMODE else 'index.category.item'] % (name or 'all', name, count, '' if count==1 else 's')) - while new_depth+1 > depth: f.write(' '*depth + '<ul>\n'); depth += 1 - for item in category_contents_direct.get(category, []): - f.write(' '*depth + '<li><a href="%s.html">%s</a>\n' % (item, item) ) - while 0 < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1 - -def write_category_indexes(): - for category in category_names: - name = (category[1:-1] or 'all') - - f = open('%s/index.%s.html' % (TESTOUTPUTDIR, name), 'w') - f.write(templates['index.w3c.frame' if W3CMODE else 'index.frame'] % { 'backrefs':backref_html(name), 'category':name }) - for item in category_contents_all[category]: - f.write(templates['index.w3c.frame.item' if W3CMODE else 'index.frame.item'] % item) - -def write_reportgen(): - f = open('%s/reportgen.html' % MISCOUTPUTDIR, 'w') - items_text = ',\n'.join(('"%s"' % item) for item in category_contents_all['.']) - f.write(templates['reportgen'] % {'items':items_text }) - -def write_results(): - results = {} - uas = [] - uastrings = {} - for item in category_contents_all['.']: results[item] = {} - - f = open('%s/results.html' % MISCOUTPUTDIR, 'w') - f.write(templates['results']) - - if not os.path.exists('results.yaml'): - print "Can't find results.yaml" - else: - for resultset in yaml.load(open('results.yaml', "r").read()): - #title = "%s (%s)" % (resultset['ua'], resultset['time']) - title = resultset['name'] - #assert title not in uas # don't allow repetitions - if title not in uas: - uas.append(title) - uastrings[title] = resultset['ua'] - else: - assert uastrings[title] == resultset['ua'] - for r in resultset['results']: - if r['id'] not in results: - print 'Skipping results for removed test %s' % r['id'] - continue - results[r['id']][title] = ( - r['status'].lower(), - re.sub(r'%(..)', lambda m: chr(int(m.group(1), 16)), - re.sub(r'%u(....)', lambda m: unichr(int(m.group(1), 16)), - r['notes'])).encode('utf8') - ) - - passes = {} - for ua in uas: - f.write('<th title="%s">%s\n' % (uastrings[ua], ua)) - passes[ua] = 0 - for id in category_contents_all['.']: - f.write('<tr><td><a href="#%s" id="%s">#</a> <a href="%s.html">%s</a>\n' % (id, id, id, id)) - for ua in uas: - status, details = results[id].get(ua, ('', '')) - f.write('<td class="r %s"><ul class="d">%s</ul>\n' % (status, details)) - if status == 'pass': passes[ua] += 1 - f.write('<tr><th>Passes\n') - for ua in uas: - f.write('<td>%.1f%%\n' % ((100.0 * passes[ua]) / len(category_contents_all['.']))) - f.write('<tr><td>\n') - for ua in uas: - f.write('<td>%s\n' % ua) - f.write('</table>\n') - -def getNodeText(node): - t, offsets = '', [] - - # Skip over any previous annotations we added - if node.nodeType == node.ELEMENT_NODE and 'testrefs' in node.getAttribute('class').split(' '): - return t, offsets - - if node.nodeType == node.TEXT_NODE: - val = node.nodeValue - val = val.replace(unichr(0xa0), ' ') # replace s - t += val - offsets += [ (node, len(node.nodeValue)) ] - for n in node.childNodes: - child_t, child_offsets = getNodeText(n) - t += child_t - offsets += child_offsets - return t, offsets - -def htmlSerializer(element): - element.normalize() - rv = [] - specialtext = ['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'noscript'] - empty = ['area', 'base', 'basefont', 'bgsound', 'br', 'col', 'embed', 'frame', - 'hr', 'img', 'input', 'link', 'meta', 'param', 'spacer', 'wbr'] - - def serializeElement(element): - if element.nodeType == Node.DOCUMENT_TYPE_NODE: - rv.append("<!DOCTYPE %s>" % element.name) - elif element.nodeType == Node.DOCUMENT_NODE: - for child in element.childNodes: - serializeElement(child) - elif element.nodeType == Node.COMMENT_NODE: - rv.append("<!--%s-->" % element.nodeValue) - elif element.nodeType == Node.TEXT_NODE: - unescaped = False - n = element.parentNode - while n is not None: - if n.nodeName in specialtext: - unescaped = True - break - n = n.parentNode - if unescaped: - rv.append(element.nodeValue) - else: - rv.append(escapeHTML(element.nodeValue)) - else: - rv.append("<%s" % element.nodeName) - if element.hasAttributes(): - for name, value in element.attributes.items(): - rv.append(' %s="%s"' % (name, escapeHTML(value))) - rv.append(">") - if element.nodeName not in empty: - for child in element.childNodes: - serializeElement(child) - rv.append("</%s>" % element.nodeName) - serializeElement(element) - return '<!DOCTYPE html>\n' + ''.join(rv) - -def write_annotated_spec(): - # Load the stripped-down XHTMLised copy of the spec - doc = xml.dom.minidom.parse(open('current-work-canvas.xhtml', 'r')) - - # Insert our new stylesheet - n = doc.getElementsByTagName('head')[0].appendChild(doc.createElement('link')) - n.setAttribute('rel', 'stylesheet') - n.setAttribute('href', '../common/canvas-spec.css' if W3CMODE else '../spectest.css') - n.setAttribute('type', 'text/css') - - spec_assertion_patterns = [] - for a in spec_assertions: - # Warn about problems - if a['id'] not in spec_refs: - print "Unused spec statement %s" % a['id'] - - pattern_text = a['text'] - - if 'keyword' in a: - # Explicit keyword override - keyword = a['keyword'] - else: - # Extract the marked keywords, and remove the markers - keyword = 'none' - for kw in ['must', 'should', 'required']: - if ('*%s*' % kw) in pattern_text: - keyword = kw - pattern_text = pattern_text.replace('*%s*' % kw, kw) - break - # Make sure there wasn't >1 keyword - for kw in ['must', 'should', 'required']: - assert('*%s*' % kw not in pattern_text) - - # Convert the special pattern format into regexp syntax - pattern_text = (pattern_text. - # Escape relevant characters - replace('*', r'\*'). - replace('+', r'\+'). - replace('.', r'\.'). - replace('(', r'\('). - replace(')', r'\)'). - replace('[', r'\['). - replace(']', r'\]'). - # Convert special sequences back into unescaped regexp code - replace(' ', r'\s+'). - replace(r'<\.\.\.>', r'.+'). - replace('<^>', r'()'). - replace('<eol>', r'\s*?\n') - ) - pattern = re.compile(pattern_text, re.S) - spec_assertion_patterns.append( (a['id'], pattern, keyword, a.get('previously', None)) ) - matched_assertions = {} - - def process_element(e): - if e.nodeType == e.ELEMENT_NODE and (e.getAttribute('class') == 'impl' or e.hasAttribute('data-component')): - for c in e.childNodes: - process_element(c) - return - - t, offsets = getNodeText(e) - for id, pattern, keyword, previously in spec_assertion_patterns: - m = pattern.search(t) - if m: - # When the pattern-match isn't enough to uniquely identify a sentence, - # allow explicit back-references to earlier paragraphs - if previously: - if len(previously) >= 3: - n, text, exp = previously - else: - n, text = previously - exp = True - node = e - while n and node.previousSibling: - node = node.previousSibling - n -= 1 - if (text not in getNodeText(node)[0]) == exp: - continue # discard this match - - if id in matched_assertions: - print "Spec statement %s matches multiple places" % id - matched_assertions[id] = True - - if m.lastindex != 1: - print "Spec statement %s has incorrect number of match groups" % id - - end = m.end(1) - end_node = None - for end_node, o in offsets: - if end < o: - break - end -= o - assert(end_node) - - n1 = doc.createElement('span') - n1.setAttribute('class', 'testrefs kw-%s' % keyword) - n1.setAttribute('id', 'testrefs.%s' % id) - n1.appendChild(doc.createTextNode(' ')) - - n = n1.appendChild(doc.createElement('a')) - n.setAttribute('href', '#testrefs.%s' % id) - n.setAttribute('title', id) - n.appendChild(doc.createTextNode('#')) - - n1.appendChild(doc.createTextNode(' ')) - for test_id in spec_refs.get(id, []): - n = n1.appendChild(doc.createElement('a')) - n.setAttribute('href', '../canvas/%s.html' % test_id) - n.appendChild(doc.createTextNode(test_id)) - n1.appendChild(doc.createTextNode(' ')) - n0 = doc.createTextNode(end_node.nodeValue[:end]) - n2 = doc.createTextNode(end_node.nodeValue[end:]) - - p = end_node.parentNode - p.replaceChild(n2, end_node) - p.insertBefore(n1, n2) - p.insertBefore(n0, n1) - - t, offsets = getNodeText(e) - - for e in doc.getElementsByTagName('body')[0].childNodes: - process_element(e) - - for s in spec_assertions: - if s['id'] not in matched_assertions: - print "Annotation incomplete: Unmatched spec statement %s" % s['id'] - - # Convert from XHTML back to HTML - doc.documentElement.removeAttribute('xmlns') - doc.documentElement.setAttribute('lang', doc.documentElement.getAttribute('xml:lang')) - - head = doc.documentElement.getElementsByTagName('head')[0] - head.insertBefore(doc.createElement('meta'), head.firstChild).setAttribute('charset', 'UTF-8') - - f = codecs.open('%s/canvas.html' % SPECOUTPUTDIR, 'w', 'utf-8') - f.write(htmlSerializer(doc)) - -if not W3CMODE: - write_index() - write_category_indexes() - write_reportgen() - write_results() - write_annotated_spec() +genTestUtils('../../2dcontext', '../../2dcontext', 'templates.yaml', 'name2dir.yaml', False) diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py b/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py new file mode 100644 index 00000000000..4aaf816c93a --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py @@ -0,0 +1,814 @@ +# Copyright (c) 2010 Philip Taylor +# Released under the BSD license and W3C Test Suite License: see LICENSE.txt + +# Current code status: +# +# This was originally written for use at +# http://philip.html5.org/tests/canvas/suite/tests/ +# +# It has been adapted for use with the Web Platform Test Suite suite at +# https://github.com/w3c/web-platform-tests/ +# +# The W3C version excludes a number of features (multiple versions of each test +# case of varying verbosity, Mozilla mochitests, semi-automated test harness) +# to focus on simply providing reviewable test cases. It also expects a different +# directory structure. +# This code attempts to support both versions, but the non-W3C version hasn't +# been tested recently and is probably broken. + +# To update or add test cases: +# +# * Modify the tests*.yaml files. +# 'name' is an arbitrary hierarchical name to help categorise tests. +# 'desc' is a rough description of what behaviour the test aims to test. +# 'testing' is a list of references to spec.yaml, to show which spec sentences +# this test case is primarily testing. +# 'code' is JavaScript code to execute, with some special commands starting with '@' +# 'expected' is what the final canvas output should be: a string 'green' or 'clear' +# (100x50 images in both cases), or a string 'size 100 50' (or any other size) +# followed by Python code using Pycairo to generate the image. +# +# * Run "python gentest.py". +# This requires a few Python modules which might not be ubiquitous. +# It has only been tested on Linux. +# It will usually emit some warnings, which ideally should be fixed but can +# generally be safely ignored. +# +# * Test the tests, add new ones to Git, remove deleted ones from Git, etc. + +import re +import codecs +import time +import os +import shutil +import sys +import xml.dom.minidom +from xml.dom.minidom import Node + +import cairo + +try: + import syck as yaml # compatible and lots faster +except ImportError: + import yaml + +def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOFFSCREENCANVAS): + + # Default mode is for the W3C test suite; the --standalone option + # generates various extra files that aren't needed there + W3CMODE = True + if '--standalone' in sys.argv: + W3CMODE = False + + MISCOUTPUTDIR = './output' + SPECOUTPUTDIR = '../../annotated-spec' + + SPECOUTPUTPATH = '../annotated-spec' # relative to TESTOUTPUTDIR + + def simpleEscapeJS(str): + return str.replace('\\', '\\\\').replace('"', '\\"') + + def escapeJS(str): + str = simpleEscapeJS(str) + str = re.sub(r'\[(\w+)\]', r'[\\""+(\1)+"\\"]', str) # kind of an ugly hack, for nicer failure-message output + return str + + def escapeHTML(str): + return str.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"') + + def expand_nonfinite(method, argstr, tail): + """ + >>> print expand_nonfinite('f', '<0 a>, <0 b>', ';') + f(a, 0); + f(0, b); + f(a, b); + >>> print expand_nonfinite('f', '<0 a>, <0 b c>, <0 d>', ';') + f(a, 0, 0); + f(0, b, 0); + f(0, c, 0); + f(0, 0, d); + f(a, b, 0); + f(a, b, d); + f(a, 0, d); + f(0, b, d); + """ + # argstr is "<valid-1 invalid1-1 invalid2-1 ...>, ..." (where usually + # 'invalid' is Infinity/-Infinity/NaN) + args = [] + for arg in argstr.split(', '): + a = re.match('<(.*)>', arg).group(1) + args.append(a.split(' ')) + calls = [] + # Start with the valid argument list + call = [ args[j][0] for j in range(len(args)) ] + # For each argument alone, try setting it to all its invalid values: + for i in range(len(args)): + for a in args[i][1:]: + c2 = call[:] + c2[i] = a + calls.append(c2) + # For all combinations of >= 2 arguments, try setting them to their + # first invalid values. (Don't do all invalid values, because the + # number of combinations explodes.) + def f(c, start, depth): + for i in range(start, len(args)): + if len(args[i]) > 1: + a = args[i][1] + c2 = c[:] + c2[i] = a + if depth > 0: calls.append(c2) + f(c2, i+1, depth+1) + f(call, 0, 0) + + return '\n'.join('%s(%s)%s' % (method, ', '.join(c), tail) for c in calls) + + # Run with --test argument to run unit tests + if len(sys.argv) > 1 and sys.argv[1] == '--test': + import doctest + doctest.testmod() + sys.exit() + + templates = yaml.load(open(TEMPLATEFILE, "r").read()) + name_mapping = yaml.load(open(NAME2DIRFILE, "r").read()) + + SPECFILE = 'spec.yaml' + if ISOFFSCREENCANVAS: + SPECFILE = '../../2dcontext/tools/spec.yaml' + spec_assertions = [] + for s in yaml.load(open(SPECFILE, "r").read())['assertions']: + if 'meta' in s: + eval(compile(s['meta'], '<meta spec assertion>', 'exec'), {}, {'assertions':spec_assertions}) + else: + spec_assertions.append(s) + + tests = [] + TESTSFILES = ['tests.yaml', 'tests2d.yaml', 'tests2dtext.yaml'] + if ISOFFSCREENCANVAS: + TESTSFILES = ['tests2d.yaml'] + for t in sum([ yaml.load(open(f, "r").read()) for f in TESTSFILES], []): + if 'DISABLED' in t: + continue + if 'meta' in t: + eval(compile(t['meta'], '<meta test>', 'exec'), {}, {'tests':tests}) + else: + tests.append(t) + + category_names = [] + category_contents_direct = {} + category_contents_all = {} + + spec_ids = {} + for t in spec_assertions: spec_ids[t['id']] = True + spec_refs = {} + + def backref_html(name): + backrefs = [] + c = '' + for p in name.split('.')[:-1]: + c += '.'+p + backrefs.append('<a href="index%s.html">%s</a>.' % (c, p)) + backrefs.append(name.split('.')[-1]) + return ''.join(backrefs) + + def make_flat_image(filename, w, h, r,g,b,a): + if os.path.exists('%s/%s' % (IMAGEOUTPUTDIR, filename)): + return filename + surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) + cr = cairo.Context(surface) + cr.set_source_rgba(r, g, b, a) + cr.rectangle(0, 0, w, h) + cr.fill() + surface.write_to_png('%s/%s' % (IMAGEOUTPUTDIR, filename)) + return filename + + # Ensure the test output directories exist + testdirs = [TESTOUTPUTDIR, IMAGEOUTPUTDIR, MISCOUTPUTDIR] + if not W3CMODE: testdirs.append('%s/mochitests' % MISCOUTPUTDIR) + else: + for map_dir in set(name_mapping.values()): + testdirs.append("%s/%s" % (TESTOUTPUTDIR, map_dir)) + for d in testdirs: + try: os.mkdir(d) + except: pass # ignore if it already exists + + mochitests = [] + used_images = {} + + def expand_test_code(code): + code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code) # must come before '@assert throws' + + if ISOFFSCREENCANVAS: + code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);', + r'_assertPixel(offscreenCanvas, \1, \2, "\1", "\2");', + code) + else: + code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);', + r'_assertPixel(canvas, \1, \2, "\1", "\2");', + code) + + if ISOFFSCREENCANVAS: + code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);', + r'_assertPixelApprox(offscreenCanvas, \1, \2, "\1", "\2", 2);', + code) + else: + code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);', + r'_assertPixelApprox(canvas, \1, \2, "\1", "\2", 2);', + code) + + if ISOFFSCREENCANVAS: + code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);', + r'_assertPixelApprox(offscreenCanvas, \1, \2, "\1", "\2", \3);', + code) + else: + code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);', + r'_assertPixelApprox(canvas, \1, \2, "\1", "\2", \3);', + code) + + code = re.sub(r'@assert throws (\S+_ERR) (.*);', + r'assert_throws("\1", function() { \2; });', + code) + + code = re.sub(r'@assert throws (\S+Error) (.*);', + r'assert_throws(new \1(), function() { \2; });', + code) + + code = re.sub(r'@assert throws (.*);', + r'assert_throws(null, function() { \1; });', + code) + + code = re.sub(r'@assert (.*) === (.*);', + lambda m: '_assertSame(%s, %s, "%s", "%s");' + % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2))) + , code) + + code = re.sub(r'@assert (.*) !== (.*);', + lambda m: '_assertDifferent(%s, %s, "%s", "%s");' + % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2))) + , code) + + code = re.sub(r'@assert (.*) =~ (.*);', + lambda m: 'assert_regexp_match(%s, %s);' + % (m.group(1), m.group(2)) + , code) + + code = re.sub(r'@assert (.*);', + lambda m: '_assert(%s, "%s");' + % (m.group(1), escapeJS(m.group(1))) + , code) + + code = re.sub(r' @moz-todo', '', code) + + code = re.sub(r'@moz-UniversalBrowserRead;', + "" + , code) + + assert('@' not in code) + + return code + + def expand_mochitest_code(code): + code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code) + + code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);', + r'isPixel(ctx, \1, \2, "\1", "\2", 0);', + code) + + code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);', + r'isPixel(ctx, \1, \2, "\1", "\2", 2);', + code) + + code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);', + r'isPixel(ctx, \1, \2, "\1", "\2", \3);', + code) + + code = re.sub(r'@assert throws (\S+_ERR) (.*);', + lambda m: 'var _thrown = undefined; try {\n %s;\n} catch (e) { _thrown = e }; ok(_thrown && _thrown.code == DOMException.%s, "should throw %s");' + % (m.group(2), m.group(1), m.group(1)) + , code) + + code = re.sub(r'@assert throws (\S+Error) (.*);', + lambda m: 'var _thrown = undefined; try {\n %s;\n} catch (e) { _thrown = e }; ok(_thrown && (_thrown instanceof %s), "should throw %s");' + % (m.group(2), m.group(1), m.group(1)) + , code) + + code = re.sub(r'@assert throws (.*);', + lambda m: 'try { var _thrown = false;\n %s;\n} catch (e) { _thrown = true; } finally { ok(_thrown, "should throw exception"); }' + % (m.group(1)) + , code) + + code = re.sub(r'@assert (.*) =~ (.*);', + lambda m: 'ok(%s.match(%s), "%s.match(%s)");' + % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2))) + , code) + + code = re.sub(r'@assert (.*);', + lambda m: 'ok(%s, "%s");' + % (m.group(1), escapeJS(m.group(1))) + , code) + + code = re.sub(r'((?:^|\n|;)\s*)ok(.*;) @moz-todo', + lambda m: '%stodo%s' + % (m.group(1), m.group(2)) + , code) + + code = re.sub(r'((?:^|\n|;)\s*)(is.*;) @moz-todo', + lambda m: '%stodo_%s' + % (m.group(1), m.group(2)) + , code) + + code = re.sub(r'@moz-UniversalBrowserRead;', + "netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');" + , code) + + code = code.replace('../images/', 'image_') + + assert '@' not in code, '@ not in code:\n%s' % code + + return code + + used_tests = {} + for i in range(len(tests)): + test = tests[i] + + name = test['name'] + print "\r(%s)" % name, " "*32, "\t", + + if name in used_tests: + print "Test %s is defined twice" % name + used_tests[name] = 1 + + mapped_name = None + for mn in sorted(name_mapping.keys(), key=len, reverse=True): + if name.startswith(mn): + mapped_name = "%s/%s" % (name_mapping[mn], name) + break + if not mapped_name: + print "LIKELY ERROR: %s has no defined target directory mapping" % name + if ISOFFSCREENCANVAS: + continue + else: + mapped_name = name + if 'manual' in test: + mapped_name += "-manual" + + cat_total = '' + for cat_part in [''] + name.split('.')[:-1]: + cat_total += cat_part+'.' + if not cat_total in category_names: category_names.append(cat_total) + category_contents_all.setdefault(cat_total, []).append(name) + category_contents_direct.setdefault(cat_total, []).append(name) + + for ref in test.get('testing', []): + if ref not in spec_ids: + print "Test %s uses nonexistent spec point %s" % (name, ref) + spec_refs.setdefault(ref, []).append(name) + #if not (len(test.get('testing', [])) or 'mozilla' in test): + if not test.get('testing', []): + print "Test %s doesn't refer to any spec points" % name + + if test.get('expected', '') == 'green' and re.search(r'@assert pixel .* 0,0,0,0;', test['code']): + print "Probable incorrect pixel test in %s" % name + + code = expand_test_code(test['code']) + + mochitest = not (W3CMODE or 'manual' in test or 'disabled' in test.get('mozilla', {})) + if mochitest: + mochi_code = expand_mochitest_code(test['code']) + + mochi_name = name + if 'mozilla' in test: + if 'throws' in test['mozilla']: + mochi_code = templates['mochitest.exception'] % mochi_code + if 'bug' in test['mozilla']: + mochi_name = "%s - bug %s" % (name, test['mozilla']['bug']) + + if 'desc' in test: + mochi_desc = '<!-- Testing: %s -->\n' % test['desc'] + else: + mochi_desc = '' + + if 'deferTest' in mochi_code: + mochi_setup = '' + mochi_footer = '' + else: + mochi_setup = '' + mochi_footer = 'SimpleTest.finish();\n' + + for f in ['isPixel', 'todo_isPixel', 'deferTest', 'wrapFunction']: + if f in mochi_code: + mochi_setup += templates['mochitest.%s' % f] + else: + if not W3CMODE: + print "Skipping mochitest for %s" % name + mochi_name = '' + mochi_desc = '' + mochi_code = '' + mochi_setup = '' + mochi_footer = '' + + expectation_html = '' + if 'expected' in test and test['expected'] is not None: + expected = test['expected'] + expected_img = None + if expected == 'green': + expected_img = make_flat_image('green-100x50.png', 100, 50, 0,1,0,1) + if W3CMODE: expected_img = "/images/" + expected_img + elif expected == 'clear': + expected_img = make_flat_image('clear-100x50.png', 100, 50, 0,0,0,0) + if W3CMODE: expected_img = "/images/" + expected_img + else: + if ';' in expected: print "Found semicolon in %s" % name + expected = re.sub(r'^size (\d+) (\d+)', + r'surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, \1, \2)\ncr = cairo.Context(surface)', + expected) + + if mapped_name.endswith("-manual"): + png_name = mapped_name[:-len("-manual")] + else: + png_name = mapped_name + expected += "\nsurface.write_to_png('%s/%s.png')\n" % (IMAGEOUTPUTDIR, png_name) + eval(compile(expected, '<test %s>' % test['name'], 'exec'), {}, {'cairo':cairo}) + expected_img = "%s.png" % name + + if expected_img: + expectation_html = ('<p class="output expectedtext">Expected output:' + + '<p><img src="%s" class="output expected" id="expected" alt="">' % (expected_img)) + + canvas = test.get('canvas', 'width="100" height="50"') + + prev = tests[i-1]['name'] if i != 0 else 'index' + next = tests[i+1]['name'] if i != len(tests)-1 else 'index' + + name_wrapped = name.replace('.', '.​') # (see https://bugzilla.mozilla.org/show_bug.cgi?id=376188) + + refs = ''.join('<li><a href="%s/canvas.html#testrefs.%s">%s</a>\n' % (SPECOUTPUTPATH, n,n) for n in test.get('testing', [])) + if not W3CMODE and 'mozilla' in test and 'bug' in test['mozilla']: + refs += '<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=%d">Bugzilla</a>' % test['mozilla']['bug'] + + notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else '' + + scripts = '' + for s in test.get('scripts', []): + scripts += '<script src="%s"></script>\n' % (s) + + images = '' + for i in test.get('images', []): + id = i.split('/')[-1] + if '/' not in i: + used_images[i] = 1 + i = '../images/%s' % i + images += '<img src="%s" id="%s" class="resource">\n' % (i,id) + mochi_images = images.replace('../images/', 'image_') + if W3CMODE: images = images.replace("../images/", "/images/") + + fonts = '' + fonthack = '' + for i in test.get('fonts', []): + fonts += '@font-face {\n font-family: %s;\n src: url("/fonts/%s.ttf");\n}\n' % (i, i) + # Browsers require the font to actually be used in the page + if test.get('fonthack', 1): + fonthack += '<span style="font-family: %s; position: absolute; visibility: hidden">A</span>\n' % i + if fonts: + fonts = '<style>\n%s</style>\n' % fonts + + fallback = test.get('fallback', '<p class="fallback">FAIL (fallback content)</p>') + + desc = test.get('desc', '') + escaped_desc = simpleEscapeJS(desc) + template_params = { + 'name':name, 'name_wrapped':name_wrapped, 'backrefs':backref_html(name), + 'mapped_name':mapped_name, + 'desc':desc, 'escaped_desc':escaped_desc, + 'prev':prev, 'next':next, 'refs':refs, 'notes':notes, 'images':images, + 'fonts':fonts, 'fonthack':fonthack, + 'canvas':canvas, 'expected':expectation_html, 'code':code, 'scripts':scripts, + 'mochi_name':mochi_name, 'mochi_desc':mochi_desc, 'mochi_code':mochi_code, + 'mochi_setup':mochi_setup, 'mochi_footer':mochi_footer, 'mochi_images':mochi_images, + 'fallback':fallback + } + + if W3CMODE: + f = codecs.open('%s/%s.html' % (TESTOUTPUTDIR, mapped_name), 'w', 'utf-8') + f.write(templates['w3c'] % template_params) + if ISOFFSCREENCANVAS: + f = codecs.open('%s/%s.worker.js' % (TESTOUTPUTDIR, mapped_name), 'w', 'utf-8') + f.write(templates['w3cworker'] % template_params) + else: + f = codecs.open('%s/%s.html' % (TESTOUTPUTDIR, name), 'w', 'utf-8') + f.write(templates['standalone'] % template_params) + + f = codecs.open('%s/framed.%s.html' % (TESTOUTPUTDIR, name), 'w', 'utf-8') + f.write(templates['framed'] % template_params) + + f = codecs.open('%s/minimal.%s.html' % (TESTOUTPUTDIR, name), 'w', 'utf-8') + f.write(templates['minimal'] % template_params) + + if mochitest: + mochitests.append(name) + f = codecs.open('%s/mochitests/test_%s.html' % (MISCOUTPUTDIR, name), 'w', 'utf-8') + f.write(templates['mochitest'] % template_params) + + def write_mochitest_makefile(): + f = open('%s/mochitests/Makefile.in' % MISCOUTPUTDIR, 'w') + f.write(templates['mochitest.Makefile']) + files = ['test_%s.html' % n for n in mochitests] + ['image_%s' % n for n in used_images] + chunksize = 100 + chunks = [] + for i in range(0, len(files), chunksize): + chunk = files[i:i+chunksize] + name = '_TEST_FILES_%d' % (i / chunksize) + chunks.append(name) + f.write('%s = \\\n' % name) + for file in chunk: f.write('\t%s \\\n' % file) + f.write('\t$(NULL)\n\n') + f.write('# split up into groups to work around command-line length limits\n') + for name in chunks: + f.write('libs:: $(%s)\n\t$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)\n\n' % name) + + if not W3CMODE: + for i in used_images: + shutil.copyfile("../../images/%s" % i, "%s/mochitests/image_%s" % (MISCOUTPUTDIR, i)) + write_mochitest_makefile() + + print + + def write_index(): + f = open('%s/index.html' % TESTOUTPUTDIR, 'w') + f.write(templates['index.w3c' if W3CMODE else 'index'] % { 'updated':time.strftime('%Y-%m-%d', time.gmtime()) }) + f.write('\n<ul class="testlist">\n') + depth = 1 + for category in category_names: + name = category[1:-1] or '' + count = len(category_contents_all[category]) + new_depth = category.count('.') + while new_depth < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1 + f.write(' '*depth + templates['index.w3c.category.item' if W3CMODE else 'index.category.item'] % (name or 'all', name, count, '' if count==1 else 's')) + while new_depth+1 > depth: f.write(' '*depth + '<ul>\n'); depth += 1 + for item in category_contents_direct.get(category, []): + f.write(' '*depth + '<li><a href="%s.html">%s</a>\n' % (item, item) ) + while 0 < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1 + + def write_category_indexes(): + for category in category_names: + name = (category[1:-1] or 'all') + + f = open('%s/index.%s.html' % (TESTOUTPUTDIR, name), 'w') + f.write(templates['index.w3c.frame' if W3CMODE else 'index.frame'] % { 'backrefs':backref_html(name), 'category':name }) + for item in category_contents_all[category]: + f.write(templates['index.w3c.frame.item' if W3CMODE else 'index.frame.item'] % item) + + def write_reportgen(): + f = open('%s/reportgen.html' % MISCOUTPUTDIR, 'w') + items_text = ',\n'.join(('"%s"' % item) for item in category_contents_all['.']) + f.write(templates['reportgen'] % {'items':items_text }) + + def write_results(): + results = {} + uas = [] + uastrings = {} + for item in category_contents_all['.']: results[item] = {} + + f = open('%s/results.html' % MISCOUTPUTDIR, 'w') + f.write(templates['results']) + + if not os.path.exists('results.yaml'): + print "Can't find results.yaml" + else: + for resultset in yaml.load(open('results.yaml', "r").read()): + #title = "%s (%s)" % (resultset['ua'], resultset['time']) + title = resultset['name'] + #assert title not in uas # don't allow repetitions + if title not in uas: + uas.append(title) + uastrings[title] = resultset['ua'] + else: + assert uastrings[title] == resultset['ua'] + for r in resultset['results']: + if r['id'] not in results: + print 'Skipping results for removed test %s' % r['id'] + continue + results[r['id']][title] = ( + r['status'].lower(), + re.sub(r'%(..)', lambda m: chr(int(m.group(1), 16)), + re.sub(r'%u(....)', lambda m: unichr(int(m.group(1), 16)), + r['notes'])).encode('utf8') + ) + + passes = {} + for ua in uas: + f.write('<th title="%s">%s\n' % (uastrings[ua], ua)) + passes[ua] = 0 + for id in category_contents_all['.']: + f.write('<tr><td><a href="#%s" id="%s">#</a> <a href="%s.html">%s</a>\n' % (id, id, id, id)) + for ua in uas: + status, details = results[id].get(ua, ('', '')) + f.write('<td class="r %s"><ul class="d">%s</ul>\n' % (status, details)) + if status == 'pass': passes[ua] += 1 + f.write('<tr><th>Passes\n') + for ua in uas: + f.write('<td>%.1f%%\n' % ((100.0 * passes[ua]) / len(category_contents_all['.']))) + f.write('<tr><td>\n') + for ua in uas: + f.write('<td>%s\n' % ua) + f.write('</table>\n') + + def getNodeText(node): + t, offsets = '', [] + + # Skip over any previous annotations we added + if node.nodeType == node.ELEMENT_NODE and 'testrefs' in node.getAttribute('class').split(' '): + return t, offsets + + if node.nodeType == node.TEXT_NODE: + val = node.nodeValue + val = val.replace(unichr(0xa0), ' ') # replace s + t += val + offsets += [ (node, len(node.nodeValue)) ] + for n in node.childNodes: + child_t, child_offsets = getNodeText(n) + t += child_t + offsets += child_offsets + return t, offsets + + def htmlSerializer(element): + element.normalize() + rv = [] + specialtext = ['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'noscript'] + empty = ['area', 'base', 'basefont', 'bgsound', 'br', 'col', 'embed', 'frame', + 'hr', 'img', 'input', 'link', 'meta', 'param', 'spacer', 'wbr'] + + def serializeElement(element): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + rv.append("<!DOCTYPE %s>" % element.name) + elif element.nodeType == Node.DOCUMENT_NODE: + for child in element.childNodes: + serializeElement(child) + elif element.nodeType == Node.COMMENT_NODE: + rv.append("<!--%s-->" % element.nodeValue) + elif element.nodeType == Node.TEXT_NODE: + unescaped = False + n = element.parentNode + while n is not None: + if n.nodeName in specialtext: + unescaped = True + break + n = n.parentNode + if unescaped: + rv.append(element.nodeValue) + else: + rv.append(escapeHTML(element.nodeValue)) + else: + rv.append("<%s" % element.nodeName) + if element.hasAttributes(): + for name, value in element.attributes.items(): + rv.append(' %s="%s"' % (name, escapeHTML(value))) + rv.append(">") + if element.nodeName not in empty: + for child in element.childNodes: + serializeElement(child) + rv.append("</%s>" % element.nodeName) + serializeElement(element) + return '<!DOCTYPE html>\n' + ''.join(rv) + + def write_annotated_spec(): + # Load the stripped-down XHTMLised copy of the spec + doc = xml.dom.minidom.parse(open('current-work-canvas.xhtml', 'r')) + + # Insert our new stylesheet + n = doc.getElementsByTagName('head')[0].appendChild(doc.createElement('link')) + n.setAttribute('rel', 'stylesheet') + n.setAttribute('href', '../common/canvas-spec.css' if W3CMODE else '../spectest.css') + n.setAttribute('type', 'text/css') + + spec_assertion_patterns = [] + for a in spec_assertions: + # Warn about problems + if a['id'] not in spec_refs: + print "Unused spec statement %s" % a['id'] + + pattern_text = a['text'] + + if 'keyword' in a: + # Explicit keyword override + keyword = a['keyword'] + else: + # Extract the marked keywords, and remove the markers + keyword = 'none' + for kw in ['must', 'should', 'required']: + if ('*%s*' % kw) in pattern_text: + keyword = kw + pattern_text = pattern_text.replace('*%s*' % kw, kw) + break + # Make sure there wasn't >1 keyword + for kw in ['must', 'should', 'required']: + assert('*%s*' % kw not in pattern_text) + + # Convert the special pattern format into regexp syntax + pattern_text = (pattern_text. + # Escape relevant characters + replace('*', r'\*'). + replace('+', r'\+'). + replace('.', r'\.'). + replace('(', r'\('). + replace(')', r'\)'). + replace('[', r'\['). + replace(']', r'\]'). + # Convert special sequences back into unescaped regexp code + replace(' ', r'\s+'). + replace(r'<\.\.\.>', r'.+'). + replace('<^>', r'()'). + replace('<eol>', r'\s*?\n') + ) + pattern = re.compile(pattern_text, re.S) + spec_assertion_patterns.append( (a['id'], pattern, keyword, a.get('previously', None)) ) + matched_assertions = {} + + def process_element(e): + if e.nodeType == e.ELEMENT_NODE and (e.getAttribute('class') == 'impl' or e.hasAttribute('data-component')): + for c in e.childNodes: + process_element(c) + return + + t, offsets = getNodeText(e) + for id, pattern, keyword, previously in spec_assertion_patterns: + m = pattern.search(t) + if m: + # When the pattern-match isn't enough to uniquely identify a sentence, + # allow explicit back-references to earlier paragraphs + if previously: + if len(previously) >= 3: + n, text, exp = previously + else: + n, text = previously + exp = True + node = e + while n and node.previousSibling: + node = node.previousSibling + n -= 1 + if (text not in getNodeText(node)[0]) == exp: + continue # discard this match + + if id in matched_assertions: + print "Spec statement %s matches multiple places" % id + matched_assertions[id] = True + + if m.lastindex != 1: + print "Spec statement %s has incorrect number of match groups" % id + + end = m.end(1) + end_node = None + for end_node, o in offsets: + if end < o: + break + end -= o + assert(end_node) + + n1 = doc.createElement('span') + n1.setAttribute('class', 'testrefs kw-%s' % keyword) + n1.setAttribute('id', 'testrefs.%s' % id) + n1.appendChild(doc.createTextNode(' ')) + + n = n1.appendChild(doc.createElement('a')) + n.setAttribute('href', '#testrefs.%s' % id) + n.setAttribute('title', id) + n.appendChild(doc.createTextNode('#')) + + n1.appendChild(doc.createTextNode(' ')) + for test_id in spec_refs.get(id, []): + n = n1.appendChild(doc.createElement('a')) + n.setAttribute('href', '../canvas/%s.html' % test_id) + n.appendChild(doc.createTextNode(test_id)) + n1.appendChild(doc.createTextNode(' ')) + n0 = doc.createTextNode(end_node.nodeValue[:end]) + n2 = doc.createTextNode(end_node.nodeValue[end:]) + + p = end_node.parentNode + p.replaceChild(n2, end_node) + p.insertBefore(n1, n2) + p.insertBefore(n0, n1) + + t, offsets = getNodeText(e) + + for e in doc.getElementsByTagName('body')[0].childNodes: + process_element(e) + + for s in spec_assertions: + if s['id'] not in matched_assertions: + print "Annotation incomplete: Unmatched spec statement %s" % s['id'] + + # Convert from XHTML back to HTML + doc.documentElement.removeAttribute('xmlns') + doc.documentElement.setAttribute('lang', doc.documentElement.getAttribute('xml:lang')) + + head = doc.documentElement.getElementsByTagName('head')[0] + head.insertBefore(doc.createElement('meta'), head.firstChild).setAttribute('charset', 'UTF-8') + + f = codecs.open('%s/canvas.html' % SPECOUTPUTDIR, 'w', 'utf-8') + f.write(htmlSerializer(doc)) + + if not W3CMODE: + write_index() + write_category_indexes() + write_reportgen() + write_results() + write_annotated_spec() diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml index 12b7d6be990..eb462067ad2 100644 --- a/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml +++ b/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml @@ -181,6 +181,8 @@ assertions: text: "copy<^><eol>" - id: 2d.composite.xor text: "xor<^><eol>" + - id: 2d.composite.clear + text: "clear<^><eol>" - id: 2d.composite.operation.casesensitive text: "These values are all case-sensitive<^> <...> they *must* be used exactly as shown." @@ -584,9 +586,9 @@ assertions: text: "If the image argument is <...> an HTMLVideoElement object whose readyState attribute is either HAVE_NOTHING or HAVE_METADATA<^>, then the implementation *must* return without drawing anything." - id: 2d.drawImage.zerocanvas previously: [ 10, "dw and dh" ] - text: "If the image argument is an HTMLCanvasElement object with either a horizontal dimension or a vertical dimension equal to zero, then the implementation *must* raise an INVALID_STATE_ERR exception<^>." + text: "If the image argument is an HTMLCanvasElement object with either a horizontal dimension or a vertical dimension equal to zero, then the implementation *must* return without drawing anything<^>." - id: 2d.drawImage.zerosource - text: "If one of the sw or sh arguments is zero<^>, the implementation *must* raise an INDEX_SIZE_ERR exception." + text: "If one of the sw or sh arguments is zero<^>, the implementation *must* return without drawing anything." - id: 2d.drawImage.paint text: "When drawImage() is invoked, the region of the image specified by the source rectangle *must* be painted on the region of the canvas specified by the destination rectangle<^>, after applying the current transformation matrix to the points of the destination rectangle." - id: 2d.drawImage.original diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml index 20a77dbd1f5..9e1f6dde42e 100644 --- a/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml +++ b/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml @@ -1307,7 +1307,7 @@ code: | ctx.globalCompositeOperation = 'xor'; ctx.globalCompositeOperation = 'clear'; - @assert ctx.globalCompositeOperation === 'xor'; + @assert ctx.globalCompositeOperation === 'clear'; - name: 2d.composite.operation.highlight testing: @@ -8772,7 +8772,7 @@ expected: green - name: 2d.drawImage.zerosource - desc: drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR + desc: drawImage with zero-sized source rectangle draws nothing without exception testing: - 2d.drawImage.zerosource images: @@ -8780,9 +8780,9 @@ code: | ctx.fillStyle = '#0f0'; ctx.fillRect(0, 0, 100, 50); - @assert throws INDEX_SIZE_ERR ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 1, 0, 0, 100, 50); - @assert throws INDEX_SIZE_ERR ctx.drawImage(document.getElementById('red.png'), 10, 10, 1, 0, 0, 0, 100, 50); - @assert throws INDEX_SIZE_ERR ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 0, 0, 0, 100, 50); + ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 1, 0, 0, 100, 50); + ctx.drawImage(document.getElementById('red.png'), 10, 10, 1, 0, 0, 0, 100, 50); + ctx.drawImage(document.getElementById('red.png'), 10, 10, 0, 0, 0, 0, 100, 50); @assert pixel 50,25 ==~ 0,255,0,255; expected: green @@ -9001,15 +9001,15 @@ var canvas2 = document.createElement('canvas'); canvas2.width = 0; canvas2.height = 10; - @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0); + ctx.drawImage(canvas2, 0, 0); canvas2.width = 10; canvas2.height = 0; - @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0); + ctx.drawImage(canvas2, 0, 0); canvas2.width = 0; canvas2.height = 0; - @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0); + ctx.drawImage(canvas2, 0, 0); @assert pixel 50,25 ==~ 0,255,0,255; expected: green diff --git a/tests/wpt/web-platform-tests/FileAPI/OWNERS b/tests/wpt/web-platform-tests/FileAPI/OWNERS index 03bb9336574..7e93ac00d50 100644 --- a/tests/wpt/web-platform-tests/FileAPI/OWNERS +++ b/tests/wpt/web-platform-tests/FileAPI/OWNERS @@ -1,6 +1,6 @@ @inexorabletash -@plehegar @zqzhang @zcorpan @jdm @Ms2ger +@mkruisselbrink diff --git a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-slice.html b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-slice.html index 0ecea79c8c7..03fe6ca5343 100644 --- a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-slice.html +++ b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-slice.html @@ -36,6 +36,30 @@ test(function() { desc: "blob2." }); + test_blob(function() { + return new Blob().slice(0,0,null); + }, { + expected: "", + type: "null", + desc: "null type Blob slice" + }); + + test_blob(function() { + return new Blob().slice(0,0,undefined); + }, { + expected: "", + type: "", + desc: "undefined type Blob slice" + }); + + test_blob(function() { + return new Blob().slice(0,0); + }, { + expected: "", + type: "", + desc: "no type Blob slice" + }); + var arrayBuffer = new ArrayBuffer(16); var int8View = new Int8Array(arrayBuffer); for (var i = 0; i < 16; i++) { diff --git a/tests/wpt/web-platform-tests/IndexedDB/historical.html b/tests/wpt/web-platform-tests/IndexedDB/historical.html new file mode 100644 index 00000000000..73d78c81676 --- /dev/null +++ b/tests/wpt/web-platform-tests/IndexedDB/historical.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>IndexedDB: Historical features</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + // Replaced circa December 2011 by 'error'. + assert_false('errorCode' in IDBRequest.prototype); +}, '"errorCode" should not be supported on IDBRequest.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBRequestReadyState enum). + assert_false('LOADING' in IDBRequest); +}, '"LOADING" should not be supported on IDBRequest.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBRequestReadyState enum). + assert_false('DONE' in IDBRequest); +}, '"DONE" should not be supported on IDBRequest.'); + +test(function() { + // Replaced circa December 2011 by 'oldVersion'/'newVersion'. + assert_false('version' in IDBVersionChangeEvent.prototype); +}, '"version" should not be supported on IDBVersionChangeEvent.'); + +test(function() { + // Replaced circa December 2011 by open() with version. + assert_false('setVersion' in IDBDatabase.prototype); +}, '"setVersion" should not be supported on IDBDatabase.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBCursorDirection enum). + assert_false('NEXT' in IDBCursor); +}, '"NEXT" should not be supported on IDBCursor.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBCursorDirection enum). + assert_false('NEXT_NO_DUPLICATE' in IDBCursor); +}, '"NEXT_NO_DUPLICATE" should not be supported on IDBCursor.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBCursorDirection enum). + assert_false('PREV' in IDBCursor); +}, '"PREV" should not be supported on IDBCursor.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBCursorDirection enum). + assert_false('PREV_NO_DUPLICATE' in IDBCursor); +}, '"PREV_NO_DUPLICATE" should not be supported on IDBCursor.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBTransactionMode enum). + assert_false('READ_ONLY' in IDBTransaction); +}, '"READ_ONLY" should not be supported on IDBTransaction.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBTransactionMode enum). + assert_false('READ_WRITE' in IDBTransaction); +}, '"READ_WRITE" should not be supported on IDBTransaction.'); + +test(function() { + // Replaced circa May 2012 by a DOMString (later, IDBTransactionMode enum). + assert_false('VERSION_CHANGE' in IDBTransaction); +}, '"VERSION_CHANGE" should not be supported on IDBTransaction.'); +</script> diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbkeyrange.htm b/tests/wpt/web-platform-tests/IndexedDB/idbkeyrange.htm index dd6e5f7e50e..a7f4934e095 100644 --- a/tests/wpt/web-platform-tests/IndexedDB/idbkeyrange.htm +++ b/tests/wpt/web-platform-tests/IndexedDB/idbkeyrange.htm @@ -17,6 +17,15 @@ assert_false(keyRange.upperOpen, "keyRange.upperOpen"); }, "IDBKeyRange.only() - returns an IDBKeyRange and the properties are set correctly"); + test( function() { + assert_throws('DataError', function() { IDBKeyRange.only(undefined); }, 'undefined is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.only(null); }, 'null is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.only({}); }, 'Object is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.only(Symbol()); }, 'Symbol is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.only(true); }, 'boolean is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.only(() => {}); }, 'function is not a valid key'); + }, "IDBKeyRange.only() - throws on invalid keys"); + // lowerBound test( function() { var keyRange = IDBKeyRange.lowerBound(1, true) @@ -32,6 +41,15 @@ assert_false(keyRange.lowerOpen, "keyRange.lowerOpen"); }, "IDBKeyRange.lowerBound() - 'open' parameter has correct default set"); + test( function() { + assert_throws('DataError', function() { IDBKeyRange.lowerBound(undefined); }, 'undefined is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.lowerBound(null); }, 'null is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.lowerBound({}); }, 'Object is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.lowerBound(Symbol()); }, 'Symbol is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.lowerBound(true); }, 'boolean is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.lowerBound(() => {}); }, 'function is not a valid key'); + }, "IDBKeyRange.lowerBound() - throws on invalid keys"); + // upperBound test( function() { var keyRange = IDBKeyRange.upperBound(1, true); @@ -47,6 +65,15 @@ assert_false(keyRange.upperOpen, "keyRange.upperOpen"); }, "IDBKeyRange.upperBound() - 'open' parameter has correct default set"); + test( function() { + assert_throws('DataError', function() { IDBKeyRange.upperBound(undefined); }, 'undefined is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.upperBound(null); }, 'null is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.upperBound({}); }, 'Object is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.upperBound(Symbol()); }, 'Symbol is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.upperBound(true); }, 'boolean is not a valid key'); + assert_throws('DataError', function() { IDBKeyRange.upperBound(() => {}); }, 'function is not a valid key'); + }, "IDBKeyRange.upperBound() - throws on invalid keys"); + // bound test( function() { var keyRange = IDBKeyRange.bound(1, 2, true, true); diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbrequest_error.html b/tests/wpt/web-platform-tests/IndexedDB/idbrequest_error.html new file mode 100644 index 00000000000..ae16b695a3f --- /dev/null +++ b/tests/wpt/web-platform-tests/IndexedDB/idbrequest_error.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>IDBRequest.error</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=support.js></script> + +<script> +async_test(t => { + var open = createdb(t); + open.onupgradeneeded = t.step_func(e => { + var db = e.target.result; + db.createObjectStore('store'); + }); + open.onsuccess = t.step_func(e => { + var db = e.target.result; + var request = db.transaction('store').objectStore('store').get(0); + + assert_equals(request.readyState, 'pending'); + assert_throws('InvalidStateError', () => request.error, + 'IDBRequest.error should throw if request is pending'); + t.done(); + }); +}, 'IDBRequest.error throws if ready state is pending'); +</script> diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbrequest_result.html b/tests/wpt/web-platform-tests/IndexedDB/idbrequest_result.html new file mode 100644 index 00000000000..29786290163 --- /dev/null +++ b/tests/wpt/web-platform-tests/IndexedDB/idbrequest_result.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>IDBRequest.result</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=support.js></script> + +<script> +async_test(t => { + var open = createdb(t); + open.onupgradeneeded = t.step_func(e => { + var db = e.target.result; + db.createObjectStore('store'); + }); + open.onsuccess = t.step_func(e => { + var db = e.target.result; + var request = db.transaction('store').objectStore('store').get(0); + + assert_equals(request.readyState, 'pending'); + assert_throws('InvalidStateError', () => request.result, + 'IDBRequest.result should throw if request is pending'); + t.done(); + }); +}, 'IDBRequest.result throws if ready state is pending'); +</script> diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.html b/tests/wpt/web-platform-tests/IndexedDB/interfaces.html index 55e752f2630..033ea7b6246 100644 --- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.html +++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.html @@ -11,28 +11,35 @@ <script> "use strict"; -setup(function() { - var idlArray = new IdlArray(); - +async_test(function(t) { var request = new XMLHttpRequest(); request.open("GET", "interfaces.idl"); request.send(); - request.onload = function() { + request.onload = t.step_func(function() { + var idlArray = new IdlArray(); var idls = request.responseText; + // https://html.spec.whatwg.org/multipage/browsers.html#window idlArray.add_untested_idls("[PrimaryGlobal] interface Window { };"); + + // https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope-mixin + idlArray.add_untested_idls(`[NoInterfaceObject, Exposed=(Window,Worker)] + interface WindowOrWorkerGlobalScope {};`); + idlArray.add_untested_idls("Window implements WindowOrWorkerGlobalScope;"); + + // https://dom.spec.whatwg.org/#interface-event idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface Event { };"); + + // https://dom.spec.whatwg.org/#interface-eventtarget idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };"); // From Indexed DB: idlArray.add_idls(idls); - idlArray.add_idls("Window implements IDBEnvironment;"); idlArray.add_objects({ IDBCursor: [], IDBCursorWithValue: [], IDBDatabase: [], - IDBEnvironment: [], IDBFactory: ["window.indexedDB"], IDBIndex: [], IDBKeyRange: ["IDBKeyRange.only(0)"], @@ -41,10 +48,11 @@ setup(function() { IDBRequest: [], IDBTransaction: [], IDBVersionChangeEvent: ["new IDBVersionChangeEvent('foo')"], + DOMStringList: [], }); idlArray.test(); - done(); - }; -}, {explicit_done: true}); + t.done(); + }); +}); </script> diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl b/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl index de196bf2d3a..f34061997a0 100644 --- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl +++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl @@ -1,157 +1,211 @@ -enum IDBTransactionMode { - "readonly", - "readwrite", - "versionchange" +[Exposed=(Window,Worker)] +interface IDBRequest : EventTarget { + readonly attribute any result; + readonly attribute DOMException? error; + readonly attribute (IDBObjectStore or IDBIndex or IDBCursor)? source; + readonly attribute IDBTransaction? transaction; + readonly attribute IDBRequestReadyState readyState; + + // Event handlers: + attribute EventHandler onsuccess; + attribute EventHandler onerror; }; enum IDBRequestReadyState { - "pending", - "done" + "pending", + "done" }; [Exposed=(Window,Worker)] -interface IDBKeyRange { - readonly attribute any lower; - readonly attribute any upper; - readonly attribute boolean lowerOpen; - readonly attribute boolean upperOpen; - static IDBKeyRange only (any value); - static IDBKeyRange lowerBound (any lower, optional boolean open = false); - static IDBKeyRange upperBound (any upper, optional boolean open = false); - static IDBKeyRange bound (any lower, any upper, optional boolean lowerOpen = false, optional boolean upperOpen = false); -}; - -enum IDBCursorDirection { - "next", - "nextunique", - "prev", - "prevunique" +interface IDBOpenDBRequest : IDBRequest { + // Event handlers: + attribute EventHandler onblocked; + attribute EventHandler onupgradeneeded; }; -dictionary IDBObjectStoreParameters { - (DOMString or sequence<DOMString>)? keyPath = null; - boolean autoIncrement = false; +[Exposed=(Window,Worker), + Constructor(DOMString type, optional IDBVersionChangeEventInit eventInitDict)] +interface IDBVersionChangeEvent : Event { + readonly attribute unsigned long long oldVersion; + readonly attribute unsigned long long? newVersion; }; -dictionary IDBIndexParameters { - boolean unique = false; - boolean multiEntry = false; +dictionary IDBVersionChangeEventInit : EventInit { + unsigned long long oldVersion = 0; + unsigned long long? newVersion = null; }; -dictionary IDBVersionChangeEventInit : EventInit { - unsigned long long oldVersion = 0; - unsigned long long? newVersion = null; +partial interface WindowOrWorkerGlobalScope { + [SameObject] readonly attribute IDBFactory indexedDB; }; [Exposed=(Window,Worker)] -interface IDBRequest : EventTarget { - readonly attribute any result; - readonly attribute DOMError error; - readonly attribute (IDBObjectStore or IDBIndex or IDBCursor)? source; - readonly attribute IDBTransaction transaction; - readonly attribute IDBRequestReadyState readyState; - attribute EventHandler onsuccess; - attribute EventHandler onerror; +interface IDBFactory { + IDBOpenDBRequest open(DOMString name, + [EnforceRange] optional unsigned long long version); + IDBOpenDBRequest deleteDatabase(DOMString name); + + short cmp(any first, any second); }; [Exposed=(Window,Worker)] -interface IDBOpenDBRequest : IDBRequest { - attribute EventHandler onblocked; - attribute EventHandler onupgradeneeded; -}; +interface IDBDatabase : EventTarget { + readonly attribute DOMString name; + readonly attribute unsigned long long version; + readonly attribute DOMStringList objectStoreNames; -[Exposed=(Window,Worker), - Constructor(DOMString type, optional IDBVersionChangeEventInit eventInitDict)] -interface IDBVersionChangeEvent : Event { - readonly attribute unsigned long long oldVersion; - readonly attribute unsigned long long? newVersion; + IDBTransaction transaction((DOMString or sequence<DOMString>) storeNames, + optional IDBTransactionMode mode = "readonly"); + void close(); + + IDBObjectStore createObjectStore(DOMString name, + optional IDBObjectStoreParameters options); + void deleteObjectStore(DOMString name); + + // Event handlers: + attribute EventHandler onabort; + attribute EventHandler onclose; + attribute EventHandler onerror; + attribute EventHandler onversionchange; }; -[NoInterfaceObject] -interface IDBEnvironment { - readonly attribute IDBFactory indexedDB; +dictionary IDBObjectStoreParameters { + (DOMString or sequence<DOMString>)? keyPath = null; + boolean autoIncrement = false; }; [Exposed=(Window,Worker)] -interface IDBFactory { - IDBOpenDBRequest open (DOMString name, [EnforceRange] optional unsigned long long version); - IDBOpenDBRequest deleteDatabase (DOMString name); - short cmp (any first, any second); +interface IDBObjectStore { + attribute DOMString name; + readonly attribute any keyPath; + readonly attribute DOMStringList indexNames; + readonly attribute IDBTransaction transaction; + readonly attribute boolean autoIncrement; + + IDBRequest put(any value, optional any key); + IDBRequest add(any value, optional any key); + IDBRequest delete(any query); + IDBRequest clear(); + IDBRequest get(any query); + IDBRequest getKey(any query); + IDBRequest getAll(optional any query, + [EnforceRange] optional unsigned long count); + IDBRequest getAllKeys(optional any query, + [EnforceRange] optional unsigned long count); + IDBRequest count(optional any query); + + IDBRequest openCursor(optional any query, + optional IDBCursorDirection direction = "next"); + IDBRequest openKeyCursor(optional any query, + optional IDBCursorDirection direction = "next"); + + IDBIndex index(DOMString name); + + IDBIndex createIndex(DOMString name, + (DOMString or sequence<DOMString>) keyPath, + optional IDBIndexParameters options); + void deleteIndex(DOMString indexName); }; -[Exposed=(Window,Worker)] -interface IDBDatabase : EventTarget { - readonly attribute DOMString name; - readonly attribute unsigned long long version; - readonly attribute DOMStringList objectStoreNames; - IDBObjectStore createObjectStore (DOMString name, optional IDBObjectStoreParameters optionalParameters); - void deleteObjectStore (DOMString name); - IDBTransaction transaction ((DOMString or sequence<DOMString>) storeNames, optional IDBTransactionMode mode = "readonly"); - void close (); - attribute EventHandler onabort; - attribute EventHandler onclose; - attribute EventHandler onerror; - attribute EventHandler onversionchange; +dictionary IDBIndexParameters { + boolean unique = false; + boolean multiEntry = false; }; [Exposed=(Window,Worker)] -interface IDBObjectStore { - attribute DOMString name; - readonly attribute any keyPath; - readonly attribute DOMStringList indexNames; - readonly attribute IDBTransaction transaction; - readonly attribute boolean autoIncrement; - IDBRequest put (any value, optional any key); - IDBRequest add (any value, optional any key); - IDBRequest delete (any key); - IDBRequest get (any key); - IDBRequest clear (); - IDBRequest openCursor (optional any range, optional IDBCursorDirection direction = "next"); - IDBIndex createIndex (DOMString name, (DOMString or sequence<DOMString>) keyPath, optional IDBIndexParameters optionalParameters); - IDBIndex index (DOMString name); - void deleteIndex (DOMString indexName); - IDBRequest count (optional any key); +interface IDBIndex { + attribute DOMString name; + readonly attribute IDBObjectStore objectStore; + readonly attribute any keyPath; + readonly attribute boolean multiEntry; + readonly attribute boolean unique; + + IDBRequest get(any query); + IDBRequest getKey(any query); + IDBRequest getAll(optional any query, + [EnforceRange] optional unsigned long count); + IDBRequest getAllKeys(optional any query, + [EnforceRange] optional unsigned long count); + IDBRequest count(optional any query); + + IDBRequest openCursor(optional any query, + optional IDBCursorDirection direction = "next"); + IDBRequest openKeyCursor(optional any query, + optional IDBCursorDirection direction = "next"); }; [Exposed=(Window,Worker)] -interface IDBIndex { - attribute DOMString name; - readonly attribute IDBObjectStore objectStore; - readonly attribute any keyPath; - readonly attribute boolean multiEntry; - readonly attribute boolean unique; - IDBRequest openCursor (optional any range, optional IDBCursorDirection direction = "next"); - IDBRequest openKeyCursor (optional any range, optional IDBCursorDirection direction = "next"); - IDBRequest get (any key); - IDBRequest getKey (any key); - IDBRequest count (optional any key); +interface IDBKeyRange { + readonly attribute any lower; + readonly attribute any upper; + readonly attribute boolean lowerOpen; + readonly attribute boolean upperOpen; + + // Static construction methods: + static IDBKeyRange only(any value); + static IDBKeyRange lowerBound(any lower, optional boolean open = false); + static IDBKeyRange upperBound(any upper, optional boolean open = false); + static IDBKeyRange bound(any lower, + any upper, + optional boolean lowerOpen = false, + optional boolean upperOpen = false); + + boolean includes(any key); }; [Exposed=(Window,Worker)] interface IDBCursor { - readonly attribute (IDBObjectStore or IDBIndex) source; - readonly attribute IDBCursorDirection direction; - readonly attribute any key; - readonly attribute any primaryKey; - IDBRequest update (any value); - void advance ([EnforceRange] unsigned long count); - void continue (optional any key); - IDBRequest delete (); + readonly attribute (IDBObjectStore or IDBIndex) source; + readonly attribute IDBCursorDirection direction; + readonly attribute any key; + readonly attribute any primaryKey; + + void advance([EnforceRange] unsigned long count); + void continue(optional any key); + void continuePrimaryKey(any key, any primaryKey); + + IDBRequest update(any value); + IDBRequest delete(); +}; + +enum IDBCursorDirection { + "next", + "nextunique", + "prev", + "prevunique" }; [Exposed=(Window,Worker)] interface IDBCursorWithValue : IDBCursor { - readonly attribute any value; + readonly attribute any value; }; [Exposed=(Window,Worker)] interface IDBTransaction : EventTarget { - readonly attribute IDBTransactionMode mode; - readonly attribute IDBDatabase db; - readonly attribute DOMError error; - IDBObjectStore objectStore (DOMString name); - void abort (); - attribute EventHandler onabort; - attribute EventHandler oncomplete; - attribute EventHandler onerror; + readonly attribute DOMStringList objectStoreNames; + readonly attribute IDBTransactionMode mode; + readonly attribute IDBDatabase db; + readonly attribute DOMException error; + + IDBObjectStore objectStore(DOMString name); + void abort(); + + // Event handlers: + attribute EventHandler onabort; + attribute EventHandler oncomplete; + attribute EventHandler onerror; +}; + +enum IDBTransactionMode { + "readonly", + "readwrite", + "versionchange" +}; + +interface DOMStringList { + readonly attribute unsigned long length; + getter DOMString (unsigned long index); + DOMString? item(unsigned long index); + + boolean contains(DOMString str); }; diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js b/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js index 87e33805087..42da53ba462 100644 --- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js +++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js @@ -3,35 +3,48 @@ importScripts("/resources/testharness.js"); importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js"); -var request = new XMLHttpRequest(); -request.open("GET", "interfaces.idl"); -request.send(); -request.onload = function() { - var idlArray = new IdlArray(); - var idls = request.responseText; - - idlArray.add_untested_idls("[Exposed=Worker] interface WorkerGlobalScope {};"); - idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface Event { };"); - idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };"); - - // From Indexed DB: - idlArray.add_idls("WorkerGlobalScope implements IDBEnvironment;"); - idlArray.add_idls(idls); - - idlArray.add_objects({ - IDBCursor: [], - IDBCursorWithValue: [], - IDBDatabase: [], - IDBEnvironment: [], - IDBFactory: ["self.indexedDB"], - IDBIndex: [], - IDBKeyRange: ["IDBKeyRange.only(0)"], - IDBObjectStore: [], - IDBOpenDBRequest: [], - IDBRequest: [], - IDBTransaction: [], - IDBVersionChangeEvent: ["new IDBVersionChangeEvent('foo')"], +async_test(function(t) { + var request = new XMLHttpRequest(); + request.open("GET", "interfaces.idl"); + request.send(); + request.onload = t.step_func(function() { + var idlArray = new IdlArray(); + var idls = request.responseText; + + // https://html.spec.whatwg.org/multipage/workers.html#workerglobalscope + idlArray.add_untested_idls("[Exposed=Worker] interface WorkerGlobalScope {};"); + + // https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope-mixin + idlArray.add_untested_idls(`[NoInterfaceObject, Exposed=(Window,Worker)] + interface WindowOrWorkerGlobalScope {};`); + idlArray.add_untested_idls("WorkerGlobalScope implements WindowOrWorkerGlobalScope;"); + + // https://dom.spec.whatwg.org/#interface-event + idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface Event { };"); + + // https://dom.spec.whatwg.org/#interface-eventtarget + idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };"); + + // From Indexed DB: + idlArray.add_idls(idls); + + idlArray.add_objects({ + IDBCursor: [], + IDBCursorWithValue: [], + IDBDatabase: [], + IDBFactory: ["self.indexedDB"], + IDBIndex: [], + IDBKeyRange: ["IDBKeyRange.only(0)"], + IDBObjectStore: [], + IDBOpenDBRequest: [], + IDBRequest: [], + IDBTransaction: [], + IDBVersionChangeEvent: ["new IDBVersionChangeEvent('foo')"], + DOMStringList: [], + }); + idlArray.test(); + t.done(); }); - idlArray.test(); - done(); -}; +}); + +done(); diff --git a/tests/wpt/web-platform-tests/IndexedDB/name-scopes.html b/tests/wpt/web-platform-tests/IndexedDB/name-scopes.html new file mode 100644 index 00000000000..d001a48cb45 --- /dev/null +++ b/tests/wpt/web-platform-tests/IndexedDB/name-scopes.html @@ -0,0 +1,134 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title> + IndexedDB: scoping for database / object store / index names, and index keys +</title> +<link rel="help" href="https://w3c.github.io/IndexedDB/#constructs"> +<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support-promises.js"></script> +<script> +'use strict'; + +// Creates the structure inside a test database. +// +// The structure includes two stores with identical indexes and nearly-similar +// records. The records differ in the "path" attribute values, which are used to +// verify that IndexedDB returns the correct records when queried. +// +// databaseName appears redundant, but we don't want to rely on database.name. +const buildStores = (database, databaseName, useUniqueKeys) => { + for (let storeName of ['x', 'y']) { + const store = database.createObjectStore( + storeName, { keyPath: 'pKey', autoIncrement: true }); + for (let indexName of ['x', 'y']) { + store.createIndex( + indexName, `${indexName}Key`, { unique: useUniqueKeys }); + } + + for (let xKeyRoot of ['x', 'y']) { + for (let yKeyRoot of ['x', 'y']) { + let xKey, yKey; + if (useUniqueKeys) { + xKey = `${xKeyRoot}${yKeyRoot}`; + yKey = `${yKeyRoot}${xKeyRoot}`; + } else { + xKey = xKeyRoot; + yKey = yKeyRoot; + } + const path = `${databaseName}-${storeName}-${xKeyRoot}-${yKeyRoot}`; + store.put({ xKey: xKey, yKey: yKey, path: path }); + } + } + } +}; + +// Creates two databases with identical structures. +const buildDatabases = (testCase, useUniqueKeys) => { + return createNamedDatabase( + testCase, 'x', database => buildStores(database, 'x', useUniqueKeys)) + .then(database => database.close()) + .then(() => createNamedDatabase( + testCase, 'y', database => buildStores(database, 'y', useUniqueKeys))) + .then(database => database.close()); +}; + +// Reads all the store's values using an index. +// +// Returns a Promise that resolves with an array of values. +const readIndex = (testCase, index) => { + return new Promise((resolve, reject) => { + const results = []; + const request = index.openCursor(IDBKeyRange.bound('a', 'z'), 'next'); + request.onsuccess = () => { + const cursor = request.result; + if (cursor) { + results.push(cursor.value); + cursor.continue(); + } else { + resolve(results); + } + } + }); +} + +// Verifies that a database contains the expected records. +const checkDatabaseContent = + (testCase, database, databaseName, usedUniqueKeys) => { + const promises = []; + const transaction = database.transaction(['x', 'y'], 'readonly'); + for (let storeName of ['x', 'y']) { + const store = transaction.objectStore(storeName); + for (let indexName of ['x', 'y']) { + const index = store.index(indexName); + + const promise = readIndex(testCase, index).then((results) => { + assert_array_equals( + results.map(result => `${result.path}:${result.pKey}`).sort(), + [`${databaseName}-${storeName}-x-x:1`, + `${databaseName}-${storeName}-x-y:2`, + `${databaseName}-${storeName}-y-x:3`, + `${databaseName}-${storeName}-y-y:4`], + 'The results should include all records put into the store'); + + let expectedKeys = (usedUniqueKeys) ? + ['xx:xx', 'xy:yx', 'yx:xy', 'yy:yy'] : ['x:x', 'x:y', 'y:x', 'y:y']; + assert_array_equals( + results.map(result => `${result.xKey}:${result.yKey}`).sort(), + expectedKeys, + 'The results should include all the index keys put in the store'); + + assert_array_equals( + results.map(result => result[`${indexName}Key`]), + results.map(result => result[`${indexName}Key`]).sort(), + 'The results should be sorted by the index key'); + }); + promises.push(promise); + } + } + + return Promise.all(promises).then(() => database); +} + +promise_test(testCase => { + return buildDatabases(testCase, false) + .then(() => openNamedDatabase(testCase, 'x', 1)) + .then(database => checkDatabaseContent(testCase, database, 'x', false)) + .then(database => database.close()) + .then(() => openNamedDatabase(testCase, 'y', 1)) + .then(database => checkDatabaseContent(testCase, database, 'y', false)) + .then(database => database.close()); +}, 'Non-unique index keys'); + +promise_test(testCase => { + return buildDatabases(testCase, true) + .then(() => openNamedDatabase(testCase, 'x', 1)) + .then(database => checkDatabaseContent(testCase, database, 'x', true)) + .then(database => database.close()) + .then(() => openNamedDatabase(testCase, 'y', 1)) + .then(database => checkDatabaseContent(testCase, database, 'y', true)) + .then(database => database.close()); +}, 'Unique index keys'); + +</script> diff --git a/tests/wpt/web-platform-tests/IndexedDB/support-promises.js b/tests/wpt/web-platform-tests/IndexedDB/support-promises.js index c24a9fb92bd..cd23d94dd16 100644 --- a/tests/wpt/web-platform-tests/IndexedDB/support-promises.js +++ b/tests/wpt/web-platform-tests/IndexedDB/support-promises.js @@ -1,13 +1,13 @@ // Returns an IndexedDB database name likely to be unique to the test case. const databaseName = (testCase) => { - return 'db' + self.location.pathname + '-' + testCase.name; + return 'db' + self.location.pathname + '-' + testCase.name; }; // Creates an EventWatcher covering all the events that can be issued by // IndexedDB requests and transactions. const requestWatcher = (testCase, request) => { - return new EventWatcher(testCase, request, - ['error', 'success', 'upgradeneeded']); + return new EventWatcher(testCase, request, + ['error', 'success', 'upgradeneeded']); }; // Migrates an IndexedDB database whose name is unique for the test case. @@ -21,43 +21,59 @@ const requestWatcher = (testCase, request) => { // resolves to an IndexedDB database that must be closed by the caller. If the // versionchange transaction is aborted, the promise resolves to an error. const migrateDatabase = (testCase, newVersion, migrationCallback) => { - // We cannot use eventWatcher.wait_for('upgradeneeded') here, because - // the versionchange transaction auto-commits before the Promise's then - // callback gets called. - return new Promise((resolve, reject) => { - const request = indexedDB.open(databaseName(testCase), newVersion); - request.onupgradeneeded = testCase.step_func(event => { - const database = event.target.result; - const transaction = event.target.transaction; - let abortCalled = false; - - // We wrap IDBTransaction.abort so we can set up the correct event - // listeners and expectations if the test chooses to abort the - // versionchange transaction. - const transactionAbort = transaction.abort.bind(transaction); - transaction.abort = () => { - request.onerror = event => { - event.preventDefault(); - resolve(event); - }; - request.onsuccess = () => reject(new Error( - 'indexedDB.open should not succeed after the ' + - 'versionchange transaction is aborted')); - transactionAbort(); - abortCalled = true; - } - - migrationCallback(database, transaction); - if (!abortCalled) { - request.onsuccess = null; - resolve(requestWatcher(testCase, request).wait_for('success')); - } - }); - request.onerror = event => reject(event.target.error); + return migrateNamedDatabase( + testCase, databaseName(testCase), newVersion, migrationCallback); +}; + +// Migrates an IndexedDB database. +// +// newVersion must be greater than the database's current version. +// +// migrationCallback will be called during a versionchange transaction and will +// be given the created database and the versionchange transaction. +// +// Returns a promise. If the versionchange transaction goes through, the promise +// resolves to an IndexedDB database that must be closed by the caller. If the +// versionchange transaction is aborted, the promise resolves to an error. +const migrateNamedDatabase = + (testCase, databaseName, newVersion, migrationCallback) => { + // We cannot use eventWatcher.wait_for('upgradeneeded') here, because + // the versionchange transaction auto-commits before the Promise's then + // callback gets called. + return new Promise((resolve, reject) => { + const request = indexedDB.open(databaseName, newVersion); + request.onupgradeneeded = testCase.step_func(event => { + const database = event.target.result; + const transaction = event.target.transaction; + let abortCalled = false; + + // We wrap IDBTransaction.abort so we can set up the correct event + // listeners and expectations if the test chooses to abort the + // versionchange transaction. + const transactionAbort = transaction.abort.bind(transaction); + transaction.abort = () => { + request.onerror = event => { + event.preventDefault(); + resolve(event); + }; request.onsuccess = () => reject(new Error( - 'indexedDB.open should not succeed without creating a ' + - 'versionchange transaction')); - }).then(event => event.target.result || event.target.error); + 'indexedDB.open should not succeed after the versionchange ' + + 'transaction is aborted')); + transactionAbort(); + abortCalled = true; + } + + migrationCallback(database, transaction); + if (!abortCalled) { + request.onsuccess = null; + resolve(requestWatcher(testCase, request).wait_for('success')); + } + }); + request.onerror = event => reject(event.target.error); + request.onsuccess = () => reject(new Error( + 'indexedDB.open should not succeed without creating a ' + + 'versionchange transaction')); + }).then(event => event.target.result || event.target.error); }; // Creates an IndexedDB database whose name is unique for the test case. @@ -68,11 +84,22 @@ const migrateDatabase = (testCase, newVersion, migrationCallback) => { // Returns a promise that resolves to an IndexedDB database. The caller must // close the database. const createDatabase = (testCase, setupCallback) => { - const request = indexedDB.deleteDatabase(databaseName(testCase)); - const eventWatcher = requestWatcher(testCase, request); + return createNamedDatabase(testCase, databaseName(testCase), setupCallback); +}; - return eventWatcher.wait_for('success').then(event => - migrateDatabase(testCase, 1, setupCallback)); +// Creates an IndexedDB database. +// +// setupCallback will be called during a versionchange transaction, and will be +// given the created database and the versionchange transaction. +// +// Returns a promise that resolves to an IndexedDB database. The caller must +// close the database. +const createNamedDatabase = (testCase, databaseName, setupCallback) => { + const request = indexedDB.deleteDatabase(databaseName); + const eventWatcher = requestWatcher(testCase, request); + + return eventWatcher.wait_for('success').then(event => + migrateNamedDatabase(testCase, databaseName, 1, setupCallback)); }; // Opens an IndexedDB database without performing schema changes. @@ -82,30 +109,39 @@ const createDatabase = (testCase, setupCallback) => { // Returns a promise that resolves to an IndexedDB database. The caller must // close the database. const openDatabase = (testCase, version) => { - const request = indexedDB.open(databaseName(testCase), version); - const eventWatcher = requestWatcher(testCase, request); - return eventWatcher.wait_for('success').then( - event => event.target.result); + return openNamedDatabase(testCase, databaseName(testCase), version); +} + +// Opens an IndexedDB database without performing schema changes. +// +// The given version number must match the database's current version. +// +// Returns a promise that resolves to an IndexedDB database. The caller must +// close the database. +const openNamedDatabase = (testCase, databaseName, version) => { + const request = indexedDB.open(databaseName, version); + const eventWatcher = requestWatcher(testCase, request); + return eventWatcher.wait_for('success').then(event => event.target.result); } // The data in the 'books' object store records in the first example of the // IndexedDB specification. const BOOKS_RECORD_DATA = [ - { title: 'Quarry Memories', author: 'Fred', isbn: 123456 }, - { title: 'Water Buffaloes', author: 'Fred', isbn: 234567 }, - { title: 'Bedrock Nights', author: 'Barney', isbn: 345678 }, + { title: 'Quarry Memories', author: 'Fred', isbn: 123456 }, + { title: 'Water Buffaloes', author: 'Fred', isbn: 234567 }, + { title: 'Bedrock Nights', author: 'Barney', isbn: 345678 }, ]; // Creates a 'books' object store whose contents closely resembles the first // example in the IndexedDB specification. const createBooksStore = (testCase, database) => { - const store = database.createObjectStore('books', - { keyPath: 'isbn', autoIncrement: true }); - store.createIndex('by_author', 'author'); - store.createIndex('by_title', 'title', { unique: true }); - for (let record of BOOKS_RECORD_DATA) - store.put(record); - return store; + const store = database.createObjectStore('books', + { keyPath: 'isbn', autoIncrement: true }); + store.createIndex('by_author', 'author'); + store.createIndex('by_title', 'title', { unique: true }); + for (let record of BOOKS_RECORD_DATA) + store.put(record); + return store; }; // Creates a 'not_books' object store used to test renaming into existing or @@ -124,14 +160,14 @@ const createNotBooksStore = (testCase, database) => { // IndexedDB implementation being tested is incorrect, or that the testing code // is using it incorrectly. const checkStoreIndexes = (testCase, store, errorMessage) => { - assert_array_equals( - store.indexNames, ['by_author', 'by_title'], errorMessage); - const authorIndex = store.index('by_author'); - const titleIndex = store.index('by_title'); - return Promise.all([ - checkAuthorIndexContents(testCase, authorIndex, errorMessage), - checkTitleIndexContents(testCase, titleIndex, errorMessage), - ]); + assert_array_equals( + store.indexNames, ['by_author', 'by_title'], errorMessage); + const authorIndex = store.index('by_author'); + const titleIndex = store.index('by_title'); + return Promise.all([ + checkAuthorIndexContents(testCase, authorIndex, errorMessage), + checkTitleIndexContents(testCase, titleIndex, errorMessage), + ]); }; // Verifies that an object store's key generator is in the same state as the @@ -141,13 +177,13 @@ const checkStoreIndexes = (testCase, store, errorMessage) => { // IndexedDB implementation being tested is incorrect, or that the testing code // is using it incorrectly. const checkStoreGenerator = (testCase, store, expectedKey, errorMessage) => { - const request = store.put( - { title: 'Bedrock Nights ' + expectedKey, author: 'Barney' }); - const eventWatcher = requestWatcher(testCase, request); - return eventWatcher.wait_for('success').then(() => { - const result = request.result; - assert_equals(result, expectedKey, errorMessage); - }); + const request = store.put( + { title: 'Bedrock Nights ' + expectedKey, author: 'Barney' }); + const eventWatcher = requestWatcher(testCase, request); + return eventWatcher.wait_for('success').then(() => { + const result = request.result; + assert_equals(result, expectedKey, errorMessage); + }); }; // Verifies that an object store's contents matches the contents used to create @@ -157,14 +193,14 @@ const checkStoreGenerator = (testCase, store, expectedKey, errorMessage) => { // IndexedDB implementation being tested is incorrect, or that the testing code // is using it incorrectly. const checkStoreContents = (testCase, store, errorMessage) => { - const request = store.get(123456); - const eventWatcher = requestWatcher(testCase, request); - return eventWatcher.wait_for('success').then(() => { - const result = request.result; - assert_equals(result.isbn, BOOKS_RECORD_DATA[0].isbn, errorMessage); - assert_equals(result.author, BOOKS_RECORD_DATA[0].author, errorMessage); - assert_equals(result.title, BOOKS_RECORD_DATA[0].title, errorMessage); - }); + const request = store.get(123456); + const eventWatcher = requestWatcher(testCase, request); + return eventWatcher.wait_for('success').then(() => { + const result = request.result; + assert_equals(result.isbn, BOOKS_RECORD_DATA[0].isbn, errorMessage); + assert_equals(result.author, BOOKS_RECORD_DATA[0].author, errorMessage); + assert_equals(result.title, BOOKS_RECORD_DATA[0].title, errorMessage); + }); }; // Verifies that index matches the 'by_author' index used to create the @@ -174,13 +210,13 @@ const checkStoreContents = (testCase, store, errorMessage) => { // IndexedDB implementation being tested is incorrect, or that the testing code // is using it incorrectly. const checkAuthorIndexContents = (testCase, index, errorMessage) => { - const request = index.get(BOOKS_RECORD_DATA[2].author); - const eventWatcher = requestWatcher(testCase, request); - return eventWatcher.wait_for('success').then(() => { - const result = request.result; - assert_equals(result.isbn, BOOKS_RECORD_DATA[2].isbn, errorMessage); - assert_equals(result.title, BOOKS_RECORD_DATA[2].title, errorMessage); - }); + const request = index.get(BOOKS_RECORD_DATA[2].author); + const eventWatcher = requestWatcher(testCase, request); + return eventWatcher.wait_for('success').then(() => { + const result = request.result; + assert_equals(result.isbn, BOOKS_RECORD_DATA[2].isbn, errorMessage); + assert_equals(result.title, BOOKS_RECORD_DATA[2].title, errorMessage); + }); }; // Verifies that an index matches the 'by_title' index used to create the books @@ -190,11 +226,11 @@ const checkAuthorIndexContents = (testCase, index, errorMessage) => { // IndexedDB implementation being tested is incorrect, or that the testing code // is using it incorrectly. const checkTitleIndexContents = (testCase, index, errorMessage) => { - const request = index.get(BOOKS_RECORD_DATA[2].title); - const eventWatcher = requestWatcher(testCase, request); - return eventWatcher.wait_for('success').then(() => { - const result = request.result; - assert_equals(result.isbn, BOOKS_RECORD_DATA[2].isbn, errorMessage); - assert_equals(result.author, BOOKS_RECORD_DATA[2].author, errorMessage); - }); + const request = index.get(BOOKS_RECORD_DATA[2].title); + const eventWatcher = requestWatcher(testCase, request); + return eventWatcher.wait_for('success').then(() => { + const result = request.result; + assert_equals(result.isbn, BOOKS_RECORD_DATA[2].isbn, errorMessage); + assert_equals(result.author, BOOKS_RECORD_DATA[2].author, errorMessage); + }); }; diff --git a/tests/wpt/web-platform-tests/LICENSE.md b/tests/wpt/web-platform-tests/LICENSE.md new file mode 100644 index 00000000000..eeae5050130 --- /dev/null +++ b/tests/wpt/web-platform-tests/LICENSE.md @@ -0,0 +1,33 @@ +#Dual-License for W3C Test Suites + +All documents in this Repository are licensed by contributors to be distributed under both the [W3C Test Suite License](#w3c-test-suite-license) and the [W3C 3-clause BSD License](#w3c-3-clause-bsd-license), reproduced below. The choice of license is up to the licensee. For more information, see [Licenses for W3C Test Suites](https://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html) + +# W3C Test Suite License + +This document, Test Suites and other documents that link to this statement are provided by the copyright holders under the following license: By using and/or copying this document, or the W3C document from which this statement is linked, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions: + +Permission to copy, and distribute the contents of this document, or the W3C document from which this statement is linked, in any medium for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the document, or portions thereof, that you use: + +* A link or URL to the original W3C document. +* The pre-existing copyright notice of the original author, or if it doesn't exist, a notice (hypertext is preferred, but a textual representation is permitted) of the form: "Copyright © [$date-of-document] World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang) and others. All Rights Reserved. http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html" +* If it exists, the STATUS of the W3C document. + +When space permits, inclusion of the full text of this NOTICE should be provided. We request that authorship attribution be provided in any software, documents, or other items or products that you create pursuant to the implementation of the contents of this document, or any portion thereof. + +No right to create modifications or derivatives of W3C documents is granted pursuant to this license. However, if additional requirements (documented in the Copyright FAQ) are satisfied, the right to create modifications or derivatives is sometimes granted by the W3C to individuals complying with those requirements. + +If a Test Suite distinguishes the test harness (or, framework for navigation) and the actual tests, permission is given to remove or alter the harness or navigation if the Test Suite in question allows to do so. The tests themselves shall NOT be changed in any way. + +The name and trademarks of W3C and other copyright holders may NOT be used in advertising or publicity pertaining to this document or other documents that link to this statement without specific, written prior permission. Title to copyright in this document will at all times remain with copyright holders. Permission is given to use the trademarked string "W3C" within claims of performance concerning W3C Specifications or features described therein, and there only, if the test suite so authorizes. + +THIS WORK IS PROVIDED BY W3C, MIT, ERCIM, KEIO, BEIHANG, THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL W3C, MIT, ERCIM, KEIO, BEIHANG, THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# W3C 3-clause BSD License + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of works must retain the original copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the original copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the W3C nor the names of its contributors may be used to endorse or promote products derived from this work without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tests/wpt/web-platform-tests/README.md b/tests/wpt/web-platform-tests/README.md index 052f255aba2..690e4e3ea1d 100644 --- a/tests/wpt/web-platform-tests/README.md +++ b/tests/wpt/web-platform-tests/README.md @@ -18,9 +18,12 @@ Running the Tests ================= The tests are designed to be run from your local computer. The test -environment requires Python 2.7+ (but not Python 3.x). You will also -need a copy of OpenSSL. Users on Windows should read the -[Windows Notes](#windows-notes) section below. +environment requires [Python 2.7+](http://www.python.org/downloads) (but not Python 3.x). +You will also need a copy of OpenSSL. + +On Windows, be sure to add the Python directory (`c:\python2x`, by default) to +your `%Path%` [Environment Variable](http://www.computerhope.com/issues/ch000549.htm), +and read the [Windows Notes](#windows-notes) section below. To get the tests running, you need to set up the test domains in your [`hosts` file](http://en.wikipedia.org/wiki/Hosts_%28file%29%23Location_in_the_file_system). The @@ -80,18 +83,29 @@ Running wptserve with SSL enabled on Windows typically requires installing an OpenSSL distribution. [Shining Light](https://slproweb.com/products/Win32OpenSSL.html) provide a convenient installer that is known to work, but requires a -little extra setup. - -After installation ensure that the path to OpenSSL is on your `%Path%` -environment variable. - -Then set the path to the default OpenSSL configuration file (usually -something like `C:\OpenSSL-Win32\bin\openssl.cfg` in the server -configuration. To do this copy `config.default.json` in the -web-platform-tests root to `config.json`. Then edit the JSON so that -the key `ssl/openssl/base_conf_path` has a value that is the path to -the OpenSSL config file. - +little extra setup, i.e.: + +Run the installer for Win32_OpenSSL_v1.1.0b (30MB). During installation, +change the default location for where to Copy OpenSSL Dlls from the +System directory to the /bin directory. + +After installation, ensure that the path to OpenSSL (typically, +this will be `C:\OpenSSL-Win32\bin`) is in your `%Path%` +[Environment Variable](http://www.computerhope.com/issues/ch000549.htm). +If you forget to do this part, you will most likely see a 'File Not Found' +error when you start wptserve. + +Finally, set the path value in the server configuration file to the +default OpenSSL configuration file location. To do this, +copy `config.default.json` in the web-platform-tests root to `config.json`. +Then edit the JSON so that the key `ssl/openssl/base_conf_path` has a +value that is the path to the OpenSSL config file (typically this +will be `C:\\OpenSSL-Win32\\bin\\openssl.cfg`). + +Alternatively, you may also use +[Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about) +in the Windows 10 Anniversary Update build, then access your windows +partition from there to launch wptserve. Test Runner =========== @@ -228,6 +242,15 @@ because we have to go through all the tests and ensure that they match the specification correctly. But we look at all of them, and take everything that we can. +OWNERS files are used only to indicate who should be notified of pull +requests. If you are interested in receiving notifications of proposed +changes to tests in a given directory, feel free to add yourself to the +OWNERS file. Anyone with expertise in the specification under test can +approve a pull request. In particular, if a test change has already +been adequately reviewed "upstream" in another repository, it can be +pushed here without any further review by supplying a link to the +upstream review. + Getting Involved ================ diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js b/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js index 12bd696a782..d584c25f81e 100644 --- a/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js +++ b/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js @@ -5,16 +5,19 @@ function run_test() { var wrappers = []; // Things we wrap (and upwrap) keys with var keys = []; // Things to wrap and unwrap + var ecdhPeerKey; // ECDH peer public key needed for non-extractable ECDH key comparison // Generate all the keys needed, then iterate over all combinations // to test wrapping and unwrapping. - Promise.all([generateWrappingKeys(), generateKeysToWrap()]) + Promise.all([generateWrappingKeys(), generateKeysToWrap(), generateEcdhPeerKey()]) .then(function(results) { + var promises = []; wrappers.forEach(function(wrapper) { keys.forEach(function(key) { - testWrapping(wrapper, key); + promises.push(testWrapping(wrapper, key)); }) }); + return Promise.all(promises); }, function(err) { promise_test(function(test) { assert_unreached("A key failed to generate: " + err.name + ": " + err.message) @@ -22,7 +25,7 @@ function run_test() { }) .then(function() { done(); - }, function(error) { + }, function(err) { promise_test(function(test) { assert_unreached("A test failed to run: " + err.name + ": " + err.message) }, "Could not run all tests") @@ -114,6 +117,12 @@ function run_test() { })); } + function generateEcdhPeerKey() { + return subtle.generateKey({name: "ECDH", namedCurve: "P-256"},true,["deriveBits"]) + .then(function(result){ + ecdhPeerKey = result.publicKey; + }); + } // Can we successfully "round-trip" (wrap, then unwrap, a key)? function testWrapping(wrapper, toWrap) { @@ -127,37 +136,98 @@ function run_test() { formats = ["raw", "jwk"] } - formats.forEach(function(fmt) { + return Promise.all(formats.map(function(fmt) { var originalExport; - - promise_test(function(test) { - return subtle.exportKey(fmt, toWrap.key) - .then(function(exportedKey) { - originalExport = exportedKey; - return exportedKey; - }).then(function(exportedKey) { - return subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters); - }).then(function(wrappedResult) { - return subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages) - }).then(function(unwrappedResult) { - return subtle.exportKey(fmt, unwrappedResult) - }).then(function(roundTripExport) { - if ("byteLength" in originalExport) { - assert_true(equalBuffers(originalExport, roundTripExport), "Post-wrap export matches original export"); - } else { - assert_true(equalJwk(originalExport, roundTripExport), "Post-wrap export matches original export."); + return subtle.exportKey(fmt, toWrap.key).then(function(exportedKey) { + originalExport = exportedKey; + if (wrappingIsPossible(originalExport, wrapper.parameters.name)) { + promise_test(function(test) { + return subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters) + .then(function(wrappedResult) { + return subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages); + }).then(function(unwrappedResult) { + assert_true(unwrappedResult.extractable, "Unwrapped result is extractable"); + return subtle.exportKey(fmt, unwrappedResult) + }).then(function(roundTripExport) { + assert_true(equalExport(originalExport, roundTripExport), "Post-wrap export matches original export"); + }, function(err) { + assert_unreached("Round trip for extractable key threw an error - " + err.name + ': "' + err.message + '"'); + }); + }, "Can wrap and unwrap " + toWrap.name + " keys using " + fmt + " and " + wrapper.parameters.name); + + if (canCompareNonExtractableKeys(toWrap.key)) { + promise_test(function(test){ + return subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters) + .then(function(wrappedResult) { + return subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, false, toWrap.usages); + }).then(function(unwrappedResult){ + assert_false(unwrappedResult.extractable, "Unwrapped result is non-extractable"); + return equalKeys(toWrap.key, unwrappedResult); + }).then(function(result){ + assert_true(result, "Unwrapped key matches original"); + }).catch(function(err){ + assert_unreached("Round trip for key unwrapped non-extractable threw an error - " + err.name + ': "' + err.message + '"'); + }); + }, "Can wrap and unwrap " + toWrap.name + " keys as non-extractable using " + fmt + " and " + wrapper.parameters.name); + + if (fmt === "jwk") { + promise_test(function(test){ + var wrappedKey; + return wrapAsNonExtractableJwk(toWrap.key,wrapper).then(function(wrappedResult){ + wrappedKey = wrappedResult; + return subtle.unwrapKey("jwk", wrappedKey, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, false, toWrap.usages); + }).then(function(unwrappedResult){ + assert_false(unwrappedResult.extractable, "Unwrapped key is non-extractable"); + return equalKeys(toWrap.key,unwrappedResult); + }).then(function(result){ + assert_true(result, "Unwrapped key matches original"); + }).catch(function(err){ + assert_unreached("Round trip for non-extractable key threw an error - " + err.name + ': "' + err.message + '"'); + }).then(function(){ + return subtle.unwrapKey("jwk", wrappedKey, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages); + }).then(function(unwrappedResult){ + assert_unreached("Unwrapping a non-extractable JWK as extractable should fail"); + }).catch(function(err){ + assert_equals(err.name, "DataError", "Unwrapping a non-extractable JWK as extractable fails with DataError"); + }); + }, "Can unwrap " + toWrap.name + " non-extractable keys using jwk and " + wrapper.parameters.name); + } } - }, function(err) { - if (wrappingIsPossible(originalExport, wrapper.parameters.name)) { - assert_unreached("Round trip threw an error - " + err.name + ': "' + err.message + '"'); - } else { - assert_true(true, "Skipped test due to key length restrictions"); - } - }) - }, "Can wrap and unwrap " + toWrap.name + " keys using " + fmt + " and " + wrapper.parameters.name); + } + }); + })); + } + // Implement key wrapping by hand to wrap a key as non-extractable JWK + function wrapAsNonExtractableJwk(key, wrapper){ + var wrappingKey = wrapper.wrappingKey, + encryptKey; + + return subtle.exportKey("jwk",wrappingKey) + .then(function(jwkWrappingKey){ + // Update the key generation parameters to work as key import parameters + var params = Object.create(wrapper.parameters.generateParameters); + if(params.name === "AES-KW") { + params.name = "AES-CBC"; + jwkWrappingKey.alg = "A"+params.length+"CBC"; + } else if (params.name === "RSA-OAEP") { + params.modulusLength = undefined; + params.publicExponent = undefined; + } + jwkWrappingKey.key_ops = ["encrypt"]; + return subtle.importKey("jwk", jwkWrappingKey, params, true, ["encrypt"]); + }).then(function(importedWrappingKey){ + encryptKey = importedWrappingKey; + return subtle.exportKey("jwk",key); + }).then(function(exportedKey){ + exportedKey.ext = false; + var jwk = JSON.stringify(exportedKey) + if (wrappingKey.algorithm.name === "AES-KW") { + return aeskw(encryptKey, str2ab(jwk.slice(0,-1) + " ".repeat(jwk.length%8 ? 8-jwk.length%8 : 0) + "}")); + } else { + return subtle.encrypt(wrapper.parameters.wrapParameters,encryptKey,str2ab(jwk)); + } }); - } @@ -189,6 +259,15 @@ function run_test() { // Helper methods follow: + // Are two exported keys equal + function equalExport(originalExport, roundTripExport) { + if ("byteLength" in originalExport) { + return equalBuffers(originalExport, roundTripExport); + } else { + return equalJwk(originalExport, roundTripExport); + } + } + // Are two array buffers the same? function equalBuffers(a, b) { if (a.byteLength !== b.byteLength) { @@ -262,5 +341,176 @@ function run_test() { return "{" + keyValuePairs.join(", ") + "}"; } + // Can we compare key values by using them + function canCompareNonExtractableKeys(key){ + if (key.usages.indexOf("decrypt") !== -1) { + return true; + } + if (key.usages.indexOf("sign") !== -1) { + return true; + } + if (key.usages.indexOf("wrapKey") !== -1) { + return true; + } + if (key.usages.indexOf("deriveBits") !== -1) { + return true; + } + return false; + } + + // Compare two keys by using them (works for non-extractable keys) + function equalKeys(expected, got){ + if ( expected.algorithm.name !== got.algorithm.name ) { + return Promise.resolve(false); + } + + var cryptParams, signParams, wrapParams, deriveParams; + switch(expected.algorithm.name){ + case "AES-CTR" : + cryptParams = {name: "AES-CTR", counter: new Uint8Array(16), length: 64}; + break; + case "AES-CBC" : + cryptParams = {name: "AES-CBC", iv: new Uint8Array(16) }; + break; + case "AES-GCM" : + cryptParams = {name: "AES-GCM", iv: new Uint8Array(16) }; + break; + case "RSA-OAEP" : + cryptParams = {name: "RSA-OAEP", label: new Uint8Array(8) }; + break; + case "RSASSA-PKCS1-v1_5" : + signParams = {name: "RSASSA-PKCS1-v1_5"}; + break; + case "RSA-PSS" : + signParams = {name: "RSA-PSS", saltLength: 32 }; + break; + case "ECDSA" : + signParams = {name: "ECDSA", hash: "SHA-256"}; + break; + case "HMAC" : + signParams = {name: "HMAC"}; + break; + case "AES-KW" : + wrapParams = {name: "AES-KW"}; + break; + case "ECDH" : + deriveParams = {name: "ECDH", public: ecdhPeerKey}; + break; + default: + throw new Error("Unsupported algorithm for key comparison"); + } + + if (cryptParams) { + return subtle.exportKey("jwk",expected) + .then(function(jwkExpectedKey){ + if (expected.algorithm.name === "RSA-OAEP") { + ["d","p","q","dp","dq","qi","oth"].forEach(function(field){ delete jwkExpectedKey[field]; }); + } + jwkExpectedKey.key_ops = ["encrypt"]; + return subtle.importKey("jwk", jwkExpectedKey, expected.algorithm, true, ["encrypt"]); + }).then(function(expectedEncryptKey){ + return subtle.encrypt(cryptParams, expectedEncryptKey, new Uint8Array(32)); + }).then(function(encryptedData){ + return subtle.decrypt(cryptParams, got, encryptedData); + }).then(function(decryptedData){ + var result = new Uint8Array(decryptedData); + return !result.some(x => x); + }); + } else if (signParams) { + var verifyKey; + return subtle.exportKey("jwk",expected) + .then(function(jwkExpectedKey){ + if (expected.algorithm.name === "RSA-PSS" || expected.algorithm.name === "RSASSA-PKCS1-v1_5") { + ["d","p","q","dp","dq","qi","oth"].forEach(function(field){ delete jwkExpectedKey[field]; }); + } + if (expected.algorithm.name === "ECDSA") { + delete jwkExpectedKey["d"]; + } + jwkExpectedKey.key_ops = ["verify"]; + return subtle.importKey("jwk", jwkExpectedKey, expected.algorithm, true, ["verify"]); + }).then(function(expectedVerifyKey){ + verifyKey = expectedVerifyKey; + return subtle.sign(signParams, got, new Uint8Array(32)); + }).then(function(signature){ + return subtle.verify(signParams, verifyKey, signature, new Uint8Array(32)); + }); + } else if (wrapParams) { + var aKeyToWrap, wrappedWithExpected; + return subtle.importKey("raw", new Uint8Array(16), "AES-CBC", true, ["encrypt"]) + .then(function(key){ + aKeyToWrap = key; + return subtle.wrapKey("raw", aKeyToWrap, expected, wrapParams); + }).then(function(wrapResult){ + wrappedWithExpected = Array.from((new Uint8Array(wrapResult)).values()); + return subtle.wrapKey("raw", aKeyToWrap, got, wrapParams); + }).then(function(wrapResult){ + var wrappedWithGot = Array.from((new Uint8Array(wrapResult)).values()); + return wrappedWithGot.every((x,i) => x === wrappedWithExpected[i]); + }); + } else { + var expectedDerivedBits; + return subtle.deriveBits(deriveParams, expected, 128) + .then(function(result){ + expectedDerivedBits = Array.from((new Uint8Array(result)).values()); + return subtle.deriveBits(deriveParams, got, 128); + }).then(function(result){ + var gotDerivedBits = Array.from((new Uint8Array(result)).values()); + return gotDerivedBits.every((x,i) => x === expectedDerivedBits[i]); + }); + } + } + + // Raw AES encryption + function aes( k, p ) { + return subtle.encrypt({name: "AES-CBC", iv: new Uint8Array(16) }, k, p).then(function(ciphertext){return ciphertext.slice(0,16);}); + } + + // AES Key Wrap + function aeskw(key, data) { + if (data.byteLength % 8 !== 0) { + throw new Error("AES Key Wrap data must be a multiple of 8 bytes in length"); + } + + var A = Uint8Array.from([0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0, 0, 0, 0, 0, 0, 0, 0]), + Av = new DataView(A.buffer), + R = [], + n = data.byteLength / 8; + + for(var i = 0; i<data.byteLength; i+=8) { + R.push(new Uint8Array(data.slice(i,i+8))); + } + + function aeskw_step(j, i, final, B) { + A.set(new Uint8Array(B.slice(0,8))); + Av.setUint32(4,Av.getUint32(4) ^ (n*j+i+1)); + R[i] = new Uint8Array(B.slice(8,16)); + if (final) { + R.unshift(A.slice(0,8)); + var result = new Uint8Array(R.length * 8); + R.forEach(function(Ri,i){ result.set(Ri, i*8); }); + return result; + } else { + A.set(R[(i+1)%n],8); + return aes(key,A); + } + } + + var p = new Promise(function(resolve){ + A.set(R[0],8); + resolve(aes(key,A)); + }); + + for(var j=0;j<6;++j) { + for(var i=0;i<n;++i) { + p = p.then(aeskw_step.bind(undefined, j, i,j===5 && i===(n-1))); + } + } + + return p; + } + + function str2ab(str) { return Uint8Array.from( str.split(''), function(s){return s.charCodeAt(0)} ); } + function ab2str(ab) { return String.fromCharCode.apply(null, new Uint8Array(ab)); } + } diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/OWNERS b/tests/wpt/web-platform-tests/XMLHttpRequest/OWNERS index 5962543a2fe..6dd7aff9326 100644 --- a/tests/wpt/web-platform-tests/XMLHttpRequest/OWNERS +++ b/tests/wpt/web-platform-tests/XMLHttpRequest/OWNERS @@ -3,7 +3,6 @@ @kangxu @caitp @Manishearth -@plehegar @jungkees @ibelem @mathiasbynens diff --git a/tests/wpt/web-platform-tests/accelerometer/OWNERS b/tests/wpt/web-platform-tests/accelerometer/OWNERS new file mode 100644 index 00000000000..cc7c3879319 --- /dev/null +++ b/tests/wpt/web-platform-tests/accelerometer/OWNERS @@ -0,0 +1,5 @@ +@zqzhang +@dontcallmedom +@tobie +@riju +@Honry diff --git a/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html b/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html new file mode 100644 index 00000000000..79cd5c925d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html @@ -0,0 +1,113 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Accelerometer Sensor IDL tests</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/accelerometer/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> +<style> + pre { + display: none; + } +</style> +<div id="log"></div> + +<pre id="idl"> +interface Event { +}; + +interface EventTarget { +}; + +interface EventHandler { +}; + +interface Error { +}; + +dictionary EventInit { +}; +</pre> + +<pre id="generic-idl"> +[SecureContext] +interface Sensor : EventTarget { + readonly attribute SensorState state; + readonly attribute SensorReading? reading; + void start(); + void stop(); + attribute EventHandler onchange; + attribute EventHandler onactivate; + attribute EventHandler onerror; +}; + +dictionary SensorOptions { + double? frequency; +}; + +enum SensorState { + "idle", + "activating", + "activated", + "errored" +}; + +[SecureContext] +interface SensorReading { + readonly attribute DOMHighResTimeStamp timeStamp; +}; + +[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)] +interface SensorErrorEvent : Event { + readonly attribute Error error; +}; + +dictionary SensorErrorEventInit : EventInit { + required Error error; +}; + +</pre> + +<pre id="accelerometer-idl"> +[Constructor(optional AccelerometerOptions accelerometerOptions)] +interface Accelerometer : Sensor { + readonly attribute AccelerometerReading? reading; + readonly attribute boolean includesGravity; +}; + +dictionary AccelerometerOptions : SensorOptions { + boolean includeGravity = true; +}; + +[Constructor(AccelerometerReadingInit AccelerometerReadingInit)] +interface AccelerometerReading : SensorReading { + readonly attribute double x; + readonly attribute double y; + readonly attribute double z; +}; + +dictionary AccelerometerReadingInit { + double x = 0; + double y = 0; + double z = 0; +}; +</pre> + +<script> +(function() { + "use strict"; + var idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById('idl').textContent); + idl_array.add_untested_idls(document.getElementById('generic-idl').textContent); + idl_array.add_idls(document.getElementById('accelerometer-idl').textContent); + + idl_array.add_objects({ + Accelerometer: ['new Accelerometer();'], + AccelerometerReading: ['new AccelerometerReading({x: 0.5, y: 0.5, z: 0.5});'] + }); + + idl_array.test(); +})(); +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_browsing_context.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_browsing_context.html deleted file mode 100644 index e0ada32babf..00000000000 --- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_browsing_context.html +++ /dev/null @@ -1,31 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>AmbientLightSensor Test: Sensor readings must only be available in the top-level browsing context</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<div id="log"></div> -<iframe src="support-iframe.html" id="frame" style="display:none"> -</iframe> -<script> - -async_test(function (t) { - document.getElementById('frame').onload = t.step_func_done(function(event) { - var iframe = document.getElementById('frame').contentWindow; - let reading = iframe.document.getElementById('reading').value; - assert_equals(reading, "null"); - }); -}, "sensor readings can not be fired within iframes"); - -test(function() { - let sensor = new AmbientLightSensor(); - sensor.start(); - var win = window.open('', '_blank'); - let reading = String(sensor.reading); - win.close(); - sensor.stop(); - assert_equals(reading, "null"); -}, "sensor readings can not be fired on the background tab"); - -</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_browsing_context.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_browsing_context.https.html new file mode 100644 index 00000000000..1b045bd9eea --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_browsing_context.https.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: Sensor readings must only be available in the top-level browsing context</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<iframe src="support-iframe.html" id="frame" style="display:none" sandbox="allow-scripts"> +</iframe> +<script> + +async_test(t => { + window.onmessage = t.step_func(e => { + assert_equals(e.data, "SecurityError"); + t.done(); + }); +}, "throw a 'SecurityError' when firing sensor readings within iframes"); + +async_test(t => { + let sensor = new AmbientLightSensor(); + sensor.start(); + sensor.onactivate = t.step_func_done(() => { + assert_not_equals(sensor.reading, null); + let cachedReading = sensor.reading; + let win = window.open('', '_blank'); + assert_equals(sensor.reading, cachedReading); + win.close(); + sensor.stop(); + }); +}, "sensor readings can not be fired on the background tab"); + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_insecure_context.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_insecure_context.html new file mode 100644 index 00000000000..76662e07eb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_insecure_context.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: insecure context</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<h2>Precondition</h2> +<ol> + <li> + Run test in an insecure context, e.g. http://example.com/. + </li> +</ol> +<div id="log"></div> +<script> + +test(() => { + assert_throws('SecurityError', () => { + let sensor = new AmbientLightSensor(); + }); +}, "throw a 'SecurityError' when construct AmbientLightSensor in an insecure context"); + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onchange-manual.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onchange-manual.html deleted file mode 100644 index 01950f739a5..00000000000 --- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onchange-manual.html +++ /dev/null @@ -1,36 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>AmbientLightSensor Test: onchange</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<h2>Description</h2> -<p> - This test validates that the "onchange" event can be invoked when changing the ambient light illuminance of the device. -</p> - -<h2>Precondition</h2> -<ol> - <li> - Change the ambient light illuminance of the device. - </li> -</ol> - -<script> - -async_test(function(t) { - let sensor = new AmbientLightSensor(); - sensor.start(); - - sensor.onchange = t.step_func_done(function(event) { - sensor.stop(); - }); - - sensor.onerror = t.step_func_done(function(event) { - assert_unreached(event.error.name + ":" + event.error.message); - }); -}, "event change fired"); - -</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onchange.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onchange.https.html new file mode 100644 index 00000000000..737bb755234 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onchange.https.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: onchange</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + +async_test(t => { + let sensor = new AmbientLightSensor(); + sensor.start(); + + sensor.onchange = t.step_func_done(() => { + assert_greater_than_equal(sensor.reading.illuminance, 0); + assert_equals(sensor.state, "activated"); + sensor.stop(); + }); + + sensor.onerror = t.step_func_done(event => { + assert_unreached(event.error.name + ":" + event.error.message); + }); +}, "event change fired"); + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onerror-manual.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onerror-manual.https.html new file mode 100644 index 00000000000..d7811cfa667 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onerror-manual.https.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: onerror</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<h2>Precondition</h2> +<ol> + <li> + Disable the Ambient Light Sensor or run test on a device without Amibent Light Sensor. + </li> +</ol> +<div id="log"></div> +<script> +let sensor; +setup(() => { + sensor = new AmbientLightSensor(); +}); + +async_test(t => { + sensor.onactivate = t.step_func_done(assert_unreached); + + sensor.onerror = t.step_func_done(event => { + assert_equals(sensor.state, 'errored'); + assert_equals(event.error.name, 'NotFoundError'); + }); + + sensor.start(); +}, "Test that 'onerror' event is fired when sensor is not supported"); + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onstatechange.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onstatechange.html deleted file mode 100644 index 99a706f20c5..00000000000 --- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_onstatechange.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>AmbientLightSensor Test: onstatechange</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<div id="log"></div> -<script> -var sensor; -setup(function() { - sensor = new AmbientLightSensor(); -}); - -test(function() { - assert_equals(sensor.state, "idle"); -}, "The default sensor.state is 'idle'."); - -async_test(function(t) { - sensor.onstatechange = t.step_func_done(function(event) { - assert_equals(sensor.state, "activating"); - }); - sensor.onerror = t.step_func_done(function(event) { - assert_unreached(event.error.name + ":" + event.error.message); - }); - sensor.start(); -}, "The sensor.state changes to 'activating' after sensor.start()."); - -async_test(function(t) { - sensor.onstatechange = t.step_func_done(function(event) { - assert_equals(sensor.state, "idle"); - }); - sensor.onerror = t.step_func_done(function(event) { - assert_unreached(event.error.name + ":" + event.error.message); - }); - sensor.stop(); -}, "The sensor.state changes to 'idle' after sensor.stop()."); - -</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_reading.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_reading.https.html new file mode 100644 index 00000000000..34eab24f9b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_reading.https.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: reading</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + +let sensor, sensor1, sensor2, cachedReading1, cachedReading2; + +setup(() => { + sensor = new AmbientLightSensor(); + sensor1 = new AmbientLightSensor(); + sensor2 = new AmbientLightSensor(); + sensor1.start(); + sensor2.start(); +}); + +async_test(t => { + let sensor = new AmbientLightSensor(); + sensor.start(); + sensor.onactivate = t.step_func_done(() => { + let cachedReading = sensor.reading; + let cachedIlluminance = cachedReading.illuminance; + sensor.stop(); + assert_equals(cachedReading.illuminance, cachedIlluminance); + }); + sensor.onerror = t.step_func_done(event => { + assert_unreached(event.error.name + ":" + event.error.message); + }); +}, "Test that sensor reading must be immutable."); + +async_test(t => { + sensor1.onactivate = t.step_func_done(() => { + cachedReading1 = sensor1.reading; + cachedReading2 = sensor2.reading; + //both sensors share the same reading instance + assert_equals(cachedReading1, cachedReading2); + //after first sensor stops its reading is null, second sensor remains + sensor1.stop(); + assert_equals(sensor1.reading, null); + assert_equals(String(sensor2.reading), "[object AmbientLightSensorReading]"); + }); + sensor1.onerror = t.step_func_done(event => { + assert_unreached(event.error.name + ":" + event.error.message); + }); +}, "Test that sensor reading is correct."); + +async_test(t => { + t.step_timeout(() => { + sensor2.onchange = t.step_func_done(() => { + let cachedReading3 = sensor2.reading; + assert_not_equals(cachedReading2, cachedReading3); + sensor2.stop(); + }); + sensor2.onerror = t.step_func_done(event => { + assert_unreached(event.error.name + ":" + event.error.message); + }); + }, 1000); +}, "Test that the sensor reading is updated when time passes."); + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_start.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_start.html deleted file mode 100644 index 2ac29be2168..00000000000 --- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_start.html +++ /dev/null @@ -1,31 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>AmbientLightSensor Test: start()</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<div id="log"></div> -<script> -var sensor, start_return; - -setup(function() { - sensor = new AmbientLightSensor(); - start_return = sensor.start(); -}); - -test(function() { - assert_equals(String(sensor.reading), "[object AmbientLightSensorReading]"); -}, "the sensor.reading is AmbientLightSensorReading after executing start() method"); - -test(function() { - assert_throws("InvalidStateError", function() { sensor.start(); }, "start() twice"); -}, "throw an InvalidStateError exception when state is neither idle nor errored"); - -//TODO: The permission is not ready. - -test(function() { - assert_equals(start_return, undefined); -}, "the sensor.start() return undefined"); - -</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_start.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_start.https.html new file mode 100644 index 00000000000..e08a2490ff0 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_start.https.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: start()</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + +let sensor, start_return; + +setup(() => { + sensor = new AmbientLightSensor(); +}); + +test(() => { + assert_equals(sensor.reading, null); +}, "The default sensor.reading is 'null'"); + +test(() => { + assert_equals(sensor.state, "idle"); +}, "The default sensor.state is 'idle'"); + +test(() => { + start_return = sensor.start(); + assert_equals(sensor.state, "activating"); +}, "The sensor.state changes to 'activating' after sensor.start()"); + +//TODO: The permission is not ready. + +test(() => { + assert_equals(start_return, undefined); +}, "the sensor.start() return undefined"); + +test(() => { + assert_throws("InvalidStateError", () => { sensor.start(); }, "start() twice"); + sensor.stop(); +}, "throw an InvalidStateError exception when state is neither idle nor errored"); + + + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_stop.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_stop.html deleted file mode 100644 index 34cd3600be1..00000000000 --- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_stop.html +++ /dev/null @@ -1,30 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>AmbientLightSensor Test: stop()</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<div id="log"></div> -<script> - -var sensor, stop_return; -setup(function() { - sensor = new AmbientLightSensor(); - sensor.start(); - stop_return = sensor.stop(); -}); - -test(function() { - assert_equals(String(sensor.reading), "null"); -}, "the sensor.reading is null after executing stop() method"); - -test(function() { - assert_throws("InvalidStateError", function() { sensor.stop(); }, "stop() twice"); -}, "throw an InvalidStateError exception when state is either idle or errored"); - -test(function() { - assert_equals(stop_return, undefined); -}, "the sensor.stop() returns undefined"); - -</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_stop.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_stop.https.html new file mode 100644 index 00000000000..8f504c5fe81 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor_stop.https.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AmbientLightSensor Test: stop()</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + +let sensor, stop_return; + +setup(() => { + sensor = new AmbientLightSensor(); + sensor.start(); + stop_return = sensor.stop(); +}); + +test(() => { + assert_equals(sensor.state, "idle"); +}, "The sensor.state changes to 'idle' after sensor.stop()"); + +test(() => { + assert_equals(sensor.reading, null); +}, "the sensor.reading is null after executing stop() method"); + +test(() => { + assert_throws("InvalidStateError", () => { sensor.stop(); }, "stop() twice"); +}, "throw an InvalidStateError exception when state is either idle or errored"); + +test(() => { + assert_equals(stop_return, undefined); +}, "the sensor.stop() returns undefined"); + +</script> diff --git a/tests/wpt/web-platform-tests/ambient-light/idlharness.html b/tests/wpt/web-platform-tests/ambient-light/idlharness.html deleted file mode 100644 index f88a602a6f9..00000000000 --- a/tests/wpt/web-platform-tests/ambient-light/idlharness.html +++ /dev/null @@ -1,107 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Ambient Light Sensor IDL tests</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="http://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/WebIDLParser.js"></script> -<script src="/resources/idlharness.js"></script> -<style> - pre { - display: none; - } -</style> -<div id="log"></div> - -<pre id="idl"> -interface Event { -}; - -interface Error { -}; - -dictionary EventInit { -}; -</pre> - -<pre id="generic-idl"> -interface Sensor : EventTarget { - readonly attribute SensorState state; - readonly attribute SensorReading? reading; - void start(); - void stop(); - attribute EventHandler onchange; - attribute EventHandler onstatechange; - attribute EventHandler onerror; -}; - -dictionary SensorOptions { - double? frequency; -}; - -enum SensorState { - "idle", - "activating", - "active", - "errored" -}; - -interface SensorReading { - readonly attribute DOMHighResTimeStamp timeStamp; -}; - -[Constructor(DOMString type, SensorReadingEventInit eventInitDict)] -interface SensorReadingEvent : Event { - readonly attribute SensorReading reading; -}; - -dictionary SensorReadingEventInit : EventInit { - SensorReading reading; -}; - -[Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)] -interface SensorErrorEvent : Event { - readonly attribute Error error; -}; - -dictionary SensorErrorEventInit : EventInit { - Error error; -}; -</pre> - -<pre id="ambient-light-idl"> -[Constructor(optional SensorOptions sensorOptions)] -interface AmbientLightSensor : Sensor { - readonly attribute AmbientLightSensorReading? reading; -}; - -[Constructor(AmbientLightSensorReadingInit ambientLightSensorReadingInit)] -interface AmbientLightSensorReading : SensorReading { - readonly attribute unrestricted double illuminance; -}; - -dictionary AmbientLightSensorReadingInit { - unrestricted double illuminance; -}; - -</pre> - -<script> -(function() { - "use strict"; - var idl_array = new IdlArray(); - idl_array.add_untested_idls(document.getElementById('idl').textContent); - idl_array.add_untested_idls(document.getElementById('generic-idl').textContent); - idl_array.add_idls(document.getElementById('ambient-light-idl').textContent); - - idl_array.add_objects({ - AmbientLightSensor: ['new AmbientLightSensor();'], - AmbientLightSensorReading: ['new AmbientLightSensorReading({ illuminance: 750 });'], - SensorReadingEvent: ['new SensorReadingEvent("reading", { reading: new AmbientLightSensorReading({ illuminance: 750 }) });'] - }); - - idl_array.test(); -})(); -</script> - diff --git a/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html b/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html new file mode 100644 index 00000000000..307d53c82d3 --- /dev/null +++ b/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Ambient Light Sensor IDL tests</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="http://www.w3.org/TR/ambient-light/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> +<style> + pre { + display: none; + } +</style> +<div id="log"></div> + +<pre id="idl"> +interface Event { +}; + +interface EventTarget { +}; + +interface EventHandler { +}; + +interface Error { +}; + +dictionary EventInit { +}; +</pre> + +<pre id="generic-idl"> +[SecureContext] +interface Sensor : EventTarget { + readonly attribute SensorState state; + readonly attribute SensorReading? reading; + void start(); + void stop(); + attribute EventHandler onchange; + attribute EventHandler onactivate; + attribute EventHandler onerror; +}; + +dictionary SensorOptions { + double? frequency; +}; + +enum SensorState { + "idle", + "activating", + "activated", + "errored" +}; + +[SecureContext] +interface SensorReading { + readonly attribute DOMHighResTimeStamp timeStamp; +}; + +[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)] +interface SensorErrorEvent : Event { + readonly attribute Error error; +}; + +dictionary SensorErrorEventInit : EventInit { + required Error error; +}; + +</pre> + +<pre id="ambient-light-idl"> +[Constructor(optional SensorOptions sensorOptions)] +interface AmbientLightSensor : Sensor { +}; + +[Constructor(AmbientLightSensorReadingInit ambientLightSensorReadingInit)] +interface AmbientLightSensorReading : SensorReading { + readonly attribute unrestricted double illuminance; +}; + +dictionary AmbientLightSensorReadingInit { + required unrestricted double illuminance; +}; +</pre> + +<script> +(() => { + "use strict"; + var idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById('idl').textContent); + idl_array.add_untested_idls(document.getElementById('generic-idl').textContent); + idl_array.add_idls(document.getElementById('ambient-light-idl').textContent); + + idl_array.add_objects({ + AmbientLightSensor: ['new AmbientLightSensor();'], + AmbientLightSensorReading: ['new AmbientLightSensorReading({ illuminance: 750 });'] + }); + + idl_array.test(); +})(); +</script> + diff --git a/tests/wpt/web-platform-tests/ambient-light/support-iframe.html b/tests/wpt/web-platform-tests/ambient-light/support-iframe.html index 994642d5137..5041a6861a4 100644 --- a/tests/wpt/web-platform-tests/ambient-light/support-iframe.html +++ b/tests/wpt/web-platform-tests/ambient-light/support-iframe.html @@ -1,11 +1,10 @@ <!DOCTYPE HTML> <meta charset="utf-8"> -<input type="text" id="reading" /> <script> - -let sensor = new AmbientLightSensor(); -sensor.start(); -document.getElementById("reading").value = String(sensor.reading); -sensor.stop(); - +try { + let sensor = new AmbientLightSensor(); + parent.postMessage( "sensor.start() can be fired within iframes" , '*'); +} catch (e) { + parent.postMessage( e.name , '*'); +} </script> diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/3.2-targetObjectsRecognized.json b/tests/wpt/web-platform-tests/annotation-model/annotations/3.2-targetObjectsRecognized.json index f6dd20ebe55..ce2dc22dd6f 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/3.2-targetObjectsRecognized.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/3.2-targetObjectsRecognized.json @@ -18,5 +18,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test index 16def6b4474..c86eb35df7e 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test @@ -39,11 +39,7 @@ "annotations/bodiesTargets/3.2.4-bodyETB.json", "annotations/bodiesTargets/3.2.4-bodyETBTypeTextualBody.json", "annotations/bodiesTargets/3.2.4-bodyETBTypeText.json", - "annotations/bodiesTargets/3.2.7-bodyChoiceSet.json", "annotations/bodiesTargets/3.2.7-bodyChoice.json", - "annotations/bodiesTargets/3.2.8-bodyList.json", - "annotations/bodiesTargets/3.2.8-bodyComposite.json", - "annotations/bodiesTargets/3.2.8-bodyIndependents.json", "annotations/bodiesTargets/3.2.1-targSingleFormat.json", "annotations/bodiesTargets/3.2.1-targSingleLanguage.json", "annotations/bodiesTargets/3.3.1-targSingleCreator.json", @@ -61,11 +57,7 @@ "annotations/bodiesTargets/3.3.7-targCanonical.json", "annotations/bodiesTargets/3.3.7-targVia.json", "annotations/bodiesTargets/3.2.1-targEWR.json", - "annotations/bodiesTargets/3.2.7-targChoiceSet.json", "annotations/bodiesTargets/3.2.7-targChoice.json", - "annotations/bodiesTargets/3.2.8-targList.json", - "annotations/bodiesTargets/3.2.8-targComposite.json", - "annotations/bodiesTargets/3.2.8-targIndependents.json", "annotations/bodiesTargets/4-bodySpecificResource.json", "annotations/bodiesTargets/4-targSpecificResource.json", "annotations/specificResource/4.3.3-refinedBy.json", diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targEWR.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targEWR.json index 4571f0ec8f4..f605d5c1c0b 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targEWR.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targEWR.json @@ -21,5 +21,6 @@ { "not": { "items": { "not": { "$ref": "bodyTarget.json#/definitions/itemEwrDetected" } } } } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targFormat.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targFormat.json index 134a8956ec0..2bc0a645787 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targFormat.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targFormat.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targLanguage.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targLanguage.json index b8f2a94b2ce..2f92b3eedc5 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targLanguage.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targLanguage.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targProcessingLanguage.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targProcessingLanguage.json index 1ddcf71a0d9..6c3f2966bfd 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targProcessingLanguage.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targProcessingLanguage.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleFormat.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleFormat.json index b58038206af..520dd512b70 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleFormat.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleFormat.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleLanguage.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleLanguage.json index 6bb9cf6cc1e..ac19b45ba52 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleLanguage.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targSingleLanguage.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targTextDirection.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targTextDirection.json index d9d0d0417cf..5da8a6273a6 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targTextDirection.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.1-targTextDirection.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.2-targType.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.2-targType.json index fa9e0a743d4..10ccd9d50dc 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.2-targType.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.2-targType.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-bodyChoiceSet.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-bodyChoiceSet.json deleted file mode 100644 index 5db068a192d..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-bodyChoiceSet.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.7-bodyChoiceSet.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Body may be a Choice or Set.", - "title": "Implements **Choice or Set** with type and items key as a body - [model 3.2.7](https://www.w3.org/TR/annotation-model/#choice-of-bodies-and-targets)", - "description": "True when a Choice or Set is used as a body. (Section 3.2.7)", - "type": "object", - "required": ["body"], - "properties": - { - "body": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoice.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoice.json index 38c2f5db08b..5a49f2f9127 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoice.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoice.json @@ -24,5 +24,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoiceSet.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoiceSet.json deleted file mode 100644 index aa121337c11..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoiceSet.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.7-targChoiceSet.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Target may be a Choice or Set.", - "title": "Implements **Choice or Set** with type and items key as a target - [model 3.2.7](https://www.w3.org/TR/annotation-model/#choice-of-bodies-and-targets)", - "description": "True when a Choice or Set is used as a target. (Section 3.2.7)", - "type": "object", - "properties": - { - "target": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyComposite.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyComposite.json deleted file mode 100644 index f0a6509d329..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyComposite.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.8-bodyComposite.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Composite resource may be used as an Annotation Body (not found).", - "title": "Implements **Composite** with **_type_ and _items_ keys** as a body of the Annotation [model 3.2.8](https://www.w3.org/TR/annotation-model/#sets-of-bodies-and-targets)", - "description": "True when Annotation includes one or more Composite resources as Annotation body(ies). (Section 3.2.8)", - "type": "object", - "required": ["body"], - "properties": - { - "body": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/compositeDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/compositeDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyIndependents.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyIndependents.json deleted file mode 100644 index c6a78db7d9f..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyIndependents.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.8-bodyIndependents.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Independents resource may be used as an Annotation Body (not found).", - "title": "Implements **Independents** with **_type_ and _items_ keys** as a body of the Annotation [model 3.2.8](https://www.w3.org/TR/annotation-model/#sets-of-bodies-and-targets)", - "description": "True when Annotation includes one or more Independents resources as Annotation body(ies). (Section 3.2.8)", - "type": "object", - "required": ["body"], - "properties": - { - "body": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/independentsDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/independentsDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyList.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyList.json deleted file mode 100644 index aa260b462e8..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyList.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.8-bodyList.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A List resource may be used as an Annotation Body (not found).", - "title": "Implements **List** with **_type_ and _items_ keys** as a body of the Annotation [model 3.2.8](https://www.w3.org/TR/annotation-model/#sets-of-bodies-and-targets)", - "description": "True when Annotation includes one or more List resources as Annotation body(ies). (Section 3.2.8)", - "type": "object", - "required": ["body"], - "properties": - { - "body": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/listDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/listDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targComposite.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targComposite.json deleted file mode 100644 index 031beec90d1..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targComposite.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.8-targComposite.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Composite resource may be used as an Annotation Target (not found).", - "title": "Implements **Composite** with **_type_ and _items_ keys** as a target of the Annotation [model 3.2.8](https://www.w3.org/TR/annotation-model/#sets-of-targets-and-targets)", - "description": "True when Annotation includes one or more Composite resources as Annotation target(ies). (Section 3.2.8)", - "type": "object", - "properties": - { - "target": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/compositeDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/compositeDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targIndependents.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targIndependents.json deleted file mode 100644 index d9f50346fb5..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targIndependents.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.8-targIndependents.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Independents resource may be used as an Annotation Target (not found).", - "title": "Implements **Independents** with **_type_ and _items_ keys** as a target of the Annotation [model 3.2.8](https://www.w3.org/TR/annotation-model/#sets-of-targets-and-targets)", - "description": "True when Annotation includes one or more Independents resources as Annotation target(ies). (Section 3.2.8)", - "type": "object", - "properties": - { - "target": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/independentsDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/independentsDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targList.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targList.json deleted file mode 100644 index 7ab726b6cf8..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.8-targList.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "3.2.8-targList.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A List resource may be used as an Annotation Target (not found).", - "title": "Implements **List** with **_type_ and _items_ keys** as a target of the Annotation [model 3.2.8](https://www.w3.org/TR/annotation-model/#sets-of-targets-and-targets)", - "description": "True when Annotation includes one or more List resources as Annotation target(ies). (Section 3.2.8)", - "type": "object", - "properties": - { - "target": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/listDetected" }, - { "not": - { - "items": - { "not": - { "$ref": "choiceSet.json#/definitions/listDetected" } - } - } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreated.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreated.json index 0db8559c7c2..85a3da6e4cf 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreated.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreated.json @@ -34,5 +34,6 @@ ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreator.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreator.json index e1ee1b4764f..d4f2e44b23c 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreator.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targCreator.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targModified.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targModified.json index 4c3cf7b6896..7c8fb0cdb8a 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targModified.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targModified.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targSingleCreator.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targSingleCreator.json index 5eb662ba9ca..91b9aed2ee4 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targSingleCreator.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.1-targSingleCreator.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmailImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmailImplemented.json index 133da131d82..daccf45e02b 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmailImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmailImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmail_sha1Implemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmail_sha1Implemented.json index 1c34b43e0f4..103ef83bdae 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmail_sha1Implemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentEmail_sha1Implemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentHomepageImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentHomepageImplemented.json index bc79f1a5e36..da8ac7fd785 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentHomepageImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentHomepageImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentIdImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentIdImplemented.json index bed81643477..8728b848dd1 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentIdImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentIdImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNameImplemented.json index 15c91f92e6d..9cd9990d147 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNameImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNameImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNicknameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNicknameImplemented.json index 7c84087f4e9..17b69bff089 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNicknameImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentNicknameImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentSingleNameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentSingleNameImplemented.json index 7f5428f5480..5604f4a4b99 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentSingleNameImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentSingleNameImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentTypeImplemented.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentTypeImplemented.json index b9f6c8bae49..f26238616ba 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentTypeImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.2-targCreatorAgentTypeImplemented.json @@ -32,5 +32,6 @@ } ] } - } + }, + "required": [ "target" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.3-targAudience.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.3-targAudience.json index df84e2b4203..5b2ba6fa97c 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.3-targAudience.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.3-targAudience.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.4-targAccessibility.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.4-targAccessibility.json index 4f04e3d1d3c..0f345a16f26 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.4-targAccessibility.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.4-targAccessibility.json @@ -34,5 +34,6 @@ ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.5-targPurpose.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.5-targPurpose.json index b3894864e27..68c861a5c75 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.5-targPurpose.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.5-targPurpose.json @@ -32,5 +32,6 @@ ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.6-targRights.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.6-targRights.json index 23906035568..31de4f809d5 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.6-targRights.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.6-targRights.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targCanonical.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targCanonical.json index f7fb58e254f..76bd003d4c2 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targCanonical.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targCanonical.json @@ -33,5 +33,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targVia.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targVia.json index c6625e73718..d175687aeac 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targVia.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.3.7-targVia.json @@ -23,5 +23,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-bodyChoiceSetFound.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-bodyChoiceSetFound.json deleted file mode 100644 index 3f6751b51ce..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-bodyChoiceSetFound.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "4-bodyChoiceSetFound.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Body may be a Choice or Set.", - "title": "If a **Choice or Set** is a body, it does NOT have a **_source_ key** - [model 4](https://www.w3.org/TR/annotation-model/#specific-resources)", - "description": "True when no Choice or Set bodies or when none of the Choice or Set bodies include the source key. (Section 4)", - "type": "object", - "properties": - { - "body": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" } , - { "type": "Array", - "minItems": 1, - "not": - { "items": { "not": { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" } } } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targChoiceSetFound.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targChoiceSetFound.json deleted file mode 100644 index 6b67481dcdd..00000000000 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targChoiceSetFound.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "4-targChoiceSetFound.json", - "assertionType": "may", - "expectedResult": "valid", - "onUnexpectedResult" : "passAndContinue", - "errorMessage": "A Target may be a Choice or Set.", - "title": "Implements a **Choice or Set** as target - [model 3.2.7](https://www.w3.org/TR/annotation-model/#choice-of-bodies-and-targets)", - "description": "True when Choice or Set is a target. (Section 3.2.7)", - "type": "object", - "properties": - { - "target": - { - "oneOf": [ - { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" } , - { "type": "Array", - "minItems": 1, - "not": - { "items": { "not": { "$ref": "choiceSet.json#/definitions/choiceOrSetDetected" } } } - } - ] - } - } -}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targSpecificResource.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targSpecificResource.json index 2e7a9f30bc4..92e388af284 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targSpecificResource.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4-targSpecificResource.json @@ -29,5 +29,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.4-targStyleClass.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.4-targStyleClass.json index cde8fa4d3f6..88765ef8eb4 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.4-targStyleClass.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.4-targStyleClass.json @@ -31,5 +31,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.5-targRenderedVia.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.5-targRenderedVia.json index 0b9a4554133..e2b718ce4d1 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.5-targRenderedVia.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/4.5-targRenderedVia.json @@ -31,5 +31,6 @@ } ] } - } + }, + "required": [ "target" ] }
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/3.2.2-targType.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/3.2.2-targType.json new file mode 100644 index 00000000000..0c85cef7f62 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/3.2.2-targType.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.2.2-targType.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "The description of a Target may include type key with one or more values that are each drawn from the model's list of resource classes.", + "title": "Implements **target _type_ key** with one or more values each of which is drawn from the **model's list of resource classes** [model 3.2.1](https://www.w3.org/TR/annotation-model/#bodies-and-targets)", + "description": "True when Annotation includes one or more Targets, one or more of which include type key with one or more values that are each drawn from the model's list of resource classes. (Section 3.2.1)", + "type": "object", + "required": [ "target" ], + "properties": + { + "target": + { + "oneOf": [ + { "anyOf": [ + { "$ref": "bodyTarget.json#/definitions/recognizedTypeFound" }, + { "$ref": "bodyTarget.json#/definitions/itemRecognizedTypeFound" }, + { "$ref": "bodyTarget.json#/definitions/sourceFormatPropertyFound" } + ] + }, + { "not": + { "items": + { "not": + { "anyOf": [ + { "$ref": "bodyTarget.json#/definitions/recognizedTypeFound" }, + { "$ref": "bodyTarget.json#/definitions/itemRecognizedTypeFound" }, + { "$ref": "bodyTarget.json#/definitions/sourceRecognizedTypeFound" } + ] + } + } + } + } + ] + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/3.3.3-targAudience.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/3.3.3-targAudience.json new file mode 100644 index 00000000000..9f71688a878 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/3.3.3-targAudience.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "3.3.3-targAudience.json", + "assertionType": "may", + "expectedResult": "valid", + "onUnexpectedResult" : "passAndContinue", + "errorMessage": "The description of a target may include audience key which has one or more values with each audience instance described using schema.org/Audience classes and properties.", + "title": "Implements **target _audience_ key** which has one or more values with each audience instance described using **[schema.org/Audience](http://schema.org/Audience) classes and properties** - [model 3.3.3](https://www.w3.org/TR/annotation-model/#intended-audience)", + "description": "True when Annotation includes one or more targets, one or more of which include audience key which has one or more values with each audience instance described using schema.org/Audience classes and properties.. (Section 3.3.3)", + "type": "object", + "required": [ "target" ], + "properties": + { + "target": + { + "oneOf": [ + { "anyOf": [ + { "$ref": "otherProperties.json#/definitions/audiencePropertyFound" }, + { "$ref": "otherProperties.json#/definitions/itemAudiencePropertyFound" }, + { "$ref": "otherProperties.json#/definitions/sourceAudiencePropertyFound" } + ] + }, + { "not": + { "items": + { "not": + { "anyOf": [ + { "$ref": "otherProperties.json#/definitions/audiencePropertyFound" }, + { "$ref": "otherProperties.json#/definitions/itemAudiencePropertyFound" }, + { "$ref": "otherProperties.json#/definitions/sourceAudiencePropertyFound" } + ] + } + } + } + } + ] + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2-selectorFound.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2-selectorFound.json index bddf35543d0..45390f35efd 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2-selectorFound.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2-selectorFound.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-conformsTo.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-conformsTo.json index a440b948653..12df91d311f 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-conformsTo.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-conformsTo.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-fragmentSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-fragmentSelector.json index df9f9968bc1..d21488ef51e 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-fragmentSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.1-fragmentSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.2-cssSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.2-cssSelector.json index aa422920908..ec335923043 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.2-cssSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.2-cssSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.3-xpathSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.3-xpathSelector.json index 53b8bb76a38..e5526be5c21 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.3-xpathSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.3-xpathSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-prefix.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-prefix.json index 31961d778c3..825a24a6d9e 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-prefix.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-prefix.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-suffix.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-suffix.json index 88a52b175c0..b03fb6028c3 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-suffix.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-suffix.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-textQuoteSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-textQuoteSelector.json index 65d2faeebb6..34ef0ed6c65 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-textQuoteSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.4-textQuoteSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.5-textPositionSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.5-textPositionSelector.json index b709b9298c0..03cdf2ee647 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.5-textPositionSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.5-textPositionSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.6-dataPositionSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.6-dataPositionSelector.json index 1735eb04582..42144206868 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.6-dataPositionSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.6-dataPositionSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.7-svgSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.7-svgSelector.json index 45b0e828bee..17834f54dbe 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.7-svgSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.7-svgSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.8-rangeSelector.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.8-rangeSelector.json index a55bf842e84..68c2feaf30b 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.8-rangeSelector.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.2.8-rangeSelector.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3-stateFound.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3-stateFound.json index 568e0fd2fea..fb1b1a09d03 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3-stateFound.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3-stateFound.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-cached.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-cached.json index 40f02af9bcb..449356a3df9 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-cached.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-cached.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-timeState.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-timeState.json index 49b2034549d..faa84764350 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-timeState.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.1-timeState.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.2-requestHeaderState.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.2-requestHeaderState.json index 66a6a5f9791..829043b126b 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.2-requestHeaderState.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.2-requestHeaderState.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.3-refinedBy.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.3-refinedBy.json index a9582597aa0..127e6841659 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.3-refinedBy.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.3.3-refinedBy.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClass.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClass.json index 079d002aabc..800950b270a 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClass.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClass.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClassValidIfPresent.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClassValidIfPresent.json index 5af382bd057..3e599a0590e 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClassValidIfPresent.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.4-styleClassValidIfPresent.json @@ -81,7 +81,8 @@ } ] } - } + }, + "required": [ "target" ] } } } diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.5-renderedVia.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.5-renderedVia.json index 008c7312045..2815d3ca7e0 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.5-renderedVia.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.5-renderedVia.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.6-scope.json b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.6-scope.json index fcc237bd3c7..f2002d597e9 100644 --- a/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.6-scope.json +++ b/tests/wpt/web-platform-tests/annotation-model/annotations/specificResource/4.6-scope.json @@ -67,7 +67,8 @@ } ] } - } + }, + "required": [ "target" ] } ], "definitions": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test b/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test index 885b3f4020c..5a75eb6bc6a 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test +++ b/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test @@ -3,6 +3,7 @@ "name": "A single Annotation Collection implements optional keys and meets optional key value constraints", "description": "A Collection of Web Annotations: <ul> <li>Should include certain properties (keys)</li> <li>May include additional keys</li> <li>May have creator Agent key values that conform to model recommended constraints</li></ul> Note: failing an assertion indicates only that a recommended or optional feature has not been implemented or has not been implemented correctly. <br/><b>Please fill textarea with json-ld serialization of a single Annotation Collection description</b>", "testType": "manual", + "skipFailures": [ "should", "may" ], "ref": "https://www.w3.org/TR/annotation-model/", "assertions": [ "collections/5.1-collectionLabelImplemented.json", diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json index e65ea8f29c1..3979744c91d 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Valid Annotation Page-level created key not found. Annotation Page may have exactly one created key value inherited from Collection.", - "title": "Implements Annotation Page-level **_created_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", - "description": "True when the Annotation Page implements exactly one created key value (Sections 3.3.1 and 5.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/createdImplemented" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Valid Annotation Page-level created key (i.e., in description of Collection included using partOf key) not found. Annotation Page may have exactly one created key value inherited from Collection.", + "title": "Implements Annotation Page-level **_created_ key** (i.e., in description of Collection included using partOf key) which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when the Annotation Page implements exactly one created key value (i.e., in description of Collection included using partOf key) (Sections 3.3.1 and 5.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/createdImplemented" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "createdImplemented": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json index be4e9c32487..96218084ad1 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json @@ -5,20 +5,12 @@ "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", "errorMessage": "ERROR: Annotation page has multiple created key values or a single created key value that is not of format date-time.", - "title": "If present the Annotation page-level **_created_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", - "description": "True when no Annotation page created key present or when created key has a single value that is of format date-time (Section 3.3.1)", - "type": "object", - "oneOf": [ - { "allOf": [ - { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "properties": - {"first": + "title": "If present the Annotation page-level **_created_ key** (i.e., in description of Collection included using partOf key) has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when no Annotation page created key present (i.e., in description of Collection included using partOf key) or when created key has a single value that is of format date-time (Section 3.3.1)", + "type": "object", + "properties": + { + "partOf": { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" } - }, - "required": [ "first" ] - } - ] + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json index 8b6ded3a4ec..6ae95413e28 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json @@ -4,23 +4,15 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Valid Annotation Page-level creator key not found. Annotation Page may have zero or more creators inherited from Collection.", - "title": "Implements **Annotation Page-level _creator_ key** which has one or more values, each of which is a **string of format uri** or an **object** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", - "description": "True when the Annotation Page implements creator key (Section 3.3.1)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorImplemented" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Valid Annotation Page-level creator key (i.e., in description of Collection included using partOf key) not found. Annotation Page may have zero or more creators inherited from Collection.", + "title": "Implements **Annotation Page-level _creator_ key** (i.e., in description of Collection included using partOf key) which has one or more values, each of which is a **string of format uri** or an **object** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorImplemented" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorImplemented": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json index 5bccc821152..68d22370afb 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Valid Annotation Page-level modified key not found. Annotation Page may have zero or exactly one modified key value inherited from Collection.", - "title": "Implements Annotation Page-level **_modified_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", - "description": "True when the Annotation Page implements exactly one modified key value (Section 3.3.1, 5.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/modifiedImplemented" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Valid Annotation Page-level modified key (i.e., in description of Collection included using partOf key) not found. Annotation Page may have zero or exactly one modified key value inherited from Collection.", + "title": "Implements Annotation Page-level **_modified_ key** (i.e., in description of Collection included using partOf key) which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when the Annotation Page implements exactly one modified key value (i.e., in description of Collection included using partOf key) (Section 3.3.1, 5.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/modifiedImplemented" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "modifiedImplemented": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json index d8591cd16a4..e7c1a558375 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json @@ -5,20 +5,12 @@ "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", "errorMessage": "ERROR: Annotation page has multiple modified key values or a single modified key value that is not of format date-time.", - "title": "If present the Annotation page-level **_modified_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", - "description": "True when no Annotation page modified key present or when modified key has a single value that is of format date-time (Section 3.3.1)", - "type": "object", - "oneOf": [ - { "allOf": [ - { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "properties": - {"first": + "title": "If present the Annotation page-level **_modified_ key** (i.e., in description of Collection included using partOf key) has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)", + "description": "True when no Annotation page modified key present (i.e., in description of Collection included using partOf key) or when modified key has a single value that is of format date-time (Section 3.3.1)", + "type": "object", + "properties": + { + "partOf": { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" } - }, - "required": [ "first" ] - } - ] + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json index c30f81ac28f..541a32deb6a 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Email for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more email values.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_email_ key** with one or more values, each of which is a **mailto: uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when one or more email values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentEmailFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Email for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found. Agents may have one or more email values.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **_email_ key** with one or more values, each of which is a **mailto: uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more email values for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) is implemented (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorAgentEmailFound" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorAgentEmailFound": { "properties": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json index 41e6ec0f6a4..ba7d38eac1d 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Email_sha1 for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more email_sha1 values.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **email_sha1 key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when one or more email_sha1 values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentEmail_sha1Found" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Email_sha1 for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found. Agents may have one or more email_sha1 values.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **email_sha1 key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more email_sha1 values for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) is implemented (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorAgentEmail_sha1Found" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorAgentEmail_sha1Found": { "properties": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json index d325b17ba83..7b8c9d7e2a8 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Homepage for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more homepage values.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_homepage_ key** with one or more values, each of which is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when one or more homepage values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentHomePageFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Homepage for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found. Agents may have one or more homepage values.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **_homepage_ key** with one or more values, each of which is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more homepage values for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) is implemented (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorAgentHomePageFound" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorAgentHomePageFound": { "properties": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json index 6d45c1df72b..2a280ead8d2 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Single id for Annotation Page Creator (Agent), inherited from Collection, not found for any Creator. Agents should have exactly one id of format uri.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_id_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when at least one Annotation Page Creator (Agent), inherited from Collection, has exactly one id (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentIdFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Single id for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found for any Creator. Agents should have exactly one id of format uri.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **_id_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when at least one Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) has exactly one id (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorAgentIdFound" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorAgentIdFound": { diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json index 077c3d51402..50f811021e1 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Name for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more name values.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_name_ key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when one or more name values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentNameFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Name for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found. Agents may have one or more name values.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **_name_ key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when one or more name values for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) is implemented (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorAgentNameFound" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorAgentNameFound": { "properties": diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json index 60398fed77c..7829deafcbb 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json @@ -4,23 +4,16 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Single nickname for Annotation Page Creator (Agent), inherited from Collection, not found for any Creator. Agents should have exactly one id of format uri.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_nickname_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when at least one Annotation Page Creator (Agent), inherited from Collection, has exactly one nickname (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentNicknameFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Single nickname for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found for any Creator. Agents should have exactly one id of format uri.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **_nickname_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when at least one Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) has exactly one nickname (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": { "$ref": "#/definitions/creatorAgentNicknameFound" } - }, - "required": [ "first" ] - } - ], + }, + "required": [ "partOf" ], "definitions": { "creatorAgentNicknameFound": { diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json index 8144fa24e5a..20b40d0104e 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json @@ -4,34 +4,27 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Type (Person, Organization, Software) for Annotation Page Creator (Agent), inherited from Collection, not found. Agents should have one or more type values.", - "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_type_ key** with one or more values from **model-recommended list (Person, Organization, Software)** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", - "description": "True when type for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)", - "oneOf": [ - { "allOf": [ - { "$ref": "#/definitions/creatorAgentNameFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": - { "$ref": "#/definitions/creatorAgentNameFound" } - }, - "required": [ "first" ] - } - ], + "errorMessage": "Type (Person, Organization, Software) for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) not found. Agents should have one or more type values.", + "title": "Implements Annotation Page-level creator (Agent) (i.e., in description of Collection included using partOf key) **_type_ key** with one or more values from **model-recommended list (Person, Organization, Software)** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)", + "description": "True when type for Annotation Page Creator (Agent) (i.e., in description of Collection included using partOf key) is implemented (Section 3.3.2)", + "type": "object", + "properties": + { + "partOf": + { "$ref": "#/definitions/creatorAgentTypeFound" } + }, + "required": [ "partOf" ], "definitions": { - "creatorAgentNameFound": + "creatorAgentTypeFound": { "properties": { "creator": { "oneOf": [ - { "$ref": "otherProperties.json#/definitions/agentNameFound" }, + { "$ref": "otherProperties.json#/definitions/agentTypeFound" }, { "type": "array", "minItems": 1, "not": - { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentNameFound" } } } + { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentTypeFound" } } } } ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json index 56e4e910124..7a3fa5c460a 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json @@ -4,28 +4,21 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Annotation Page rights key (inherited from Collection) having string value(s) of format uri not found. Annotation Page may may have zero or more rights key values.", - "title": "Implements Annotation Page **_rights_** key (inherited from Collection) which has one or more values, each of which is a **string of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)", - "description": "True when the Annotation Page implements rights key with with string(s) of format uri value(s) (Sections 5.1 and 3.3.6)", - "oneOf": [ - { "allOf": [ + "errorMessage": "Annotation Page rights key (i.e., in description of Collection included using partOf key) having string value(s) of format uri not found. Annotation Page may may have zero or more rights key values.", + "title": "Implements Annotation Page **_rights_** key (i.e., in description of Collection included using partOf key) which has one or more values, each of which is a **string of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)", + "description": "True when the Annotation Page implements collection rights key (i.e., in description of Collection included using partOf key) with with string(s) of format uri value(s) (Sections 5.1 and 3.3.6)", + "type": "object", + "properties": + { + "partOf": + { "allOf": + [ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }, { "type": "object", - "required": [ "rights" ]}, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } + "required": [ "rights" ] } ] - }, - { "type": "object", - "properties": - {"first": - { "allOf": [ - { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }, - { "type": "object", - "required": [ "rights" ]} - ] - } - }, - "required": [ "first" ] } - ] + }, + "required": [ "partOf" ] + } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json index 472c316dc6b..99f0e7c7a79 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json @@ -4,21 +4,13 @@ "assertionType": "must", "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", - "errorMessage": "ERROR: Annotation page page has one or more values for the rights key that are not strings of format uri.", - "title": "If present the Annotation page page-level **_rights_ key** has values that are all **strings of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)", - "description": "True when no Annotation page page rights key present or when all values of rights key are strings of format uri (Section 3.3.6)", + "errorMessage": "ERROR: Annotation page page has one or more values for the rights key (i.e., in description of Collection included using partOf key) that are not strings of format uri.", + "title": "If present the Annotation page page-level **_rights_ key** (i.e., in description of Collection included using partOf key)has values that are all **strings of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)", + "description": "True when no Annotation page collection rights key present or when all values of rights key are strings of format uri (Section 3.3.6)", "type": "object", - "oneOf": [ - { "allOf": [ - { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "properties": - {"first": + "properties": + { + "partOf": { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" } - }, - "required": [ "first" ] - } - ] + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json index 1c7dfb141e7..5e0934e14fa 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json @@ -4,22 +4,15 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Annotation Page has no first key (inherited from Collection).", - "title": "Implements **Annotation Page _first_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/firstFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Annotation Page has no first key (i.e., in description of Collection included using partOf key).", + "title": "Implements **Annotation Page _first_ key** (i.e., in description of Collection included using partOf key) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", + "type": "object", + "properties": + { + "partOf": { "$ref": "collections.json#/definitions/firstFound" } - }, - "required": [ "first" ] - } - ] + }, + "required": [ "partOf" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json index 2e260b1d36e..bffe4e889f0 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json @@ -4,20 +4,12 @@ "assertionType": "must", "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", - "errorMessage": "ERROR: Annotation Page has invalid first key.", - "title": "**Annotation Page _first_ key** (inherited from Collection), if present, has value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/firstValidIfPresent" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "ERROR: Annotation Page has invalid first key (i.e., in description of Collection included using partOf key).", + "title": "**Annotation Page _first_ key** (i.e., in description of Collection included using partOf key), if present, has value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", + "type": "object", + "properties": + { + "partOf": { "$ref": "collections.json#/definitions/firstValidIfPresent" } - }, - "required": [ "first" ] - } - ] + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json index e64d5d80b24..19b82f3ba96 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json @@ -4,20 +4,13 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Annotation Page has no label key (inherited from Collection).", - "title": "Implements **Annotation Page _label_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/labelFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Annotation Page has no label key (i.e., in description of Collection included using partOf key).", + "title": "Implements **Annotation Page _label_ key** (i.e., in description of Collection included using partOf key) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", + "type": "object", + "properties": + { + "partOf": { "$ref": "collections.json#/definitions/labelFound" } - }, - "required": [ "first" ] - } - ] + }, + "required": [ "partOf" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json index 740bd622aed..50749f4489d 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json @@ -4,20 +4,12 @@ "assertionType": "must", "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", - "errorMessage": "ERROR: Annotation Page has label key with non-string value or an array as value containing non-string value.", - "title": "**Annotation Page _label_ key**, if present (inherited from Collection), is **a value of type string** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/labelDefinition" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "ERROR: Annotation Page has label key (i.e., in description of Collection included using partOf key) with non-string value or an array as value containing non-string value.", + "title": "**Annotation Page _label_ key**, if present (i.e., in description of Collection included using partOf key), is **a value of type string** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", + "type": "object", + "properties": + { + "partOf": { "$ref": "collections.json#/definitions/labelDefinition" } - }, - "required": [ "first" ] - } - ] + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json index dc0806404fd..4978fedf611 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json @@ -4,20 +4,13 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Annotation Page has no last key (inherited from Collection).", - "title": "Implements **Annotation Page _last_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/lastFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "Annotation Page has no last key (i.e., in description of Collection included using partOf key).", + "title": "Implements **Annotation Page _last_ key** (i.e., in description of Collection included using partOf key) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", + "type": "object", + "properties": + { + "partOf": { "$ref": "collections.json#/definitions/lastFound" } - }, - "required": [ "first" ] - } - ] + }, + "required": [ "partOf" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json index 9d02948b39d..d80c37c4c6d 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json @@ -4,24 +4,12 @@ "assertionType": "must", "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", - "errorMessage": "ERROR: Annotation Page has last key with non-uri value or array as value containing more than one item.", - "title": "**Annotation Page _last_ key** (inherited from Collection), if present, is **a single value of format uri** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/lastValidIfPresent" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": + "errorMessage": "ERROR: Annotation Page has last key (i.e., in description of Collection included using partOf key) with non-uri value or array as value containing more than one item.", + "title": "**Annotation Page _last_ key** (i.e., in description of Collection included using partOf key), if present, is **a single value of format uri** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", + "type": "object", + "properties": + { + "partOf": { "$ref": "collections.json#/definitions/lastValidIfPresent" } - }, - "required": [ "first" ] - } - ] - - - - + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json index 6e0e61a5c15..fe1f21edae5 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json @@ -4,20 +4,13 @@ "assertionType": "may", "expectedResult": "valid", "onUnexpectedResult" : "passAndContinue", - "errorMessage": "Annotation Page has no total key (inherited from Collection).", - "title": "Implements **Annotation Page _total_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/totalFound" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": - { "$ref": "collections.json#/definitions/totalFound" } - }, - "required": [ "first" ] - } - ] + "errorMessage": "Annotation Page has no total key (i.e., in description of Collection included using partOf key).", + "title": "Implements **Annotation Page _total_ key** (i.e., in description of Collection included using partOf key) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)", + "type": "object", + "properties": + { + "partOf": + { "$ref": "collections.json#/definitions/totalFound" } + }, + "required": [ "partOf" ] } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json index eb9411d8522..ca57e286ed3 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json @@ -4,20 +4,12 @@ "assertionType": "must", "expectedResult": "valid", "onUnexpectedResult" : "failAndContinue", - "errorMessage": "ERROR: Annotation Page has total key with non-numeric value, a negative numeric value, or more than one value.", - "title": "**Annotation Page _total_ key**, if present (inherited from Collection), is **a non-negative integer value** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", - "oneOf": [ - { "allOf": [ - { "$ref": "collections.json#/definitions/totalDefinition" }, - { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" } - ] - }, - { "type": "object", - "properties": - {"first": - { "$ref": "collections.json#/definitions/totalDefinition" } - }, - "required": [ "first" ] - } - ] + "errorMessage": "ERROR: Annotation Page has total key (i.e., in description of Collection included using partOf key) with non-numeric value, a negative numeric value, or more than one value.", + "title": "**Annotation Page _total_ key**, if present (i.e., in description of Collection included using partOf key), is **a non-negative integer value** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)", + "type": "object", + "properties": + { + "partOf": + { "$ref": "collections.json#/definitions/totalDefinition" } + } } diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test index 2d53d6550c7..39fac8f93c1 100644 --- a/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test +++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test @@ -3,6 +3,7 @@ "name": "A single Annotation Page implements optional keys and meets optional key value constraints", "description": "Pages of Web Annotations: <ul> <li>MUST include certain properties (keys)</li> <li>MUST satisfy model constraints on values of required and any optional Annotation keys used</li> </ul> Note: Implementation of optional Annotation Collection keys (features), optional constraints on key values, and optional keys and constraints on Agents involved in an Annotation Collection checked by other tests.<br/><b>Please fill textarea with json-ld serialization of a single Annotation Page or an Annotation Collection with an embedded Page</b>", "testType": "manual", + "skipFailures": [ "should", "may" ], "ref": "https://www.w3.org/TR/annotation-model/", "assertions": [ "collections/pages/5.2-pagePartOfImplemented.json", diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json b/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json index b51c0461f9c..8c09b14aa40 100644 --- a/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json +++ b/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json @@ -83,11 +83,8 @@ "oneOf": [ {"$ref": "id.json#/definitions/stringUri"}, {"$ref": "choiceSet.json#/definitions/choiceDetected" }, - {"$ref": "choiceSet.json#/definitions/compositeDetected" }, - {"$ref": "choiceSet.json#/definitions/independentsDetected" }, - {"$ref": "choiceSet.json#/definitions/listDetected" }, - {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, - {"$ref": "#/definitions/externalWebResourceDetected" } + {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, + {"$ref": "#/definitions/externalWebResourceDetected" } ] }, @@ -100,9 +97,6 @@ "anyOf": [ {"$ref": "id.json#/definitions/stringUri"}, {"$ref": "choiceSet.json#/definitions/choiceDetected" }, - {"$ref": "choiceSet.json#/definitions/compositeDetected" }, - {"$ref": "choiceSet.json#/definitions/independentsDetected" }, - {"$ref": "choiceSet.json#/definitions/listDetected" }, {"$ref": "specificResource.json#/definitions/specificeResourceDetected" }, {"$ref": "#/definitions/externalWebResourceDetected" }, {"$ref": "#/definitions/textualBodyFound" } diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json b/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json index 89c2ebdc74c..aafb27bb260 100644 --- a/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json +++ b/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-04/schema#", "id": "choiceSet.json", - "title": "Definitions: Choice, Composite, List, Independents.", - "description": "Schemas in #/definitions detect or validate keys/objects used in describing Choice, Composite, List, Independents (Sections 3.2.7 and 3.2.8).", + "title": "Definitions: Choice.", + "description": "Schemas in #/definitions detect or validate keys/objects used in describing Choice (Sections 3.2.7 and 3.2.8).", "definitions": { @@ -55,69 +55,18 @@ "required": [ "type" ] }, - "compositeTypeDefinition": - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Definition: Composite type", - "description": "True when object has type key and object's type is 'Composite' (Section 3.2.7)", - "type": "object", - "properties": - { - "type": - { - "type": "string", - "enum": ["Composite"] - } - }, - "required": [ "type" ] - }, - - "listTypeDefinition": - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Definition: List type", - "description": "True when object has type key and object's type is 'List' (Section 3.2.7)", - "type": "object", - "properties": - { - "type": - { - "type": "string", - "enum": ["List"] - } - }, - "required": [ "type" ] - }, - - "independentsTypeDefinition": - { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Definition: Independents type", - "description": "True when object has type key and object's type is 'Independents' (Section 3.2.7)", - "type": "object", - "properties": - { - "type": - { - "type": "string", - "enum": ["Independents"] - } - }, - "required": [ "type" ] - }, - "choiceOrSetTypeDefinition": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Definition: Choice or Set type", - "description": "True when object has type key and object's type is any of 'Choice', 'Composite', 'List', 'Independents' (Section 3.2.7)", + "description": "True when object has type key and object's type is any of 'Choice' (Section 3.2.7)", "type": "object", "properties": { "type": { "type": "string", - "enum": ["Choice", "Composite", "List", "Independents"] + "enum": ["Choice"] } }, "required": [ "type" ] @@ -135,46 +84,10 @@ ] }, - "compositeDetected": { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Detection: Composite", - "description": "True when object's type is 'Composite' and the object has an items array (Section 3.2.8)", - "type": "object", - "allOf": - [ - { "$ref": "#/definitions/compositeTypeDefinition" }, - { "$ref": "#/definitions/itemsDetected" } - ] - }, - - "listDetected": { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Detection: List", - "description": "True when object's type is 'List' and the object has an items array (Section 3.2.7)", - "type": "object", - "allOf": - [ - { "$ref": "#/definitions/listTypeDefinition" }, - { "$ref": "#/definitions/itemsDetected" } - ] - }, - - "independentsDetected": { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Detection: Independents", - "description": "True when object's type is 'Independents' and the object has an items array (Section 3.2.7)", - "type": "object", - "allOf": - [ - { "$ref": "#/definitions/independentsTypeDefinition" }, - { "$ref": "#/definitions/itemsDetected" } - ] - }, - "choiceOrSetDetected": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Detection: Choice or Set", - "description": "True when object's type is one of Choice, Composite, List or Independents and the object has an items array (Section 3.2.7)", + "description": "True when object's type is one of Choice and the object has an items array (Section 3.2.7)", "type": "object", "allOf": [ diff --git a/tests/wpt/web-platform-tests/annotation-vocab/01-validJSON-LD-manual.html b/tests/wpt/web-platform-tests/annotation-vocab/01-validJSON-LD-manual.html new file mode 100644 index 00000000000..88a4ccf2a16 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/01-validJSON-LD-manual.html @@ -0,0 +1,26 @@ +<!doctype html> +<html> +<head> +<title>Ensure Vocabulary JSON-LD is valid</title> +<link rel="stylesheet" href="/resources/testharness.css"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <p>The Annotation Vocabulary JSON-LD context is defined to be at http://www.w3.org/ns/oa</p> + <p>Retrieve that context document and expand the following example using a JSON-LD validation tool. Does it expand?</p> + <pre> +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno4", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "id": "http://example.com/image1#xywh=100,100,300,300", + "type": "Image", + "format": "image/jpeg" + } +} +</pre> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/02-context-to-triples-manual.html b/tests/wpt/web-platform-tests/annotation-vocab/02-context-to-triples-manual.html new file mode 100644 index 00000000000..b9d6603f336 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/02-context-to-triples-manual.html @@ -0,0 +1,27 @@ +<!doctype html> +<html> +<head> +<title>JSON-LD context document can be used to convert JSON-LD serialized Annotations into RDF triples</title> +<link rel="stylesheet" href="/resources/testharness.css"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <p>The Annotation Vocabulary JSON-LD context is defined to be at http://www.w3.org/ns/oa</p> + <p>Use that context document to convert the sample below into RDF triples. Did + the conversion complete?</p> + <pre> +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno4", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "id": "http://example.com/image1#xywh=100,100,300,300", + "type": "Image", + "format": "image/jpeg" + } +} +</pre> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/03-graphs-are-isomorphic-manual.html b/tests/wpt/web-platform-tests/annotation-vocab/03-graphs-are-isomorphic-manual.html new file mode 100644 index 00000000000..5061c32eeff --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/03-graphs-are-isomorphic-manual.html @@ -0,0 +1,27 @@ +<!doctype html> +<html> +<head> +<title>Graphs produced are isomorphic</title> +<link rel="stylesheet" href="/resources/testharness.css"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <p>The Annotation Vocabulary JSON-LD context is defined to be at http://www.w3.org/ns/oa</p> + <p>Use that context to convert the content below into various format RDF + graphs. Are these graphs identical?</p> + <pre> +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno4", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "id": "http://example.com/image1#xywh=100,100,300,300", + "type": "Image", + "format": "image/jpeg" + } +} +</pre> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/04-graphs-convert-lossless-manual.html b/tests/wpt/web-platform-tests/annotation-vocab/04-graphs-convert-lossless-manual.html new file mode 100644 index 00000000000..95ebfd612eb --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/04-graphs-convert-lossless-manual.html @@ -0,0 +1,27 @@ +<!doctype html> +<html> +<head> +<title>Graphs produced can be converted back into JSON-LD with no loss</title> +<link rel="stylesheet" href="/resources/testharness.css"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <p>The Annotation Vocabulary JSON-LD context is defined to be at http://www.w3.org/ns/oa</p> + <p>Using that context, convert the content below into an RDF graph, then + convert that graph back into JSON-LD. Is the content the same?</p> + <pre> +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno4", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "id": "http://example.com/image1#xywh=100,100,300,300", + "type": "Image", + "format": "image/jpeg" + } +} +</pre> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/05-ontology-parsed-as-valid-manual.html b/tests/wpt/web-platform-tests/annotation-vocab/05-ontology-parsed-as-valid-manual.html new file mode 100644 index 00000000000..331eb23d703 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/05-ontology-parsed-as-valid-manual.html @@ -0,0 +1,14 @@ +<!doctype html> +<html> +<head> +<title>Ontology can be parsed without errors</title> +<link rel="stylesheet" href="/resources/testharness.css"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <p>The Annotation Vocabulary JSON-LD context is defined to be at http://www.w3.org/ns/oa</p> + <p>One ontology of that context is at at http://www.w3.org/ns/oa.ttl</p> + <p>Parse that ontology into a graph. Did it work?</p> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/06-ontology-internally-consistent-manual.html b/tests/wpt/web-platform-tests/annotation-vocab/06-ontology-internally-consistent-manual.html new file mode 100644 index 00000000000..84aa4334125 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/06-ontology-internally-consistent-manual.html @@ -0,0 +1,15 @@ +<!doctype html> +<html> +<head> +<title>Ontology is internally consistent</title> +<link rel="stylesheet" href="/resources/testharness.css"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <p>The Annotation Vocabulary JSON-LD context is defined to be at http://www.w3.org/ns/oa</p> + <p>One ontology of that context is at http://www.w3.org/ns/oa.ttl</p> + <p>Parse that ontology and evaluate its domains and ranges. Are they + consistent with the underlying referenced data types?</p> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/OWNERS b/tests/wpt/web-platform-tests/annotation-vocab/OWNERS new file mode 100644 index 00000000000..187f28b698e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/OWNERS @@ -0,0 +1,2 @@ +@halindrome +@gkellogg diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/.gitignore b/tests/wpt/web-platform-tests/annotation-vocab/tools/.gitignore new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/.gitignore diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/README.md b/tests/wpt/web-platform-tests/annotation-vocab/tools/README.md new file mode 100644 index 00000000000..ae44a58fa8e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/README.md @@ -0,0 +1,21 @@ +Vocabulary Exercising Tools +=========================== + +The Web Annotation Vocabulary specification defines an ontology for +portable annotations. The tools in this directory, along with the +sample files supplied, can be used to exercise the vocabulary +"implementation" against various RDF processing engines. + +ruby-rdf +======== + +This directory contains a Ruby script that will evaluate the samples. See +the README.md file in that directory for more information. + +vocab-tester.py +=============== + +This python script exercises the vocabulary implementation using rdflib, +rdflib-jsonld and pyld. Note that this means your python environment must +have those additional python modules installed in order to run the tests. + diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/anno.jsonld b/tests/wpt/web-platform-tests/annotation-vocab/tools/anno.jsonld new file mode 100644 index 00000000000..58892919c0b --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/anno.jsonld @@ -0,0 +1,128 @@ +{ + "@context": { + "oa": "http://www.w3.org/ns/oa#", + "dc": "http://purl.org/dc/elements/1.1/", + "dcterms": "http://purl.org/dc/terms/", + "dctypes": "http://purl.org/dc/dcmitype/", + "foaf": "http://xmlns.com/foaf/0.1/", + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "skos": "http://www.w3.org/2004/02/skos/core#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + "iana": "http://www.iana.org/assignments/relation/", + "owl": "http://www.w3.org/2002/07/owl#", + "as": "http://www.w3.org/ns/activitystreams#", + "schema": "http://schema.org/", + + "id": {"@type": "@id", "@id": "@id"}, + "type": {"@type": "@id", "@id": "@type"}, + + "Annotation": "oa:Annotation", + "Dataset": "dctypes:Dataset", + "Image": "dctypes:StillImage", + "Video": "dctypes:MovingImage", + "Audio": "dctypes:Sound", + "Text": "dctypes:Text", + "TextualBody": "oa:TextualBody", + "ResourceSelection": "oa:ResourceSelection", + "SpecificResource": "oa:SpecificResource", + "FragmentSelector": "oa:FragmentSelector", + "CssSelector": "oa:CssSelector", + "XPathSelector": "oa:XPathSelector", + "TextQuoteSelector": "oa:TextQuoteSelector", + "TextPositionSelector": "oa:TextPositionSelector", + "DataPositionSelector": "oa:DataPositionSelector", + "SvgSelector": "oa:SvgSelector", + "RangeSelector": "oa:RangeSelector", + "TimeState": "oa:TimeState", + "HttpRequestState": "oa:HttpRequestState", + "CssStylesheet": "oa:CssStyle", + "Choice": "oa:Choice", + "Composite": "oa:Composite", + "List": "oa:List", + "Independents": "oa:Independents", + "Person": "foaf:Person", + "Software": "as:Application", + "Organization": "foaf:Organization", + "AnnotationCollection": "as:OrderedCollection", + "AnnotationPage": "as:OrderedCollectionPage", + "Audience": "schema:Audience", + + "Motivation": "oa:Motivation", + "bookmarking": "oa:bookmarking", + "classifying": "oa:classifying", + "commenting": "oa:commenting", + "describing": "oa:describing", + "editing": "oa:editing", + "highlighting": "oa:highlighting", + "identifying": "oa:identifying", + "linking": "oa:linking", + "moderating": "oa:moderating", + "questioning": "oa:questioning", + "replying": "oa:replying", + "reviewing": "oa:reviewing", + "tagging": "oa:tagging", + + "auto": "oa:autoDirection", + "ltr": "oa:ltrDirection", + "rtl": "oa:rtlDirection", + + "body": {"@type": "@id", "@id": "oa:hasBody"}, + "target": {"@type": "@id", "@id": "oa:hasTarget"}, + "source": {"@type": "@id", "@id": "oa:hasSource"}, + "selector": {"@type": "@id", "@id": "oa:hasSelector"}, + "state": {"@type": "@id", "@id": "oa:hasState"}, + "scope": {"@type": "@id", "@id": "oa:hasScope"}, + "refinedBy": {"@type": "@id", "@id": "oa:refinedBy"}, + "startSelector": {"@type": "@id", "@id": "oa:hasStartSelector"}, + "endSelector": {"@type": "@id", "@id": "oa:hasEndSelector"}, + "renderedVia": {"@type": "@id", "@id": "oa:renderedVia"}, + "creator": {"@type": "@id", "@id": "dcterms:creator"}, + "generator": {"@type": "@id", "@id": "as:generator"}, + "rights": {"@type": "@id", "@id": "dcterms:rights"}, + "homepage": {"@type": "@id", "@id": "foaf:homepage"}, + "via": {"@type": "@id", "@id": "oa:via"}, + "canonical": {"@type": "@id", "@id": "oa:canonical"}, + "stylesheet": {"@type": "@id", "@id": "oa:styledBy"}, + "cached": {"@type": "@id", "@id": "oa:cachedSource"}, + "conformsTo": {"@type": "@id", "@id": "dcterms:conformsTo"}, + "items": {"@type": "@id", "@id": "as:items", "@container": "@list"}, + "partOf": {"@type": "@id", "@id": "as:partOf"}, + "first": {"@type": "@id", "@id": "as:first"}, + "last": {"@type": "@id", "@id": "as:last"}, + "next": {"@type": "@id", "@id": "as:next"}, + "prev": {"@type": "@id", "@id": "as:prev"}, + "audience": {"@type": "@id", "@id": "schema:audience"}, + "motivation": {"@type": "@vocab", "@id": "oa:motivatedBy"}, + "purpose": {"@type": "@vocab", "@id": "oa:hasPurpose"}, + "textDirection": {"@type": "@vocab", "@id": "oa:textDirection"}, + + "accessibility": "schema:accessibilityFeature", + "bodyValue": "oa:bodyValue", + "format": "dc:format", + "language": "dc:language", + "processingLanguage": "oa:processingLanguage", + "value": "rdf:value", + "exact": "oa:exact", + "prefix": "oa:prefix", + "suffix": "oa:suffix", + "styleClass": "oa:styleClass", + "name": "foaf:name", + "email": "foaf:mbox", + "email_sha1": "foaf:mbox_sha1sum", + "nickname": "foaf:nick", + "label": "rdfs:label", + + "created": {"@id": "dcterms:created", "@type": "xsd:dateTime"}, + "modified": {"@id": "dcterms:modified", "@type": "xsd:dateTime"}, + "generated": {"@id": "dcterms:issued", "@type": "xsd:dateTime"}, + "sourceDate": {"@id": "oa:sourceDate", "@type": "xsd:dateTime"}, + "sourceDateStart": {"@id": "oa:sourceDateStart", "@type": "xsd:dateTime"}, + "sourceDateEnd": {"@id": "oa:sourceDateEnd", "@type": "xsd:dateTime"}, + + "start": {"@id": "oa:start", "@type": "xsd:nonNegativeInteger"}, + "end": {"@id": "oa:end", "@type": "xsd:nonNegativeInteger"}, + "total": {"@id": "as:totalItems", "@type": "xsd:nonNegativeInteger"}, + "startIndex": {"@id": "as:startIndex", "@type": "xsd:nonNegativeInteger"} + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Gemfile b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Gemfile new file mode 100644 index 00000000000..3a384878013 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Gemfile @@ -0,0 +1,12 @@ +source "https://rubygems.org" +ruby '2.3.1' + +gem 'rdf', github: "ruby-rdf/rdf", branch: 'develop' +gem 'rdf-rdfxml', github: "ruby-rdf/rdf-rdfxml", branch: 'develop' +gem 'linkeddata' + +gem 'jsonlint' +gem 'rspec' +gem 'rake' + +gem 'byebug'
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Gemfile.lock b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Gemfile.lock new file mode 100644 index 00000000000..03d555134e7 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Gemfile.lock @@ -0,0 +1,192 @@ +GIT + remote: git://github.com/ruby-rdf/rdf-rdfxml.git + revision: 8a12a78aa28f3a0f58926ae77844d3e7af52ea4c + branch: develop + specs: + rdf-rdfxml (2.0.0) + htmlentities (~> 4.3) + rdf (~> 2.0) + rdf-rdfa (~> 2.0) + rdf-xsd (~> 2.0) + +GIT + remote: git://github.com/ruby-rdf/rdf.git + revision: 4740b4a52bf358656d01d93adc5174d5fe07aec8 + branch: develop + specs: + rdf (2.1.0) + hamster (~> 3.0) + link_header (~> 0.0, >= 0.0.8) + +GEM + remote: https://rubygems.org/ + specs: + addressable (2.5.0) + public_suffix (~> 2.0, >= 2.0.2) + bcp47 (0.3.3) + i18n + builder (3.2.2) + byebug (9.0.6) + concurrent-ruby (1.0.2) + crack (0.4.3) + safe_yaml (~> 1.0.0) + diff-lcs (1.2.5) + ebnf (1.0.1) + rdf (~> 2.0) + sxp (~> 1.0) + equivalent-xml (0.6.0) + nokogiri (>= 1.4.3) + haml (4.0.7) + tilt + hamster (3.0.0) + concurrent-ruby (~> 1.0) + hashdiff (0.3.0) + htmlentities (4.3.4) + i18n (0.7.0) + json-ld (2.1.0) + multi_json (~> 1.11) + rdf (~> 2.1) + jsonlint (0.2.0) + oj (~> 2) + trollop (~> 2) + ld-patch (0.3.0) + ebnf (~> 1.0, >= 1.0.1) + rdf (~> 2.0) + rdf-xsd (~> 2.0) + sparql (~> 2.0) + sxp (~> 1.0) + link_header (0.0.8) + linkeddata (2.0.0) + equivalent-xml (~> 0.6) + json-ld (~> 2.0) + ld-patch (~> 0.3) + nokogiri (~> 1.6) + rdf (~> 2.0) + rdf-aggregate-repo (~> 2.0) + rdf-isomorphic (~> 2.0) + rdf-json (~> 2.0) + rdf-microdata (~> 2.0) + rdf-n3 (~> 2.0) + rdf-rdfa (~> 2.0) + rdf-rdfxml (~> 2.0) + rdf-reasoner (~> 0.4) + rdf-tabular (~> 0.4) + rdf-trig (~> 2.0) + rdf-trix (~> 2.0) + rdf-turtle (~> 2.0) + rdf-vocab (~> 2.0) + rdf-xsd (~> 2.0) + sparql (~> 2.0) + sparql-client (~> 2.0) + mini_portile2 (2.1.0) + multi_json (1.12.1) + net-http-persistent (2.9.4) + nokogiri (1.6.8.1) + mini_portile2 (~> 2.1.0) + oj (2.17.5) + public_suffix (2.0.4) + rake (11.3.0) + rdf-aggregate-repo (2.0.0) + rdf (~> 2.0) + rdf-isomorphic (2.0.0) + rdf (~> 2.0) + rdf-json (2.0.0) + rdf (~> 2.0) + rdf-microdata (2.0.3) + htmlentities (~> 4.3) + nokogiri (~> 1.6) + rdf (~> 2.0) + rdf-xsd (~> 2.0) + rdf-n3 (2.0.0) + rdf (~> 2.0) + rdf-rdfa (2.0.1) + haml (~> 4.0) + htmlentities (~> 4.3) + rdf (~> 2.0) + rdf-aggregate-repo (~> 2.0) + rdf-xsd (~> 2.0) + rdf-reasoner (0.4.0) + rdf (~> 2.0) + rdf-spec (~> 2.0) + rdf-vocab (~> 2.0) + rdf-xsd (~> 2.0) + rdf-spec (2.0.0) + rdf (~> 2.0) + rdf-isomorphic (~> 2.0) + rspec (~> 3.0) + rspec-its (~> 1.0) + webmock (~> 1.17) + rdf-tabular (0.4.0) + addressable (~> 2.3) + bcp47 (~> 0.3, >= 0.3.3) + json-ld (~> 2.0) + rdf (~> 2.0) + rdf-vocab (~> 2.0) + rdf-xsd (~> 2.0) + rdf-trig (2.0.0) + ebnf (~> 1.0, >= 1.0.1) + rdf (~> 2.0) + rdf-turtle (~> 2.0) + rdf-trix (2.0.0) + rdf (~> 2.0) + rdf-turtle (2.0.0) + ebnf (~> 1.0, >= 1.0.1) + rdf (~> 2.0) + rdf-vocab (2.1.0) + rdf (~> 2.1) + rdf-xsd (2.0.0) + rdf (~> 2.0) + rspec (3.5.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-core (3.5.4) + rspec-support (~> 3.5.0) + rspec-expectations (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-its (1.2.0) + rspec-core (>= 3.0.0) + rspec-expectations (>= 3.0.0) + rspec-mocks (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-support (3.5.0) + safe_yaml (1.0.4) + sparql (2.0.0) + builder (~> 3.2) + ebnf (~> 1.0, >= 1.0.1) + rdf (~> 2.0) + rdf-aggregate-repo (~> 2.0) + rdf-xsd (~> 2.0) + sparql-client (~> 2.0) + sxp (~> 1.0) + sparql-client (2.1.0) + net-http-persistent (~> 2.9) + rdf (~> 2.0) + sxp (1.0.0) + rdf (~> 2.0) + tilt (2.0.5) + trollop (2.1.2) + webmock (1.24.6) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff + +PLATFORMS + ruby + +DEPENDENCIES + byebug + jsonlint + linkeddata + rake + rdf! + rdf-rdfxml! + rspec + +RUBY VERSION + ruby 2.3.1p112 + +BUNDLED WITH + 1.12.5 diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/README.md b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/README.md new file mode 100644 index 00000000000..30f441e63bc --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/README.md @@ -0,0 +1,5 @@ +## Annotation Vocabulary test in Ruby + +Setup by installing Ruby 2.3.1, and running `bundle install`. Then, to run tests: `bundle exec rake`. + +To get formatted output, run `bundle exec rspec annotation-vocab_spec.rb -f h -o RESULTS.md` diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/RESULTS.md b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/RESULTS.md new file mode 100644 index 00000000000..c7932048a95 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/RESULTS.md @@ -0,0 +1,2709 @@ +<!DOCTYPE html> +<html lang='en'> +<head> + <title>RSpec results</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="Expires" content="-1" /> + <meta http-equiv="Pragma" content="no-cache" /> + <style type="text/css"> + body { + margin: 0; + padding: 0; + background: #fff; + font-size: 80%; + } + </style> + <script type="text/javascript"> + // <![CDATA[ + +function addClass(element_id, classname) { + document.getElementById(element_id).className += (" " + classname); +} + +function removeClass(element_id, classname) { + var elem = document.getElementById(element_id); + var classlist = elem.className.replace(classname,''); + elem.className = classlist; +} + +function moveProgressBar(percentDone) { + document.getElementById("rspec-header").style.width = percentDone +"%"; +} + +function makeRed(element_id) { + removeClass(element_id, 'passed'); + removeClass(element_id, 'not_implemented'); + addClass(element_id,'failed'); +} + +function makeYellow(element_id) { + var elem = document.getElementById(element_id); + if (elem.className.indexOf("failed") == -1) { // class doesn't includes failed + if (elem.className.indexOf("not_implemented") == -1) { // class doesn't include not_implemented + removeClass(element_id, 'passed'); + addClass(element_id,'not_implemented'); + } + } +} + +function apply_filters() { + var passed_filter = document.getElementById('passed_checkbox').checked; + var failed_filter = document.getElementById('failed_checkbox').checked; + var pending_filter = document.getElementById('pending_checkbox').checked; + + assign_display_style("example passed", passed_filter); + assign_display_style("example failed", failed_filter); + assign_display_style("example not_implemented", pending_filter); + + assign_display_style_for_group("example_group passed", passed_filter); + assign_display_style_for_group("example_group not_implemented", pending_filter, pending_filter || passed_filter); + assign_display_style_for_group("example_group failed", failed_filter, failed_filter || pending_filter || passed_filter); +} + +function get_display_style(display_flag) { + var style_mode = 'none'; + if (display_flag == true) { + style_mode = 'block'; + } + return style_mode; +} + +function assign_display_style(classname, display_flag) { + var style_mode = get_display_style(display_flag); + var elems = document.getElementsByClassName(classname) + for (var i=0; i<elems.length;i++) { + elems[i].style.display = style_mode; + } +} + +function assign_display_style_for_group(classname, display_flag, subgroup_flag) { + var display_style_mode = get_display_style(display_flag); + var subgroup_style_mode = get_display_style(subgroup_flag); + var elems = document.getElementsByClassName(classname) + for (var i=0; i<elems.length;i++) { + var style_mode = display_style_mode; + if ((display_flag != subgroup_flag) && (elems[i].getElementsByTagName('dt')[0].innerHTML.indexOf(", ") != -1)) { + elems[i].style.display = subgroup_style_mode; + } else { + elems[i].style.display = display_style_mode; + } + } +} + + // ]]> + </script> + <style type="text/css"> +#rspec-header { + background: #65C400; color: #fff; height: 4em; +} + +.rspec-report h1 { + margin: 0px 10px 0px 10px; + padding: 10px; + font-family: "Lucida Grande", Helvetica, sans-serif; + font-size: 1.8em; + position: absolute; +} + +#label { + float:left; +} + +#display-filters { + float:left; + padding: 28px 0 0 40%; + font-family: "Lucida Grande", Helvetica, sans-serif; +} + +#summary { + float:right; + padding: 5px 10px; + font-family: "Lucida Grande", Helvetica, sans-serif; + text-align: right; +} + +#summary p { + margin: 0 0 0 2px; +} + +#summary #totals { + font-size: 1.2em; +} + +.example_group { + margin: 0 10px 5px; + background: #fff; +} + +dl { + margin: 0; padding: 0 0 5px; + font: normal 11px "Lucida Grande", Helvetica, sans-serif; +} + +dt { + padding: 3px; + background: #65C400; + color: #fff; + font-weight: bold; +} + +dd { + margin: 5px 0 5px 5px; + padding: 3px 3px 3px 18px; +} + +dd .duration { + padding-left: 5px; + text-align: right; + right: 0px; + float:right; +} + +dd.example.passed { + border-left: 5px solid #65C400; + border-bottom: 1px solid #65C400; + background: #DBFFB4; color: #3D7700; +} + +dd.example.not_implemented { + border-left: 5px solid #FAF834; + border-bottom: 1px solid #FAF834; + background: #FCFB98; color: #131313; +} + +dd.example.pending_fixed { + border-left: 5px solid #0000C2; + border-bottom: 1px solid #0000C2; + color: #0000C2; background: #D3FBFF; +} + +dd.example.failed { + border-left: 5px solid #C20000; + border-bottom: 1px solid #C20000; + color: #C20000; background: #FFFBD3; +} + + +dt.not_implemented { + color: #000000; background: #FAF834; +} + +dt.pending_fixed { + color: #FFFFFF; background: #C40D0D; +} + +dt.failed { + color: #FFFFFF; background: #C40D0D; +} + + +#rspec-header.not_implemented { + color: #000000; background: #FAF834; +} + +#rspec-header.pending_fixed { + color: #FFFFFF; background: #C40D0D; +} + +#rspec-header.failed { + color: #FFFFFF; background: #C40D0D; +} + + +.backtrace { + color: #000; + font-size: 12px; +} + +a { + color: #BE5C00; +} + +/* Ruby code, style similar to vibrant ink */ +.ruby { + font-size: 12px; + font-family: monospace; + color: white; + background-color: black; + padding: 0.1em 0 0.2em 0; +} + +.ruby .keyword { color: #FF6600; } +.ruby .constant { color: #339999; } +.ruby .attribute { color: white; } +.ruby .global { color: white; } +.ruby .module { color: white; } +.ruby .class { color: white; } +.ruby .string { color: #66FF00; } +.ruby .ident { color: white; } +.ruby .method { color: #FFCC00; } +.ruby .number { color: white; } +.ruby .char { color: white; } +.ruby .comment { color: #9933CC; } +.ruby .symbol { color: white; } +.ruby .regex { color: #44B4CC; } +.ruby .punct { color: white; } +.ruby .escape { color: white; } +.ruby .interp { color: white; } +.ruby .expr { color: white; } + +.ruby .offending { background-color: gray; } +.ruby .linenum { + width: 75px; + padding: 0.1em 1em 0.2em 0; + color: #000000; + background-color: #FFFBD3; +} + + </style> +</head> +<body> +<div class="rspec-report"> + +<div id="rspec-header"> + <div id="label"> + <h1>RSpec Code Examples</h1> + </div> + + <div id="display-filters"> + <input id="passed_checkbox" name="passed_checkbox" type="checkbox" checked="checked" onchange="apply_filters()" value="1" /> <label for="passed_checkbox">Passed</label> + <input id="failed_checkbox" name="failed_checkbox" type="checkbox" checked="checked" onchange="apply_filters()" value="2" /> <label for="failed_checkbox">Failed</label> + <input id="pending_checkbox" name="pending_checkbox" type="checkbox" checked="checked" onchange="apply_filters()" value="3" /> <label for="pending_checkbox">Pending</label> + </div> + + <div id="summary"> + <p id="totals"> </p> + <p id="duration"> </p> + </div> +</div> + + +<div class="results"> +<div id="div_group_1" class="example_group passed"> + <dl style="margin-left: 0px;"> + <dt id="example_group_1" class="passed">Web Annotation Vocab</dt> + <script type="text/javascript">moveProgressBar('0.3');</script> + <dd class="example passed"><span class="passed_spec_name">The JSON-LD context document can be parsed without errors by JSON-LD validators</span><span class='duration'>0.30309s</span></dd> + </dl> +</div> +<div id="div_group_2" class="example_group passed"> + <dl style="margin-left: 15px;"> + <dt id="example_group_2" class="passed">The JSON-LD context document can be used to convert JSON-LD serialized Annotations into RDF triples</dt> + <script type="text/javascript">moveProgressBar('0.6');</script> + <dd class="example passed"><span class="passed_spec_name">anno1.json</span><span class='duration'>0.56069s</span></dd> + <script type="text/javascript">moveProgressBar('0.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno1.json</span><span class='duration'>0.42548s</span></dd> + <script type="text/javascript">moveProgressBar('1.3');</script> + <dd class="example passed"><span class="passed_spec_name">anno10.json</span><span class='duration'>0.39919s</span></dd> + <script type="text/javascript">moveProgressBar('1.6');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno10.json</span><span class='duration'>0.48348s</span></dd> + <script type="text/javascript">moveProgressBar('1.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno11.json</span><span class='duration'>0.41240s</span></dd> + <script type="text/javascript">moveProgressBar('2.3');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno11.json</span><span class='duration'>0.53605s</span></dd> + <script type="text/javascript">moveProgressBar('2.6');</script> + <dd class="example passed"><span class="passed_spec_name">anno12.json</span><span class='duration'>0.40508s</span></dd> + <script type="text/javascript">moveProgressBar('2.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno12.json</span><span class='duration'>0.49430s</span></dd> + <script type="text/javascript">moveProgressBar('3.3');</script> + <dd class="example passed"><span class="passed_spec_name">anno13.json</span><span class='duration'>0.40935s</span></dd> + <script type="text/javascript">moveProgressBar('3.6');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno13.json</span><span class='duration'>0.48180s</span></dd> + <script type="text/javascript">moveProgressBar('3.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno14.json</span><span class='duration'>0.41280s</span></dd> + <script type="text/javascript">moveProgressBar('4.3');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno14.json</span><span class='duration'>0.47087s</span></dd> + <script type="text/javascript">moveProgressBar('4.6');</script> + <dd class="example passed"><span class="passed_spec_name">anno15.json</span><span class='duration'>0.40029s</span></dd> + <script type="text/javascript">moveProgressBar('4.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno15.json</span><span class='duration'>0.51705s</span></dd> + <script type="text/javascript">moveProgressBar('5.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno16.json</span><span class='duration'>0.39632s</span></dd> + <script type="text/javascript">moveProgressBar('5.6');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno16.json</span><span class='duration'>0.46520s</span></dd> + <script type="text/javascript">moveProgressBar('5.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno17.json</span><span class='duration'>0.39630s</span></dd> + <script type="text/javascript">moveProgressBar('6.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno17.json</span><span class='duration'>0.43479s</span></dd> + <script type="text/javascript">moveProgressBar('6.6');</script> + <dd class="example passed"><span class="passed_spec_name">anno18.json</span><span class='duration'>0.40481s</span></dd> + <script type="text/javascript">moveProgressBar('6.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno18.json</span><span class='duration'>0.46648s</span></dd> + <script type="text/javascript">moveProgressBar('7.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno19.json</span><span class='duration'>0.39744s</span></dd> + <script type="text/javascript">moveProgressBar('7.6');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno19.json</span><span class='duration'>0.43402s</span></dd> + <script type="text/javascript">moveProgressBar('7.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno2.json</span><span class='duration'>0.40744s</span></dd> + <script type="text/javascript">moveProgressBar('8.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno2.json</span><span class='duration'>0.44628s</span></dd> + <script type="text/javascript">moveProgressBar('8.6');</script> + <dd class="example passed"><span class="passed_spec_name">anno20.json</span><span class='duration'>0.41189s</span></dd> + <script type="text/javascript">moveProgressBar('8.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno20.json</span><span class='duration'>0.43640s</span></dd> + <script type="text/javascript">moveProgressBar('9.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno21.json</span><span class='duration'>0.39995s</span></dd> + <script type="text/javascript">moveProgressBar('9.6');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno21.json</span><span class='duration'>0.46148s</span></dd> + <script type="text/javascript">moveProgressBar('9.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno22.json</span><span class='duration'>0.40286s</span></dd> + <script type="text/javascript">moveProgressBar('10.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno22.json</span><span class='duration'>0.44256s</span></dd> + <script type="text/javascript">moveProgressBar('10.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno23.json</span><span class='duration'>0.41701s</span></dd> + <script type="text/javascript">moveProgressBar('10.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno23.json</span><span class='duration'>0.47746s</span></dd> + <script type="text/javascript">moveProgressBar('11.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno24.json</span><span class='duration'>0.41397s</span></dd> + <script type="text/javascript">moveProgressBar('11.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno24.json</span><span class='duration'>0.44446s</span></dd> + <script type="text/javascript">moveProgressBar('11.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno25.json</span><span class='duration'>0.39897s</span></dd> + <script type="text/javascript">moveProgressBar('12.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno25.json</span><span class='duration'>0.44369s</span></dd> + <script type="text/javascript">moveProgressBar('12.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno26.json</span><span class='duration'>0.40163s</span></dd> + <script type="text/javascript">moveProgressBar('12.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno26.json</span><span class='duration'>0.44521s</span></dd> + <script type="text/javascript">moveProgressBar('13.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno27.json</span><span class='duration'>0.40337s</span></dd> + <script type="text/javascript">moveProgressBar('13.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno27.json</span><span class='duration'>0.46172s</span></dd> + <script type="text/javascript">moveProgressBar('13.9');</script> + <dd class="example passed"><span class="passed_spec_name">anno28.json</span><span class='duration'>0.40573s</span></dd> + <script type="text/javascript">moveProgressBar('14.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno28.json</span><span class='duration'>0.44746s</span></dd> + <script type="text/javascript">moveProgressBar('14.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno29.json</span><span class='duration'>0.40069s</span></dd> + <script type="text/javascript">moveProgressBar('14.9');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno29.json</span><span class='duration'>0.44089s</span></dd> + <script type="text/javascript">moveProgressBar('15.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno3.json</span><span class='duration'>0.39832s</span></dd> + <script type="text/javascript">moveProgressBar('15.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno3.json</span><span class='duration'>0.44832s</span></dd> + <script type="text/javascript">moveProgressBar('15.8');</script> + <dd class="example passed"><span class="passed_spec_name">anno30.json</span><span class='duration'>0.40439s</span></dd> + <script type="text/javascript">moveProgressBar('16.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno30.json</span><span class='duration'>0.47012s</span></dd> + <script type="text/javascript">moveProgressBar('16.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno31.json</span><span class='duration'>0.40352s</span></dd> + <script type="text/javascript">moveProgressBar('16.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno31.json</span><span class='duration'>0.48881s</span></dd> + <script type="text/javascript">moveProgressBar('17.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno32.json</span><span class='duration'>0.40521s</span></dd> + <script type="text/javascript">moveProgressBar('17.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno32.json</span><span class='duration'>0.47565s</span></dd> + <script type="text/javascript">moveProgressBar('17.8');</script> + <dd class="example passed"><span class="passed_spec_name">anno33.json</span><span class='duration'>0.39758s</span></dd> + <script type="text/javascript">moveProgressBar('18.2');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno33.json</span><span class='duration'>0.42825s</span></dd> + <script type="text/javascript">moveProgressBar('18.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno34.json</span><span class='duration'>0.40342s</span></dd> + <script type="text/javascript">moveProgressBar('18.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno34.json</span><span class='duration'>0.46386s</span></dd> + <script type="text/javascript">moveProgressBar('19.2');</script> + <dd class="example passed"><span class="passed_spec_name">anno35.json</span><span class='duration'>0.39727s</span></dd> + <script type="text/javascript">moveProgressBar('19.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno35.json</span><span class='duration'>0.44666s</span></dd> + <script type="text/javascript">moveProgressBar('19.8');</script> + <dd class="example passed"><span class="passed_spec_name">anno36.json</span><span class='duration'>0.40368s</span></dd> + <script type="text/javascript">moveProgressBar('20.1');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno36.json</span><span class='duration'>0.50162s</span></dd> + <script type="text/javascript">moveProgressBar('20.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno37.json</span><span class='duration'>0.40413s</span></dd> + <script type="text/javascript">moveProgressBar('20.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno37.json</span><span class='duration'>0.44505s</span></dd> + <script type="text/javascript">moveProgressBar('21.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno38.json</span><span class='duration'>0.40365s</span></dd> + <script type="text/javascript">moveProgressBar('21.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno38.json</span><span class='duration'>0.44806s</span></dd> + <script type="text/javascript">moveProgressBar('21.8');</script> + <dd class="example passed"><span class="passed_spec_name">anno39.json</span><span class='duration'>0.39650s</span></dd> + <script type="text/javascript">moveProgressBar('22.1');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno39.json</span><span class='duration'>0.45765s</span></dd> + <script type="text/javascript">moveProgressBar('22.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno4.json</span><span class='duration'>0.40110s</span></dd> + <script type="text/javascript">moveProgressBar('22.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno4.json</span><span class='duration'>0.43765s</span></dd> + <script type="text/javascript">moveProgressBar('23.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno40.json</span><span class='duration'>0.39694s</span></dd> + <script type="text/javascript">moveProgressBar('23.5');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno40.json</span><span class='duration'>0.42795s</span></dd> + <script type="text/javascript">moveProgressBar('23.8');</script> + <dd class="example passed"><span class="passed_spec_name">anno41-example44.json</span><span class='duration'>0.42444s</span></dd> + <script type="text/javascript">moveProgressBar('24.1');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno41-example44.json</span><span class='duration'>0.82530s</span></dd> + <script type="text/javascript">moveProgressBar('24.5');</script> + <dd class="example passed"><span class="passed_spec_name">anno5.json</span><span class='duration'>0.40352s</span></dd> + <script type="text/javascript">moveProgressBar('24.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno5.json</span><span class='duration'>0.43810s</span></dd> + <script type="text/javascript">moveProgressBar('25.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno6.json</span><span class='duration'>0.40099s</span></dd> + <script type="text/javascript">moveProgressBar('25.4');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno6.json</span><span class='duration'>0.41499s</span></dd> + <script type="text/javascript">moveProgressBar('25.8');</script> + <dd class="example passed"><span class="passed_spec_name">anno7.json</span><span class='duration'>0.39763s</span></dd> + <script type="text/javascript">moveProgressBar('26.1');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno7.json</span><span class='duration'>0.45328s</span></dd> + <script type="text/javascript">moveProgressBar('26.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno8.json</span><span class='duration'>0.40016s</span></dd> + <script type="text/javascript">moveProgressBar('26.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno8.json</span><span class='duration'>0.42356s</span></dd> + <script type="text/javascript">moveProgressBar('27.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno9.json</span><span class='duration'>0.40070s</span></dd> + <script type="text/javascript">moveProgressBar('27.4');</script> + <dd class="example passed"><span class="passed_spec_name">lint anno9.json</span><span class='duration'>0.43877s</span></dd> + <script type="text/javascript">moveProgressBar('27.8');</script> + <dd class="example passed"><span class="passed_spec_name">collection1.json</span><span class='duration'>0.75470s</span></dd> + <script type="text/javascript">moveProgressBar('28.1');</script> + <dd class="example passed"><span class="passed_spec_name">lint collection1.json</span><span class='duration'>3.15045s</span></dd> + <script type="text/javascript">moveProgressBar('28.4');</script> + <dd class="example passed"><span class="passed_spec_name">example41.json</span><span class='duration'>0.39996s</span></dd> + <script type="text/javascript">moveProgressBar('28.8');</script> + <dd class="example passed"><span class="passed_spec_name">lint example41.json</span><span class='duration'>0.43951s</span></dd> + <script type="text/javascript">moveProgressBar('29.1');</script> + <dd class="example passed"><span class="passed_spec_name">example42.json</span><span class='duration'>0.40507s</span></dd> + <script type="text/javascript">moveProgressBar('29.4');</script> + <dd class="example passed"><span class="passed_spec_name">lint example42.json</span><span class='duration'>0.47543s</span></dd> + <script type="text/javascript">moveProgressBar('29.8');</script> + <dd class="example passed"><span class="passed_spec_name">example43.json</span><span class='duration'>0.40551s</span></dd> + <script type="text/javascript">moveProgressBar('30.1');</script> + <dd class="example passed"><span class="passed_spec_name">lint example43.json</span><span class='duration'>0.50432s</span></dd> + </dl> +</div> +<div id="div_group_3" class="example_group passed"> + <dl style="margin-left: 15px;"> + <dt id="example_group_3" class="passed">detects errors in incorrect examples</dt> + <script type="text/javascript">moveProgressBar('30.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno1.json</span><span class='duration'>0.00142s</span></dd> + <script type="text/javascript">moveProgressBar('30.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno10.json</span><span class='duration'>0.00076s</span></dd> + <script type="text/javascript">moveProgressBar('31.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno11.json</span><span class='duration'>0.19856s</span></dd> + <script type="text/javascript">moveProgressBar('31.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno12.json</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('31.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno13.json</span><span class='duration'>0.00075s</span></dd> + <script type="text/javascript">moveProgressBar('32.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno14.json</span><span class='duration'>0.00077s</span></dd> + <script type="text/javascript">moveProgressBar('32.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno15.json</span><span class='duration'>0.00116s</span></dd> + <script type="text/javascript">moveProgressBar('32.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno16.json</span><span class='duration'>0.00074s</span></dd> + <script type="text/javascript">moveProgressBar('33.1');</script> + <dd class="example passed"><span class="passed_spec_name">anno17.json</span><span class='duration'>0.00075s</span></dd> + <script type="text/javascript">moveProgressBar('33.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno18.json</span><span class='duration'>0.00077s</span></dd> + <script type="text/javascript">moveProgressBar('33.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno19.json</span><span class='duration'>0.00071s</span></dd> + <script type="text/javascript">makeYellow('rspec-header');</script> + <script type="text/javascript">makeYellow('div_group_3');</script> + <script type="text/javascript">makeYellow('example_group_3');</script> + <script type="text/javascript">moveProgressBar('34.1');</script> + <dd class="example not_implemented"><span class="not_implemented_spec_name">anno2.json (PENDING: Empty Documents are invalid)</span></dd> + <script type="text/javascript">moveProgressBar('34.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno20.json</span><span class='duration'>0.00112s</span></dd> + <script type="text/javascript">moveProgressBar('34.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno21.json</span><span class='duration'>0.00119s</span></dd> + <script type="text/javascript">moveProgressBar('35.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno22.json</span><span class='duration'>0.00106s</span></dd> + <script type="text/javascript">moveProgressBar('35.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno23.json</span><span class='duration'>0.00075s</span></dd> + <script type="text/javascript">moveProgressBar('35.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno24.json</span><span class='duration'>0.00076s</span></dd> + <script type="text/javascript">moveProgressBar('36.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno25.json</span><span class='duration'>0.00066s</span></dd> + <script type="text/javascript">moveProgressBar('36.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno26.json</span><span class='duration'>0.19880s</span></dd> + <script type="text/javascript">moveProgressBar('36.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno27.json</span><span class='duration'>0.20570s</span></dd> + <script type="text/javascript">moveProgressBar('37.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno28.json</span><span class='duration'>0.19991s</span></dd> + <script type="text/javascript">moveProgressBar('37.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno29.json</span><span class='duration'>0.19764s</span></dd> + <script type="text/javascript">makeYellow('rspec-header');</script> + <script type="text/javascript">makeYellow('div_group_3');</script> + <script type="text/javascript">makeYellow('example_group_3');</script> + <script type="text/javascript">moveProgressBar('37.7');</script> + <dd class="example not_implemented"><span class="not_implemented_spec_name">anno3.json (PENDING: Empty Documents are invalid)</span></dd> + <script type="text/javascript">moveProgressBar('38.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno30.json</span><span class='duration'>0.19944s</span></dd> + <script type="text/javascript">moveProgressBar('38.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno31.json</span><span class='duration'>0.20036s</span></dd> + <script type="text/javascript">moveProgressBar('38.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno32.json</span><span class='duration'>0.19468s</span></dd> + <script type="text/javascript">moveProgressBar('39.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno33.json</span><span class='duration'>0.20145s</span></dd> + <script type="text/javascript">moveProgressBar('39.4');</script> + <dd class="example passed"><span class="passed_spec_name">anno34.json</span><span class='duration'>0.19786s</span></dd> + <script type="text/javascript">moveProgressBar('39.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno35.json</span><span class='duration'>0.19442s</span></dd> + <script type="text/javascript">moveProgressBar('40.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno36.json</span><span class='duration'>0.20170s</span></dd> + <script type="text/javascript">moveProgressBar('40.3');</script> + <dd class="example passed"><span class="passed_spec_name">anno37.json</span><span class='duration'>0.00073s</span></dd> + <script type="text/javascript">moveProgressBar('40.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno38.json</span><span class='duration'>0.19785s</span></dd> + <script type="text/javascript">moveProgressBar('41.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno39.json</span><span class='duration'>0.20030s</span></dd> + <script type="text/javascript">moveProgressBar('41.3');</script> + <dd class="example passed"><span class="passed_spec_name">anno4.json</span><span class='duration'>0.00247s</span></dd> + <script type="text/javascript">moveProgressBar('41.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno5.json</span><span class='duration'>0.11420s</span></dd> + <script type="text/javascript">moveProgressBar('42.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno6.json</span><span class='duration'>0.19756s</span></dd> + <script type="text/javascript">moveProgressBar('42.3');</script> + <dd class="example passed"><span class="passed_spec_name">anno7.json</span><span class='duration'>0.19826s</span></dd> + <script type="text/javascript">moveProgressBar('42.7');</script> + <dd class="example passed"><span class="passed_spec_name">anno8.json</span><span class='duration'>0.19797s</span></dd> + <script type="text/javascript">moveProgressBar('43.0');</script> + <dd class="example passed"><span class="passed_spec_name">anno9.json</span><span class='duration'>0.19496s</span></dd> + </dl> +</div> +<div id="div_group_4" class="example_group passed"> + <dl style="margin-left: 15px;"> + <dt id="example_group_4" class="passed">The ontology documents can be parsed without errors by RDF Schema validators</dt> + <script type="text/javascript">moveProgressBar('43.3');</script> + <dd class="example passed"><span class="passed_spec_name">JSON-LD version is isomorphic to jsonld</span><span class='duration'>0.33990s</span></dd> + <script type="text/javascript">moveProgressBar('43.7');</script> + <dd class="example passed"><span class="passed_spec_name">JSON-LD version is isomorphic to rdfa</span><span class='duration'>0.24762s</span></dd> + <script type="text/javascript">moveProgressBar('44.0');</script> + <dd class="example passed"><span class="passed_spec_name">JSON-LD version is isomorphic to rdfxml</span><span class='duration'>0.38899s</span></dd> + <script type="text/javascript">moveProgressBar('44.3');</script> + <dd class="example passed"><span class="passed_spec_name">JSON-LD version is isomorphic to ttl</span><span class='duration'>0.47473s</span></dd> + </dl> +</div> +<div id="div_group_5" class="example_group passed"> + <dl style="margin-left: 15px;"> + <dt id="example_group_5" class="passed">The ontology documents are isomorphic to each other</dt> + <script type="text/javascript">makeRed('rspec-header');</script> + <script type="text/javascript">makeRed('div_group_5');</script> + <script type="text/javascript">makeRed('example_group_5');</script> + <script type="text/javascript">moveProgressBar('44.7');</script> + <dd class="example failed"> + <span class="failed_spec_name">rdfa</span> + <span class="duration">0.44157s</span> + <div class="failure" id="failure_1"> + <div class="message"><pre>Failure/Error: expect(fg).to be_equivalent_graph(vocab_graph) + + Graph entry counts differ: + expected: 385 + actual: 24 + + #<struct RDF::Spec::Matchers::Info id=nil, logger=nil, action=nil, result=nil> + Expected: + @prefix dc: <http://purl.org/dc/terms/> . + @prefix dc11: <http://purl.org/dc/elements/1.1/> . + @prefix oa: <http://www.w3.org/ns/oa#> . + @prefix owl: <http://www.w3.org/2002/07/owl#> . + @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . + @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + @prefix skos: <http://www.w3.org/2004/02/skos/core#> . + @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + + oa:Annotation a rdfs:Class; + rdfs:label "Annotation"; + rdfs:comment "The class for Web Annotations."; + rdfs:isDefinedBy oa: . + + oa:Choice a rdfs:Class; + rdfs:label "Choice"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should select one of the resources in the as:items list to use, rather than all of them. This is typically used to provide a choice of resources to render to the user, based on further supplied properties. If the consuming application cannot determine the user's preference, then it should use the first in the list."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:Composite a rdfs:Class; + rdfs:label "Composite"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should use all of the resources in the as:items list, but that order is not important. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:CssSelector a rdfs:Class; + rdfs:label "CssSelector"; + rdfs:comment "A CssSelector describes a Segment of interest in a representation that conforms to the Document Object Model through the use of the CSS selector specification."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:CssStyle a rdfs:Class; + rdfs:label "CssStyle"; + rdfs:comment "A resource which describes styles for resources participating in the Annotation using CSS."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Style . + + oa:DataPositionSelector a rdfs:Class; + rdfs:label "DataPositionSelector"; + rdfs:comment "DataPositionSelector describes a range of data by recording the start and end positions of the selection in the stream. Position 0 would be immediately before the first byte, position 1 would be immediately before the second byte, and so on. The start byte is thus included in the list, but the end byte is not."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:Direction a rdfs:Class; + rdfs:label "Direction"; + rdfs:comment "A class to encapsulate the different text directions that a textual resource might take. It is not used directly in the Annotation Model, only its three instances."; + rdfs:isDefinedBy oa: . + + oa:FragmentSelector a rdfs:Class; + rdfs:label "FragmentSelector"; + rdfs:comment "The FragmentSelector class is used to record the segment of a representation using the IRI fragment specification defined by the representation's media type."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:HttpRequestState a rdfs:Class; + rdfs:label "HttpRequestState"; + rdfs:comment "The HttpRequestState class is used to record the HTTP request headers that a client SHOULD use to request the correct representation from the resource."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:State . + + oa:Independents a rdfs:Class; + rdfs:label "Independents"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that each of the resources in the as:items list are independently associated with all of the other bodies or targets. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:List a rdfs:Class; + rdfs:label "List"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should use each of the resources in the as:items list, and that their order is important. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:Motivation a rdfs:Class; + rdfs:label "Motivation"; + rdfs:comment "The Motivation class is used to record the user's intent or motivation for the creation of the Annotation, or the inclusion of the body or target, that it is associated with."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf skos:Concept . + + oa:RangeSelector a rdfs:Class; + rdfs:label "RangeSelector"; + rdfs:comment "A Range Selector can be used to identify the beginning and the end of the selection by using other Selectors. The selection consists of everything from the beginning of the starting selector through to the beginning of the ending selector, but not including it."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:ResourceSelection a rdfs:Class; + rdfs:label "ResourceSelection"; + rdfs:comment "Instances of the ResourceSelection class identify part (described by an oa:Selector) of another resource (referenced with oa:hasSource), possibly from a particular representation of a resource (described by an oa:State). Please note that ResourceSelection is not used directly in the Web Annotation model, but is provided as a separate class for further application profiles to use, separate from oa:SpecificResource which has many Annotation specific features."; + rdfs:isDefinedBy oa: . + + oa:Selector a rdfs:Class; + rdfs:label "Selector"; + rdfs:comment "A resource which describes the segment of interest in a representation of a Source resource, indicated with oa:hasSelector from the Specific Resource. This class is not used directly in the Annotation model, only its subclasses."; + rdfs:isDefinedBy oa: . + + oa:SpecificResource a rdfs:Class; + rdfs:label "SpecificResource"; + rdfs:comment "Instances of the SpecificResource class identify part of another resource (referenced with oa:hasSource), a particular representation of a resource, a resource with styling hints for renders, or any combination of these, as used within an Annotation."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:ResourceSelection . + + oa:State a rdfs:Class; + rdfs:label "State"; + rdfs:comment "A State describes the intended state of a resource as applied to the particular Annotation, and thus provides the information needed to retrieve the correct representation of that resource."; + rdfs:isDefinedBy oa: . + + oa:Style a rdfs:Class; + rdfs:label "Style"; + rdfs:comment "A Style describes the intended styling of a resource as applied to the particular Annotation, and thus provides the information to ensure that rendering is consistent across implementations."; + rdfs:isDefinedBy oa: . + + oa:SvgSelector a rdfs:Class; + rdfs:label "SvgSelector"; + rdfs:comment "An SvgSelector defines an area through the use of the Scalable Vector Graphics [SVG] standard. This allows the user to select a non-rectangular area of the content, such as a circle or polygon by describing the region using SVG. The SVG may be either embedded within the Annotation or referenced as an External Resource."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextPositionSelector a rdfs:Class; + rdfs:label "TextPositionSelector"; + rdfs:comment "The TextPositionSelector describes a range of text by recording the start and end positions of the selection in the stream. Position 0 would be immediately before the first character, position 1 would be immediately before the second character, and so on."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextQuoteSelector a rdfs:Class; + rdfs:label "TextQuoteSelector"; + rdfs:comment "The TextQuoteSelector describes a range of text by copying it, and including some of the text immediately before (a prefix) and after (a suffix) it to distinguish between multiple copies of the same sequence of characters."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextualBody a rdfs:Class; + rdfs:label "TextualBody"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:TimeState a rdfs:Class; + rdfs:label "TimeState"; + rdfs:comment "A TimeState records the time at which the resource's state is appropriate for the Annotation, typically the time that the Annotation was created and/or a link to a persistent copy of the current version."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:State . + + oa:XPathSelector a rdfs:Class; + rdfs:label "XPathSelector"; + rdfs:comment "An XPathSelector is used to select elements and content within a resource that supports the Document Object Model via a specified XPath value."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:as:Application a rdfs:Class; + rdfs:label "as:Application"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:OrderedCollection a rdfs:Class; + rdfs:label "as:OrderedCollection"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:OrderedCollectionPage a rdfs:Class; + rdfs:label "as:OrderedCollectionPage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Dataset a rdfs:Class; + rdfs:label "dctypes:Dataset"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:MovingImage a rdfs:Class; + rdfs:label "dctypes:MovingImage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Sound a rdfs:Class; + rdfs:label "dctypes:Sound"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:StillImage a rdfs:Class; + rdfs:label "dctypes:StillImage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Text a rdfs:Class; + rdfs:label "dctypes:Text"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:foaf:Organization a rdfs:Class; + rdfs:label "foaf:Organization"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:foaf:Person a rdfs:Class; + rdfs:label "foaf:Person"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:schema:Audience a rdfs:Class; + rdfs:label "schema:Audience"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:PreferContainedDescriptions a rdfs:Resource; + rdfs:label "PreferContainedDescriptions"; + rdfs:comment "An IRI to signal the client prefers to receive full descriptions of the Annotations from a container, not just their IRIs."; + rdfs:isDefinedBy oa: . + + oa:PreferContainedIRIs a rdfs:Resource; + rdfs:label "PreferContainedIRIs"; + rdfs:comment "An IRI to signal that the client prefers to receive only the IRIs of the Annotations from a container, not their full descriptions."; + rdfs:isDefinedBy oa: . + + oa:annotationService a rdf:Property; + rdfs:label "annotationService"; + rdfs:comment "The object of the relationship is the end point of a service that conforms to the annotation-protocol, and it may be associated with any resource. The expectation of asserting the relationship is that the object is the preferred service for maintaining annotations about the subject resource, according to the publisher of the relationship. This relationship is intended to be used both within Linked Data descriptions and as the rel type of a Link, via HTTP Link Headers rfc5988 for binary resources and in HTML <link> elements. For more information about these, please see the Annotation Protocol specification annotation-protocol."; + rdfs:isDefinedBy oa: . + + oa:as:first a rdf:Property; + rdfs:label "as:first"; + rdfs:comment ""; + rdfs:domain oa:as:OrderedCollection; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:generator a rdf:Property; + rdfs:label "as:generator"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:items a rdf:Property; + rdfs:label "as:items"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range rdf:List . + + oa:as:last a rdf:Property; + rdfs:label "as:last"; + rdfs:comment ""; + rdfs:domain oa:as:OrderedCollection; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:next a rdf:Property; + rdfs:label "as:next"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:partOf a rdf:Property; + rdfs:label "as:partOf"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollection> . + + oa:as:prev a rdf:Property; + rdfs:label "as:prev"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:startIndex a rdf:Property; + rdfs:label "as:startIndex"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:as:totalItems a rdf:Property; + rdfs:label "as:totalItems"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollection>; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:assessing a oa:Motivation; + rdfs:label "assessing"; + rdfs:comment "The motivation for when the user intends to provide an assessment about the Target resource."; + rdfs:isDefinedBy oa: . + + oa:bodyValue a rdf:Property; + rdfs:label "bodyValue"; + rdfs:comment "The object of the predicate is a plain text string to be used as the content of the body of the Annotation. The value MUST be an xsd:string and that data type MUST NOT be expressed in the serialization. Note that language MUST NOT be associated with the value either as a language tag, as that is only available for rdf:langString ."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:bookmarking a oa:Motivation; + rdfs:label "bookmarking"; + rdfs:comment "The motivation for when the user intends to create a bookmark to the Target or part thereof."; + rdfs:isDefinedBy oa: . + + oa:cachedSource a rdf:Property; + rdfs:label "cachedSource"; + rdfs:comment "A object of the relationship is a copy of the Source resource's representation, appropriate for the Annotation."; + rdfs:domain oa:TimeState; + rdfs:isDefinedBy oa: . + + oa:canonical a rdf:Property; + rdfs:label "canonical"; + rdfs:comment "A object of the relationship is the canonical IRI that can always be used to deduplicate the Annotation, regardless of the current IRI used to access the representation."; + rdfs:isDefinedBy oa: . + + oa:classifying a oa:Motivation; + rdfs:label "classifying"; + rdfs:comment "The motivation for when the user intends to that classify the Target as something."; + rdfs:isDefinedBy oa: . + + oa:commenting a oa:Motivation; + rdfs:label "commenting"; + rdfs:comment "The motivation for when the user intends to comment about the Target."; + rdfs:isDefinedBy oa: . + + oa:describing a oa:Motivation; + rdfs:label "describing"; + rdfs:comment "The motivation for when the user intends to describe the Target, as opposed to a comment about them."; + rdfs:isDefinedBy oa: . + + oa:editing a oa:Motivation; + rdfs:label "editing"; + rdfs:comment "The motivation for when the user intends to request a change or edit to the Target resource."; + rdfs:isDefinedBy oa: . + + oa:end a rdf:Property; + rdfs:label "end"; + rdfs:comment "The end property is used to convey the 0-based index of the end position of a range of content."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:exact a rdf:Property; + rdfs:label "exact"; + rdfs:comment "The object of the predicate is a copy of the text which is being selected, after normalization."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:hasBody a rdf:Property; + rdfs:label "hasBody"; + rdfs:comment "The object of the relationship is a resource that is a body of the Annotation."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa: . + + oa:hasEndSelector a rdf:Property; + rdfs:label "hasEndSelector"; + rdfs:comment "The relationship between a RangeSelector and the Selector that describes the end position of the range."; + rdfs:domain oa:RangeSelector; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasPurpose a rdf:Property; + rdfs:label "hasPurpose"; + rdfs:comment "The purpose served by the resource in the Annotation."; + rdfs:isDefinedBy oa:; + rdfs:range oa:Motivation . + + oa:hasScope a rdf:Property; + rdfs:label "hasScope"; + rdfs:comment "The scope or context in which the resource is used within the Annotation."; + rdfs:domain oa:SpecificResource; + rdfs:isDefinedBy oa: . + + oa:hasSelector a rdf:Property; + rdfs:label "hasSelector"; + rdfs:comment "The object of the relationship is a Selector that describes the segment or region of interest within the source resource. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasSource a rdf:Property; + rdfs:label "hasSource"; + rdfs:comment "The resource that the ResourceSelection, or its subclass SpecificResource, is refined from, or more specific than. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa: . + + oa:hasStartSelector a rdf:Property; + rdfs:label "hasStartSelector"; + rdfs:comment "The relationship between a RangeSelector and the Selector that describes the start position of the range."; + rdfs:domain oa:RangeSelector; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasState a rdf:Property; + rdfs:label "hasState"; + rdfs:comment "The relationship between the ResourceSelection, or its subclass SpecificResource, and a State resource. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa:; + rdfs:range oa:State . + + oa:hasTarget a rdf:Property; + rdfs:label "hasTarget"; + rdfs:comment "The relationship between an Annotation and its Target."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa: . + + oa:highlighting a oa:Motivation; + rdfs:label "highlighting"; + rdfs:comment "The motivation for when the user intends to highlight the Target resource or segment of it."; + rdfs:isDefinedBy oa: . + + oa:identifying a oa:Motivation; + rdfs:label "identifying"; + rdfs:comment "The motivation for when the user intends to assign an identity to the Target or identify what is being depicted or described in the Target."; + rdfs:isDefinedBy oa: . + + oa:linking a oa:Motivation; + rdfs:label "linking"; + rdfs:comment "The motivation for when the user intends to link to a resource related to the Target."; + rdfs:isDefinedBy oa: . + + oa:ltrDirection a oa:Direction; + rdfs:label "ltrDirection"; + rdfs:comment "The direction of text that is read from left to right."; + rdfs:isDefinedBy oa: . + + oa:moderating a oa:Motivation; + rdfs:label "moderating"; + rdfs:comment "The motivation for when the user intends to assign some value or quality to the Target."; + rdfs:isDefinedBy oa: . + + oa:motivatedBy a rdf:Property; + rdfs:label "motivatedBy"; + rdfs:comment "The relationship between an Annotation and a Motivation that describes the reason for the Annotation's creation."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa:; + rdfs:range oa:Motivation . + + oa:prefix a rdf:Property; + rdfs:label "prefix"; + rdfs:comment "The object of the property is a snippet of content that occurs immediately before the content which is being selected by the Selector."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:processingLanguage a rdf:Property; + rdfs:label "processingLanguage"; + rdfs:comment "The object of the property is the language that should be used for textual processing algorithms when dealing with the content of the resource, including hyphenation, line breaking, which font to use for rendering and so forth. The value must follow the recommendations of BCP47."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:questioning a oa:Motivation; + rdfs:label "questioning"; + rdfs:comment "The motivation for when the user intends to ask a question about the Target."; + rdfs:isDefinedBy oa: . + + oa:refinedBy a rdf:Property; + rdfs:label "refinedBy"; + rdfs:comment "The relationship between a Selector and another Selector or a State and a Selector or State that should be applied to the results of the first to refine the processing of the source resource."; + rdfs:isDefinedBy oa: . + + oa:replying a oa:Motivation; + rdfs:label "replying"; + rdfs:comment "The motivation for when the user intends to reply to a previous statement, either an Annotation or another resource."; + rdfs:isDefinedBy oa: . + + oa:rtlDirection a oa:Direction; + rdfs:label "rtlDirection"; + rdfs:comment "The direction of text that is read from right to left."; + rdfs:isDefinedBy oa: . + + oa:tagging a oa:Motivation; + rdfs:label "tagging"; + rdfs:comment "The motivation for when the user intends to associate a tag with the Target."; + rdfs:isDefinedBy oa: . + + oa: a owl:Ontology; + dc11:title "Web Annotation Ontology"; + dc:creator "Robert Sanderson", + "Paolo Ciccarese", + "Benjamin Young"; + dc:modified "2016-09-30T16:51:18Z"; + rdfs:comment "The Web Annotation ontology defines the terms of the Web Annotation vocabulary. Any changes to this document MUST be from a Working Group in the W3C that has established expertise in the area."; + rdfs:seeAlso <http://www.w3.org/TR/annotation-vocab/>; + owl:previousVersionURI <http://www.openannotation.org/spec/core/20130208/oa.owl>; + owl:versionInfo "2016-09-30T16:51:18Z" . + Results: + @prefix dc: <http://purl.org/dc/terms/> . + @prefix foaf: <http://xmlns.com/foaf/0.1/> . + @prefix oa: <http://www.w3.org/ns/oa#> . + @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . + @prefix xhv: <http://www.w3.org/1999/xhtml/vocab#> . + @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + + <http://www.w3.org/ns/oa> dc:title "Web Annotation Ontology"; + <bibo:editor> []; + xhv:license <http://www.w3.org/Consortium/Legal/copyright-documents> . + + oa:respecDocument xhv:role xhv:document . + + oa:respecHeader xhv:role xhv:contentinfo . + + ([ + a foaf:Person; + foaf:homepage <http://www.paolociccarese.info>; + foaf:mbox <mailto:paolo.ciccarese@gmail.com>; + foaf:name "Paolo Ciccarese" + ] [ + a foaf:Person; + foaf:homepage <http://bigbluehat.com/>; + foaf:mbox <mailto:byoung@bigbluehat.com>; + foaf:name "Benjamin Young" + ]) . + + _:g70220666792480 a foaf:Person; + foaf:homepage <http://www.stanford.edu/~azaroth/>; + foaf:mbox <mailto:azaroth42@gmail.com>; + foaf:name "Robert Sanderson"; + foaf:workplaceHomepage <http://www.stanford.edu/> . + + Debug:</pre></div> + <div class="backtrace"><pre>./annotation-vocab_spec.rb:83:in `block (4 levels) in <top (required)>'</pre></div> + <pre class="ruby"><code><span class="linenum">81</span> # XXX Normalize whitespace in literals to ease comparision +<span class="linenum">82</span> fg.each_object {|o| o.squish! if o.literal?} +<span class="offending"><span class="linenum">83</span> expect(fg).to be_equivalent_graph(vocab_graph)</span> +<span class="linenum">84</span> end +<span class="linenum">85</span> end +<span class="linenum">86</span><span class="comment"># Install the coderay gem to get syntax highlighting</span></code></pre> + </div> + </dd> + <script type="text/javascript">moveProgressBar('45.0');</script> + <dd class="example failed"> + <span class="failed_spec_name">rdfxml</span> + <span class="duration">0.80222s</span> + <div class="failure" id="failure_2"> + <div class="message"><pre>Failure/Error: expect(fg).to be_equivalent_graph(vocab_graph) + + Graphs differ + + #<struct RDF::Spec::Matchers::Info id=nil, logger=nil, action=nil, result=nil> + Expected: + @prefix dc: <http://purl.org/dc/terms/> . + @prefix dc11: <http://purl.org/dc/elements/1.1/> . + @prefix oa: <http://www.w3.org/ns/oa#> . + @prefix owl: <http://www.w3.org/2002/07/owl#> . + @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . + @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + @prefix skos: <http://www.w3.org/2004/02/skos/core#> . + @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + + oa:Annotation a rdfs:Class; + rdfs:label "Annotation"; + rdfs:comment "The class for Web Annotations."; + rdfs:isDefinedBy oa: . + + oa:Choice a rdfs:Class; + rdfs:label "Choice"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should select one of the resources in the as:items list to use, rather than all of them. This is typically used to provide a choice of resources to render to the user, based on further supplied properties. If the consuming application cannot determine the user's preference, then it should use the first in the list."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:Composite a rdfs:Class; + rdfs:label "Composite"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should use all of the resources in the as:items list, but that order is not important. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:CssSelector a rdfs:Class; + rdfs:label "CssSelector"; + rdfs:comment "A CssSelector describes a Segment of interest in a representation that conforms to the Document Object Model through the use of the CSS selector specification."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:CssStyle a rdfs:Class; + rdfs:label "CssStyle"; + rdfs:comment "A resource which describes styles for resources participating in the Annotation using CSS."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Style . + + oa:DataPositionSelector a rdfs:Class; + rdfs:label "DataPositionSelector"; + rdfs:comment "DataPositionSelector describes a range of data by recording the start and end positions of the selection in the stream. Position 0 would be immediately before the first byte, position 1 would be immediately before the second byte, and so on. The start byte is thus included in the list, but the end byte is not."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:Direction a rdfs:Class; + rdfs:label "Direction"; + rdfs:comment "A class to encapsulate the different text directions that a textual resource might take. It is not used directly in the Annotation Model, only its three instances."; + rdfs:isDefinedBy oa: . + + oa:FragmentSelector a rdfs:Class; + rdfs:label "FragmentSelector"; + rdfs:comment "The FragmentSelector class is used to record the segment of a representation using the IRI fragment specification defined by the representation's media type."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:HttpRequestState a rdfs:Class; + rdfs:label "HttpRequestState"; + rdfs:comment "The HttpRequestState class is used to record the HTTP request headers that a client SHOULD use to request the correct representation from the resource."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:State . + + oa:Independents a rdfs:Class; + rdfs:label "Independents"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that each of the resources in the as:items list are independently associated with all of the other bodies or targets. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:List a rdfs:Class; + rdfs:label "List"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should use each of the resources in the as:items list, and that their order is important. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:Motivation a rdfs:Class; + rdfs:label "Motivation"; + rdfs:comment "The Motivation class is used to record the user's intent or motivation for the creation of the Annotation, or the inclusion of the body or target, that it is associated with."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf skos:Concept . + + oa:RangeSelector a rdfs:Class; + rdfs:label "RangeSelector"; + rdfs:comment "A Range Selector can be used to identify the beginning and the end of the selection by using other Selectors. The selection consists of everything from the beginning of the starting selector through to the beginning of the ending selector, but not including it."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:ResourceSelection a rdfs:Class; + rdfs:label "ResourceSelection"; + rdfs:comment "Instances of the ResourceSelection class identify part (described by an oa:Selector) of another resource (referenced with oa:hasSource), possibly from a particular representation of a resource (described by an oa:State). Please note that ResourceSelection is not used directly in the Web Annotation model, but is provided as a separate class for further application profiles to use, separate from oa:SpecificResource which has many Annotation specific features."; + rdfs:isDefinedBy oa: . + + oa:Selector a rdfs:Class; + rdfs:label "Selector"; + rdfs:comment "A resource which describes the segment of interest in a representation of a Source resource, indicated with oa:hasSelector from the Specific Resource. This class is not used directly in the Annotation model, only its subclasses."; + rdfs:isDefinedBy oa: . + + oa:SpecificResource a rdfs:Class; + rdfs:label "SpecificResource"; + rdfs:comment "Instances of the SpecificResource class identify part of another resource (referenced with oa:hasSource), a particular representation of a resource, a resource with styling hints for renders, or any combination of these, as used within an Annotation."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:ResourceSelection . + + oa:State a rdfs:Class; + rdfs:label "State"; + rdfs:comment "A State describes the intended state of a resource as applied to the particular Annotation, and thus provides the information needed to retrieve the correct representation of that resource."; + rdfs:isDefinedBy oa: . + + oa:Style a rdfs:Class; + rdfs:label "Style"; + rdfs:comment "A Style describes the intended styling of a resource as applied to the particular Annotation, and thus provides the information to ensure that rendering is consistent across implementations."; + rdfs:isDefinedBy oa: . + + oa:SvgSelector a rdfs:Class; + rdfs:label "SvgSelector"; + rdfs:comment "An SvgSelector defines an area through the use of the Scalable Vector Graphics [SVG] standard. This allows the user to select a non-rectangular area of the content, such as a circle or polygon by describing the region using SVG. The SVG may be either embedded within the Annotation or referenced as an External Resource."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextPositionSelector a rdfs:Class; + rdfs:label "TextPositionSelector"; + rdfs:comment "The TextPositionSelector describes a range of text by recording the start and end positions of the selection in the stream. Position 0 would be immediately before the first character, position 1 would be immediately before the second character, and so on."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextQuoteSelector a rdfs:Class; + rdfs:label "TextQuoteSelector"; + rdfs:comment "The TextQuoteSelector describes a range of text by copying it, and including some of the text immediately before (a prefix) and after (a suffix) it to distinguish between multiple copies of the same sequence of characters."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextualBody a rdfs:Class; + rdfs:label "TextualBody"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:TimeState a rdfs:Class; + rdfs:label "TimeState"; + rdfs:comment "A TimeState records the time at which the resource's state is appropriate for the Annotation, typically the time that the Annotation was created and/or a link to a persistent copy of the current version."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:State . + + oa:XPathSelector a rdfs:Class; + rdfs:label "XPathSelector"; + rdfs:comment "An XPathSelector is used to select elements and content within a resource that supports the Document Object Model via a specified XPath value."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:as:Application a rdfs:Class; + rdfs:label "as:Application"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:OrderedCollection a rdfs:Class; + rdfs:label "as:OrderedCollection"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:OrderedCollectionPage a rdfs:Class; + rdfs:label "as:OrderedCollectionPage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Dataset a rdfs:Class; + rdfs:label "dctypes:Dataset"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:MovingImage a rdfs:Class; + rdfs:label "dctypes:MovingImage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Sound a rdfs:Class; + rdfs:label "dctypes:Sound"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:StillImage a rdfs:Class; + rdfs:label "dctypes:StillImage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Text a rdfs:Class; + rdfs:label "dctypes:Text"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:foaf:Organization a rdfs:Class; + rdfs:label "foaf:Organization"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:foaf:Person a rdfs:Class; + rdfs:label "foaf:Person"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:schema:Audience a rdfs:Class; + rdfs:label "schema:Audience"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:PreferContainedDescriptions a rdfs:Resource; + rdfs:label "PreferContainedDescriptions"; + rdfs:comment "An IRI to signal the client prefers to receive full descriptions of the Annotations from a container, not just their IRIs."; + rdfs:isDefinedBy oa: . + + oa:PreferContainedIRIs a rdfs:Resource; + rdfs:label "PreferContainedIRIs"; + rdfs:comment "An IRI to signal that the client prefers to receive only the IRIs of the Annotations from a container, not their full descriptions."; + rdfs:isDefinedBy oa: . + + oa:annotationService a rdf:Property; + rdfs:label "annotationService"; + rdfs:comment "The object of the relationship is the end point of a service that conforms to the annotation-protocol, and it may be associated with any resource. The expectation of asserting the relationship is that the object is the preferred service for maintaining annotations about the subject resource, according to the publisher of the relationship. This relationship is intended to be used both within Linked Data descriptions and as the rel type of a Link, via HTTP Link Headers rfc5988 for binary resources and in HTML <link> elements. For more information about these, please see the Annotation Protocol specification annotation-protocol."; + rdfs:isDefinedBy oa: . + + oa:as:first a rdf:Property; + rdfs:label "as:first"; + rdfs:comment ""; + rdfs:domain oa:as:OrderedCollection; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:generator a rdf:Property; + rdfs:label "as:generator"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:items a rdf:Property; + rdfs:label "as:items"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range rdf:List . + + oa:as:last a rdf:Property; + rdfs:label "as:last"; + rdfs:comment ""; + rdfs:domain oa:as:OrderedCollection; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:next a rdf:Property; + rdfs:label "as:next"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:partOf a rdf:Property; + rdfs:label "as:partOf"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollection> . + + oa:as:prev a rdf:Property; + rdfs:label "as:prev"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:startIndex a rdf:Property; + rdfs:label "as:startIndex"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:as:totalItems a rdf:Property; + rdfs:label "as:totalItems"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollection>; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:assessing a oa:Motivation; + rdfs:label "assessing"; + rdfs:comment "The motivation for when the user intends to provide an assessment about the Target resource."; + rdfs:isDefinedBy oa: . + + oa:bodyValue a rdf:Property; + rdfs:label "bodyValue"; + rdfs:comment "The object of the predicate is a plain text string to be used as the content of the body of the Annotation. The value MUST be an xsd:string and that data type MUST NOT be expressed in the serialization. Note that language MUST NOT be associated with the value either as a language tag, as that is only available for rdf:langString ."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:bookmarking a oa:Motivation; + rdfs:label "bookmarking"; + rdfs:comment "The motivation for when the user intends to create a bookmark to the Target or part thereof."; + rdfs:isDefinedBy oa: . + + oa:cachedSource a rdf:Property; + rdfs:label "cachedSource"; + rdfs:comment "A object of the relationship is a copy of the Source resource's representation, appropriate for the Annotation."; + rdfs:domain oa:TimeState; + rdfs:isDefinedBy oa: . + + oa:canonical a rdf:Property; + rdfs:label "canonical"; + rdfs:comment "A object of the relationship is the canonical IRI that can always be used to deduplicate the Annotation, regardless of the current IRI used to access the representation."; + rdfs:isDefinedBy oa: . + + oa:classifying a oa:Motivation; + rdfs:label "classifying"; + rdfs:comment "The motivation for when the user intends to that classify the Target as something."; + rdfs:isDefinedBy oa: . + + oa:commenting a oa:Motivation; + rdfs:label "commenting"; + rdfs:comment "The motivation for when the user intends to comment about the Target."; + rdfs:isDefinedBy oa: . + + oa:describing a oa:Motivation; + rdfs:label "describing"; + rdfs:comment "The motivation for when the user intends to describe the Target, as opposed to a comment about them."; + rdfs:isDefinedBy oa: . + + oa:editing a oa:Motivation; + rdfs:label "editing"; + rdfs:comment "The motivation for when the user intends to request a change or edit to the Target resource."; + rdfs:isDefinedBy oa: . + + oa:end a rdf:Property; + rdfs:label "end"; + rdfs:comment "The end property is used to convey the 0-based index of the end position of a range of content."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:exact a rdf:Property; + rdfs:label "exact"; + rdfs:comment "The object of the predicate is a copy of the text which is being selected, after normalization."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:hasBody a rdf:Property; + rdfs:label "hasBody"; + rdfs:comment "The object of the relationship is a resource that is a body of the Annotation."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa: . + + oa:hasEndSelector a rdf:Property; + rdfs:label "hasEndSelector"; + rdfs:comment "The relationship between a RangeSelector and the Selector that describes the end position of the range."; + rdfs:domain oa:RangeSelector; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasPurpose a rdf:Property; + rdfs:label "hasPurpose"; + rdfs:comment "The purpose served by the resource in the Annotation."; + rdfs:isDefinedBy oa:; + rdfs:range oa:Motivation . + + oa:hasScope a rdf:Property; + rdfs:label "hasScope"; + rdfs:comment "The scope or context in which the resource is used within the Annotation."; + rdfs:domain oa:SpecificResource; + rdfs:isDefinedBy oa: . + + oa:hasSelector a rdf:Property; + rdfs:label "hasSelector"; + rdfs:comment "The object of the relationship is a Selector that describes the segment or region of interest within the source resource. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasSource a rdf:Property; + rdfs:label "hasSource"; + rdfs:comment "The resource that the ResourceSelection, or its subclass SpecificResource, is refined from, or more specific than. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa: . + + oa:hasStartSelector a rdf:Property; + rdfs:label "hasStartSelector"; + rdfs:comment "The relationship between a RangeSelector and the Selector that describes the start position of the range."; + rdfs:domain oa:RangeSelector; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasState a rdf:Property; + rdfs:label "hasState"; + rdfs:comment "The relationship between the ResourceSelection, or its subclass SpecificResource, and a State resource. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa:; + rdfs:range oa:State . + + oa:hasTarget a rdf:Property; + rdfs:label "hasTarget"; + rdfs:comment "The relationship between an Annotation and its Target."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa: . + + oa:highlighting a oa:Motivation; + rdfs:label "highlighting"; + rdfs:comment "The motivation for when the user intends to highlight the Target resource or segment of it."; + rdfs:isDefinedBy oa: . + + oa:identifying a oa:Motivation; + rdfs:label "identifying"; + rdfs:comment "The motivation for when the user intends to assign an identity to the Target or identify what is being depicted or described in the Target."; + rdfs:isDefinedBy oa: . + + oa:linking a oa:Motivation; + rdfs:label "linking"; + rdfs:comment "The motivation for when the user intends to link to a resource related to the Target."; + rdfs:isDefinedBy oa: . + + oa:ltrDirection a oa:Direction; + rdfs:label "ltrDirection"; + rdfs:comment "The direction of text that is read from left to right."; + rdfs:isDefinedBy oa: . + + oa:moderating a oa:Motivation; + rdfs:label "moderating"; + rdfs:comment "The motivation for when the user intends to assign some value or quality to the Target."; + rdfs:isDefinedBy oa: . + + oa:motivatedBy a rdf:Property; + rdfs:label "motivatedBy"; + rdfs:comment "The relationship between an Annotation and a Motivation that describes the reason for the Annotation's creation."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa:; + rdfs:range oa:Motivation . + + oa:prefix a rdf:Property; + rdfs:label "prefix"; + rdfs:comment "The object of the property is a snippet of content that occurs immediately before the content which is being selected by the Selector."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:processingLanguage a rdf:Property; + rdfs:label "processingLanguage"; + rdfs:comment "The object of the property is the language that should be used for textual processing algorithms when dealing with the content of the resource, including hyphenation, line breaking, which font to use for rendering and so forth. The value must follow the recommendations of BCP47."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:questioning a oa:Motivation; + rdfs:label "questioning"; + rdfs:comment "The motivation for when the user intends to ask a question about the Target."; + rdfs:isDefinedBy oa: . + + oa:refinedBy a rdf:Property; + rdfs:label "refinedBy"; + rdfs:comment "The relationship between a Selector and another Selector or a State and a Selector or State that should be applied to the results of the first to refine the processing of the source resource."; + rdfs:isDefinedBy oa: . + + oa:replying a oa:Motivation; + rdfs:label "replying"; + rdfs:comment "The motivation for when the user intends to reply to a previous statement, either an Annotation or another resource."; + rdfs:isDefinedBy oa: . + + oa:rtlDirection a oa:Direction; + rdfs:label "rtlDirection"; + rdfs:comment "The direction of text that is read from right to left."; + rdfs:isDefinedBy oa: . + + oa:tagging a oa:Motivation; + rdfs:label "tagging"; + rdfs:comment "The motivation for when the user intends to associate a tag with the Target."; + rdfs:isDefinedBy oa: . + + oa: a owl:Ontology; + dc11:title "Web Annotation Ontology"; + dc:creator "Robert Sanderson", + "Paolo Ciccarese", + "Benjamin Young"; + dc:modified "2016-09-30T16:51:18Z"; + rdfs:comment "The Web Annotation ontology defines the terms of the Web Annotation vocabulary. Any changes to this document MUST be from a Working Group in the W3C that has established expertise in the area."; + rdfs:seeAlso <http://www.w3.org/TR/annotation-vocab/>; + owl:previousVersionURI <http://www.openannotation.org/spec/core/20130208/oa.owl>; + owl:versionInfo "2016-09-30T16:51:18Z" . + Results: + @prefix dc: <http://purl.org/dc/terms/> . + @prefix dc11: <http://purl.org/dc/elements/1.1/> . + @prefix oa: <http://www.w3.org/ns/oa#> . + @prefix owl: <http://www.w3.org/2002/07/owl#> . + @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . + @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + @prefix skos: <http://www.w3.org/2004/02/skos/core#> . + @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + + oa:Annotation a rdfs:Class; + rdfs:label "Annotation"; + rdfs:comment "The class for Web Annotations."; + rdfs:isDefinedBy oa: . + + oa:Choice a rdfs:Class; + rdfs:label "Choice"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should select one of the resources in the as:items list to use, rather than all of them. This is typically used to provide a choice of resources to render to the user, based on further supplied properties. If the consuming application cannot determine the user's preference, then it should use the first in the list."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:Composite a rdfs:Class; + rdfs:label "Composite"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should use all of the resources in the as:items list, but that order is not important. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:CssSelector a rdfs:Class; + rdfs:label "CssSelector"; + rdfs:comment "A CssSelector describes a Segment of interest in a representation that conforms to the Document Object Model through the use of the CSS selector specification."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:CssStyle a rdfs:Class; + rdfs:label "CssStyle"; + rdfs:comment "A resource which describes styles for resources participating in the Annotation using CSS."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Style . + + oa:DataPositionSelector a rdfs:Class; + rdfs:label "DataPositionSelector"; + rdfs:comment "DataPositionSelector describes a range of data by recording the start and end positions of the selection in the stream. Position 0 would be immediately before the first byte, position 1 would be immediately before the second byte, and so on. The start byte is thus included in the list, but the end byte is not."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:Direction a rdfs:Class; + rdfs:label "Direction"; + rdfs:comment "A class to encapsulate the different text directions that a textual resource might take. It is not used directly in the Annotation Model, only its three instances."; + rdfs:isDefinedBy oa: . + + oa:FragmentSelector a rdfs:Class; + rdfs:label "FragmentSelector"; + rdfs:comment "The FragmentSelector class is used to record the segment of a representation using the IRI fragment specification defined by the representation's media type."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:HttpRequestState a rdfs:Class; + rdfs:label "HttpRequestState"; + rdfs:comment "The HttpRequestState class is used to record the HTTP request headers that a client SHOULD use to request the correct representation from the resource."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:State . + + oa:Independents a rdfs:Class; + rdfs:label "Independents"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that each of the resources in the as:items list are independently associated with all of the other bodies or targets. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:List a rdfs:Class; + rdfs:label "List"; + rdfs:comment "A subClass of as:OrderedCollection that conveys to a consuming application that it should use each of the resources in the as:items list, and that their order is important. This class is at-risk."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:as:OrderedCollection . + + oa:Motivation a rdfs:Class; + rdfs:label "Motivation"; + rdfs:comment "The Motivation class is used to record the user's intent or motivation for the creation of the Annotation, or the inclusion of the body or target, that it is associated with."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf skos:Concept . + + oa:RangeSelector a rdfs:Class; + rdfs:label "RangeSelector"; + rdfs:comment "A Range Selector can be used to identify the beginning and the end of the selection by using other Selectors. The selection consists of everything from the beginning of the starting selector through to the beginning of the ending selector, but not including it."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:ResourceSelection a rdfs:Class; + rdfs:label "ResourceSelection"; + rdfs:comment "Instances of the ResourceSelection class identify part (described by an oa:Selector) of another resource (referenced with oa:hasSource), possibly from a particular representation of a resource (described by an oa:State). Please note that ResourceSelection is not used directly in the Web Annotation model, but is provided as a separate class for further application profiles to use, separate from oa:SpecificResource which has many Annotation specific features."; + rdfs:isDefinedBy oa: . + + oa:Selector a rdfs:Class; + rdfs:label "Selector"; + rdfs:comment "A resource which describes the segment of interest in a representation of a Source resource, indicated with oa:hasSelector from the Specific Resource. This class is not used directly in the Annotation model, only its subclasses."; + rdfs:isDefinedBy oa: . + + oa:SpecificResource a rdfs:Class; + rdfs:label "SpecificResource"; + rdfs:comment "Instances of the SpecificResource class identify part of another resource (referenced with oa:hasSource), a particular representation of a resource, a resource with styling hints for renders, or any combination of these, as used within an Annotation."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:ResourceSelection . + + oa:State a rdfs:Class; + rdfs:label "State"; + rdfs:comment "A State describes the intended state of a resource as applied to the particular Annotation, and thus provides the information needed to retrieve the correct representation of that resource."; + rdfs:isDefinedBy oa: . + + oa:Style a rdfs:Class; + rdfs:label "Style"; + rdfs:comment "A Style describes the intended styling of a resource as applied to the particular Annotation, and thus provides the information to ensure that rendering is consistent across implementations."; + rdfs:isDefinedBy oa: . + + oa:SvgSelector a rdfs:Class; + rdfs:label "SvgSelector"; + rdfs:comment "An SvgSelector defines an area through the use of the Scalable Vector Graphics [SVG] standard. This allows the user to select a non-rectangular area of the content, such as a circle or polygon by describing the region using SVG. The SVG may be either embedded within the Annotation or referenced as an External Resource."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextPositionSelector a rdfs:Class; + rdfs:label "TextPositionSelector"; + rdfs:comment "The TextPositionSelector describes a range of text by recording the start and end positions of the selection in the stream. Position 0 would be immediately before the first character, position 1 would be immediately before the second character, and so on."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextQuoteSelector a rdfs:Class; + rdfs:label "TextQuoteSelector"; + rdfs:comment "The TextQuoteSelector describes a range of text by copying it, and including some of the text immediately before (a prefix) and after (a suffix) it to distinguish between multiple copies of the same sequence of characters."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:TextualBody a rdfs:Class; + rdfs:label "TextualBody"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:TimeState a rdfs:Class; + rdfs:label "TimeState"; + rdfs:comment "A TimeState records the time at which the resource's state is appropriate for the Annotation, typically the time that the Annotation was created and/or a link to a persistent copy of the current version."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:State . + + oa:XPathSelector a rdfs:Class; + rdfs:label "XPathSelector"; + rdfs:comment "An XPathSelector is used to select elements and content within a resource that supports the Document Object Model via a specified XPath value."; + rdfs:isDefinedBy oa:; + rdfs:subClassOf oa:Selector . + + oa:as:Application a rdfs:Class; + rdfs:label "as:Application"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:OrderedCollection a rdfs:Class; + rdfs:label "as:OrderedCollection"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:OrderedCollectionPage a rdfs:Class; + rdfs:label "as:OrderedCollectionPage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Dataset a rdfs:Class; + rdfs:label "dctypes:Dataset"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:MovingImage a rdfs:Class; + rdfs:label "dctypes:MovingImage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Sound a rdfs:Class; + rdfs:label "dctypes:Sound"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:StillImage a rdfs:Class; + rdfs:label "dctypes:StillImage"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:dctypes:Text a rdfs:Class; + rdfs:label "dctypes:Text"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:foaf:Organization a rdfs:Class; + rdfs:label "foaf:Organization"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:foaf:Person a rdfs:Class; + rdfs:label "foaf:Person"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:schema:Audience a rdfs:Class; + rdfs:label "schema:Audience"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:PreferContainedDescriptions a rdfs:Resource; + rdfs:label "PreferContainedDescriptions"; + rdfs:comment "An IRI to signal the client prefers to receive full descriptions of the Annotations from a container, not just their IRIs."; + rdfs:isDefinedBy oa: . + + oa:PreferContainedIRIs a rdfs:Resource; + rdfs:label "PreferContainedIRIs"; + rdfs:comment "An IRI to signal that the client prefers to receive only the IRIs of the Annotations from a container, not their full descriptions."; + rdfs:isDefinedBy oa: . + + oa:annotationService a rdf:Property; + rdfs:label "annotationService"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:first a rdf:Property; + rdfs:label "as:first"; + rdfs:comment ""; + rdfs:domain oa:as:OrderedCollection; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:generator a rdf:Property; + rdfs:label "as:generator"; + rdfs:comment ""; + rdfs:isDefinedBy oa: . + + oa:as:items a rdf:Property; + rdfs:label "as:items"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range rdf:List . + + oa:as:last a rdf:Property; + rdfs:label "as:last"; + rdfs:comment ""; + rdfs:domain oa:as:OrderedCollection; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:next a rdf:Property; + rdfs:label "as:next"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:partOf a rdf:Property; + rdfs:label "as:partOf"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollection> . + + oa:as:prev a rdf:Property; + rdfs:label "as:prev"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . + + oa:as:startIndex a rdf:Property; + rdfs:label "as:startIndex"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollectionPage>; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:as:totalItems a rdf:Property; + rdfs:label "as:totalItems"; + rdfs:comment ""; + rdfs:domain <http://www.w3.org/ns/activitystreams#OrderedCollection>; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:assessing a oa:Motivation; + rdfs:label "assessing"; + rdfs:comment "The motivation for when the user intends to provide an assessment about the Target resource."; + rdfs:isDefinedBy oa: . + + oa:bodyValue a rdf:Property; + rdfs:label "bodyValue"; + rdfs:comment "The object of the predicate is a plain text string to be used as the content of the body of the Annotation. The value MUST be an xsd:string and that data type MUST NOT be expressed in the serialization. Note that language MUST NOT be associated with the value either as a language tag, as that is only available for rdf:langString ."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:bookmarking a oa:Motivation; + rdfs:label "bookmarking"; + rdfs:comment "The motivation for when the user intends to create a bookmark to the Target or part thereof."; + rdfs:isDefinedBy oa: . + + oa:cachedSource a rdf:Property; + rdfs:label "cachedSource"; + rdfs:comment "A object of the relationship is a copy of the Source resource's representation, appropriate for the Annotation."; + rdfs:domain oa:TimeState; + rdfs:isDefinedBy oa: . + + oa:canonical a rdf:Property; + rdfs:label "canonical"; + rdfs:comment "A object of the relationship is the canonical IRI that can always be used to deduplicate the Annotation, regardless of the current IRI used to access the representation."; + rdfs:isDefinedBy oa: . + + oa:classifying a oa:Motivation; + rdfs:label "classifying"; + rdfs:comment "The motivation for when the user intends to that classify the Target as something."; + rdfs:isDefinedBy oa: . + + oa:commenting a oa:Motivation; + rdfs:label "commenting"; + rdfs:comment "The motivation for when the user intends to comment about the Target."; + rdfs:isDefinedBy oa: . + + oa:describing a oa:Motivation; + rdfs:label "describing"; + rdfs:comment "The motivation for when the user intends to describe the Target, as opposed to a comment about them."; + rdfs:isDefinedBy oa: . + + oa:editing a oa:Motivation; + rdfs:label "editing"; + rdfs:comment "The motivation for when the user intends to request a change or edit to the Target resource."; + rdfs:isDefinedBy oa: . + + oa:end a rdf:Property; + rdfs:label "end"; + rdfs:comment "The end property is used to convey the 0-based index of the end position of a range of content."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:nonNegativeInteger . + + oa:exact a rdf:Property; + rdfs:label "exact"; + rdfs:comment "The object of the predicate is a copy of the text which is being selected, after normalization."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:hasBody a rdf:Property; + rdfs:label "hasBody"; + rdfs:comment "The object of the relationship is a resource that is a body of the Annotation."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa: . + + oa:hasEndSelector a rdf:Property; + rdfs:label "hasEndSelector"; + rdfs:comment "The relationship between a RangeSelector and the Selector that describes the end position of the range."; + rdfs:domain oa:RangeSelector; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasPurpose a rdf:Property; + rdfs:label "hasPurpose"; + rdfs:comment "The purpose served by the resource in the Annotation."; + rdfs:isDefinedBy oa:; + rdfs:range oa:Motivation . + + oa:hasScope a rdf:Property; + rdfs:label "hasScope"; + rdfs:comment "The scope or context in which the resource is used within the Annotation."; + rdfs:domain oa:SpecificResource; + rdfs:isDefinedBy oa: . + + oa:hasSelector a rdf:Property; + rdfs:label "hasSelector"; + rdfs:comment "The object of the relationship is a Selector that describes the segment or region of interest within the source resource. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasSource a rdf:Property; + rdfs:label "hasSource"; + rdfs:comment "The resource that the ResourceSelection, or its subclass SpecificResource, is refined from, or more specific than. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa: . + + oa:hasStartSelector a rdf:Property; + rdfs:label "hasStartSelector"; + rdfs:comment "The relationship between a RangeSelector and the Selector that describes the start position of the range."; + rdfs:domain oa:RangeSelector; + rdfs:isDefinedBy oa:; + rdfs:range oa:Selector . + + oa:hasState a rdf:Property; + rdfs:label "hasState"; + rdfs:comment "The relationship between the ResourceSelection, or its subclass SpecificResource, and a State resource. Please note that the domain ( oa:ResourceSelection ) is not used directly in the Web Annotation model."; + rdfs:domain oa:ResourceSelection; + rdfs:isDefinedBy oa:; + rdfs:range oa:State . + + oa:hasTarget a rdf:Property; + rdfs:label "hasTarget"; + rdfs:comment "The relationship between an Annotation and its Target."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa: . + + oa:highlighting a oa:Motivation; + rdfs:label "highlighting"; + rdfs:comment "The motivation for when the user intends to highlight the Target resource or segment of it."; + rdfs:isDefinedBy oa: . + + oa:identifying a oa:Motivation; + rdfs:label "identifying"; + rdfs:comment "The motivation for when the user intends to assign an identity to the Target or identify what is being depicted or described in the Target."; + rdfs:isDefinedBy oa: . + + oa:linking a oa:Motivation; + rdfs:label "linking"; + rdfs:comment "The motivation for when the user intends to link to a resource related to the Target."; + rdfs:isDefinedBy oa: . + + oa:ltrDirection a oa:Direction; + rdfs:label "ltrDirection"; + rdfs:comment "The direction of text that is read from left to right."; + rdfs:isDefinedBy oa: . + + oa:moderating a oa:Motivation; + rdfs:label "moderating"; + rdfs:comment "The motivation for when the user intends to assign some value or quality to the Target."; + rdfs:isDefinedBy oa: . + + oa:motivatedBy a rdf:Property; + rdfs:label "motivatedBy"; + rdfs:comment "The relationship between an Annotation and a Motivation that describes the reason for the Annotation's creation."; + rdfs:domain oa:Annotation; + rdfs:isDefinedBy oa:; + rdfs:range oa:Motivation . + + oa:prefix a rdf:Property; + rdfs:label "prefix"; + rdfs:comment "The object of the property is a snippet of content that occurs immediately before the content which is being selected by the Selector."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:processingLanguage a rdf:Property; + rdfs:label "processingLanguage"; + rdfs:comment "The object of the property is the language that should be used for textual processing algorithms when dealing with the content of the resource, including hyphenation, line breaking, which font to use for rendering and so forth. The value must follow the recommendations of BCP47."; + rdfs:isDefinedBy oa:; + rdfs:range xsd:string . + + oa:questioning a oa:Motivation; + rdfs:label "questioning"; + rdfs:comment "The motivation for when the user intends to ask a question about the Target."; + rdfs:isDefinedBy oa: . + + oa:refinedBy a rdf:Property; + rdfs:label "refinedBy"; + rdfs:comment "The relationship between a Selector and another Selector or a State and a Selector or State that should be applied to the results of the first to refine the processing of the source resource."; + rdfs:isDefinedBy oa: . + + oa:replying a oa:Motivation; + rdfs:label "replying"; + rdfs:comment "The motivation for when the user intends to reply to a previous statement, either an Annotation or another resource."; + rdfs:isDefinedBy oa: . + + oa:rtlDirection a oa:Direction; + rdfs:label "rtlDirection"; + rdfs:comment "The direction of text that is read from right to left."; + rdfs:isDefinedBy oa: . + + oa:tagging a oa:Motivation; + rdfs:label "tagging"; + rdfs:comment "The motivation for when the user intends to associate a tag with the Target."; + rdfs:isDefinedBy oa: . + + oa: a owl:Ontology; + dc11:title "Web Annotation Ontology"; + dc:creator "Robert Sanderson", + "Paolo Ciccarese", + "Benjamin Young"; + dc:modified "2016-09-30T16:51:18Z"; + rdfs:comment "The Web Annotation ontology defines the terms of the Web Annotation vocabulary. Any changes to this document MUST be from a Working Group in the W3C that has established expertise in the area."; + rdfs:seeAlso <http://www.w3.org/TR/annotation-vocab/>; + owl:previousVersionURI <http://www.openannotation.org/spec/core/20130208/oa.owl>; + owl:versionInfo "2016-09-30T16:51:18Z" . + + Debug:</pre></div> + <div class="backtrace"><pre>./annotation-vocab_spec.rb:83:in `block (4 levels) in <top (required)>'</pre></div> + <pre class="ruby"><code><span class="linenum">81</span> # XXX Normalize whitespace in literals to ease comparision +<span class="linenum">82</span> fg.each_object {|o| o.squish! if o.literal?} +<span class="offending"><span class="linenum">83</span> expect(fg).to be_equivalent_graph(vocab_graph)</span> +<span class="linenum">84</span> end +<span class="linenum">85</span> end +<span class="linenum">86</span><span class="comment"># Install the coderay gem to get syntax highlighting</span></code></pre> + </div> + </dd> + <script type="text/javascript">moveProgressBar('45.3');</script> + <dd class="example passed"><span class="passed_spec_name">ttl</span><span class='duration'>0.48723s</span></dd> + </dl> +</div> +<div id="div_group_6" class="example_group passed"> + <dl style="margin-left: 15px;"> + <dt id="example_group_6" class="passed">The ontology is internally consistent with respect to domains, ranges, inverses, and any other ontology features specified.</dt> + <script type="text/javascript">makeRed('div_group_6');</script> + <script type="text/javascript">makeRed('example_group_6');</script> + <script type="text/javascript">moveProgressBar('45.6');</script> + <dd class="example failed"> + <span class="failed_spec_name">lints cleanly</span> + <span class="duration">2.09350s</span> + <div class="failure" id="failure_3"> + <div class="message"><pre>Failure/Error: expect(entailed_graph.lint).to be_empty + expected `{:property=>{"dc:creator"=>["Object \"Robert Sanderson\" not compatible with range (dc:Agent)", "Obje...mpatible with range (dc:Agent)", "Object \"Benjamin Young\" not compatible with range (dc:Agent)"]}}.empty?` to return true, got false</pre></div> + <div class="backtrace"><pre>./annotation-vocab_spec.rb:91:in `block (3 levels) in <top (required)>'</pre></div> + <pre class="ruby"><code><span class="linenum">89</span> it "lints cleanly" do +<span class="linenum">90</span> entailed_graph = vocab_graph.dup.entail! +<span class="offending"><span class="linenum">91</span> expect(entailed_graph.lint).to be_empty</span> +<span class="linenum">92</span> end +<span class="linenum">93</span> +<span class="linenum">94</span><span class="comment"># Install the coderay gem to get syntax highlighting</span></code></pre> + </div> + </dd> + </dl> +</div> +<div id="div_group_7" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_7" class="passed">oa:Annotation</dt> + <script type="text/javascript">moveProgressBar('46.0');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00013s</span></dd> + <script type="text/javascript">moveProgressBar('46.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00057s</span></dd> + </dl> +</div> +<div id="div_group_8" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_8" class="passed">oa:Choice</dt> + <script type="text/javascript">moveProgressBar('46.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.01390s</span></dd> + <script type="text/javascript">moveProgressBar('47.0');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00054s</span></dd> + </dl> +</div> +<div id="div_group_9" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_9" class="passed">oa:Composite</dt> + <script type="text/javascript">moveProgressBar('47.3');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00201s</span></dd> + <script type="text/javascript">moveProgressBar('47.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00046s</span></dd> + </dl> +</div> +<div id="div_group_10" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_10" class="passed">oa:CssSelector</dt> + <script type="text/javascript">moveProgressBar('48.0');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('48.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_11" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_11" class="passed">oa:CssStyle</dt> + <script type="text/javascript">moveProgressBar('48.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('49.0');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_12" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_12" class="passed">oa:DataPositionSelector</dt> + <script type="text/javascript">moveProgressBar('49.3');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('49.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00059s</span></dd> + </dl> +</div> +<div id="div_group_13" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_13" class="passed">oa:Direction</dt> + <script type="text/javascript">moveProgressBar('50.0');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('50.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_14" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_14" class="passed">oa:FragmentSelector</dt> + <script type="text/javascript">moveProgressBar('50.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('50.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00047s</span></dd> + </dl> +</div> +<div id="div_group_15" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_15" class="passed">oa:HttpRequestState</dt> + <script type="text/javascript">moveProgressBar('51.3');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00090s</span></dd> + <script type="text/javascript">moveProgressBar('51.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00047s</span></dd> + </dl> +</div> +<div id="div_group_16" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_16" class="passed">oa:Independents</dt> + <script type="text/javascript">moveProgressBar('51.9');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00204s</span></dd> + <script type="text/javascript">moveProgressBar('52.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00046s</span></dd> + </dl> +</div> +<div id="div_group_17" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_17" class="passed">oa:List</dt> + <script type="text/javascript">moveProgressBar('52.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00220s</span></dd> + <script type="text/javascript">moveProgressBar('52.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00052s</span></dd> + </dl> +</div> +<div id="div_group_18" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_18" class="passed">oa:Motivation</dt> + <script type="text/javascript">moveProgressBar('53.3');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00120s</span></dd> + <script type="text/javascript">moveProgressBar('53.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00053s</span></dd> + </dl> +</div> +<div id="div_group_19" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_19" class="passed">oa:RangeSelector</dt> + <script type="text/javascript">moveProgressBar('53.9');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00093s</span></dd> + <script type="text/javascript">moveProgressBar('54.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00048s</span></dd> + </dl> +</div> +<div id="div_group_20" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_20" class="passed">oa:ResourceSelection</dt> + <script type="text/javascript">moveProgressBar('54.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('54.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_21" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_21" class="passed">oa:Selector</dt> + <script type="text/javascript">moveProgressBar('55.2');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('55.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_22" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_22" class="passed">oa:SpecificResource</dt> + <script type="text/javascript">moveProgressBar('55.9');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('56.2');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00050s</span></dd> + </dl> +</div> +<div id="div_group_23" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_23" class="passed">oa:State</dt> + <script type="text/javascript">moveProgressBar('56.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('56.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00048s</span></dd> + </dl> +</div> +<div id="div_group_24" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_24" class="passed">oa:Style</dt> + <script type="text/javascript">moveProgressBar('57.2');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('57.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00048s</span></dd> + </dl> +</div> +<div id="div_group_25" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_25" class="passed">oa:SvgSelector</dt> + <script type="text/javascript">moveProgressBar('57.9');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00086s</span></dd> + <script type="text/javascript">moveProgressBar('58.2');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00050s</span></dd> + </dl> +</div> +<div id="div_group_26" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_26" class="passed">oa:TextPositionSelector</dt> + <script type="text/javascript">moveProgressBar('58.6');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00091s</span></dd> + <script type="text/javascript">moveProgressBar('58.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_27" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_27" class="passed">oa:TextQuoteSelector</dt> + <script type="text/javascript">moveProgressBar('59.2');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('59.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00048s</span></dd> + </dl> +</div> +<div id="div_group_28" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_28" class="passed">oa:TextualBody</dt> + <script type="text/javascript">moveProgressBar('59.9');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('60.2');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_29" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_29" class="passed">oa:TimeState</dt> + <script type="text/javascript">moveProgressBar('60.5');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('60.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00049s</span></dd> + </dl> +</div> +<div id="div_group_30" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_30" class="passed">oa:XPathSelector</dt> + <script type="text/javascript">moveProgressBar('61.2');</script> + <dd class="example passed"><span class="passed_spec_name">subClassOf</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('61.5');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentClass</span><span class='duration'>0.00048s</span></dd> + </dl> +</div> +<div id="div_group_31" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_31" class="passed">oa:annotationService</dt> + <script type="text/javascript">moveProgressBar('61.9');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00011s</span></dd> + <script type="text/javascript">moveProgressBar('62.2');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('62.5');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('62.9');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_32" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_32" class="passed">oa:bodyValue</dt> + <script type="text/javascript">moveProgressBar('63.2');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('63.5');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('63.9');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00083s</span></dd> + <script type="text/javascript">moveProgressBar('64.2');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00015s</span></dd> + </dl> +</div> +<div id="div_group_33" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_33" class="passed">oa:cachedSource</dt> + <script type="text/javascript">moveProgressBar('64.5');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('64.9');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('65.2');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('65.5');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_34" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_34" class="passed">oa:canonical</dt> + <script type="text/javascript">moveProgressBar('65.8');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('66.2');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00011s</span></dd> + <script type="text/javascript">moveProgressBar('66.5');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('66.8');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_35" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_35" class="passed">oa:end</dt> + <script type="text/javascript">moveProgressBar('67.2');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('67.5');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('67.8');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00085s</span></dd> + <script type="text/javascript">moveProgressBar('68.2');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_36" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_36" class="passed">oa:exact</dt> + <script type="text/javascript">moveProgressBar('68.5');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('68.8');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('69.2');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00092s</span></dd> + <script type="text/javascript">moveProgressBar('69.5');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_37" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_37" class="passed">oa:hasBody</dt> + <script type="text/javascript">moveProgressBar('69.8');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('70.1');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00090s</span></dd> + <script type="text/javascript">moveProgressBar('70.5');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('70.8');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_38" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_38" class="passed">oa:hasEndSelector</dt> + <script type="text/javascript">moveProgressBar('71.1');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00011s</span></dd> + <script type="text/javascript">moveProgressBar('71.5');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('71.8');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('72.1');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_39" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_39" class="passed">oa:hasPurpose</dt> + <script type="text/javascript">moveProgressBar('72.5');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('72.8');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('73.1');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('73.5');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_40" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_40" class="passed">oa:hasScope</dt> + <script type="text/javascript">moveProgressBar('73.8');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('74.1');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('74.5');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('74.8');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00011s</span></dd> + </dl> +</div> +<div id="div_group_41" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_41" class="passed">oa:hasSelector</dt> + <script type="text/javascript">moveProgressBar('75.1');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('75.4');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('75.8');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('76.1');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_42" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_42" class="passed">oa:hasSource</dt> + <script type="text/javascript">moveProgressBar('76.4');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('76.8');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('77.1');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('77.4');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_43" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_43" class="passed">oa:hasStartSelector</dt> + <script type="text/javascript">moveProgressBar('77.8');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('78.1');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('78.4');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('78.8');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_44" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_44" class="passed">oa:hasState</dt> + <script type="text/javascript">moveProgressBar('79.1');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('79.4');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('79.8');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('80.1');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_45" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_45" class="passed">oa:hasTarget</dt> + <script type="text/javascript">moveProgressBar('80.4');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('80.7');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('81.1');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('81.4');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_46" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_46" class="passed">oa:motivatedBy</dt> + <script type="text/javascript">moveProgressBar('81.7');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00011s</span></dd> + <script type="text/javascript">moveProgressBar('82.1');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('82.4');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('82.7');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_47" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_47" class="passed">oa:prefix</dt> + <script type="text/javascript">moveProgressBar('83.1');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('83.4');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('83.7');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00082s</span></dd> + <script type="text/javascript">moveProgressBar('84.1');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00014s</span></dd> + </dl> +</div> +<div id="div_group_48" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_48" class="passed">oa:processingLanguage</dt> + <script type="text/javascript">moveProgressBar('84.4');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('84.7');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00012s</span></dd> + <script type="text/javascript">moveProgressBar('85.0');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00085s</span></dd> + <script type="text/javascript">moveProgressBar('85.4');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_49" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_49" class="passed">oa:refinedBy</dt> + <script type="text/javascript">moveProgressBar('85.7');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('86.0');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('86.4');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('86.7');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00011s</span></dd> + </dl> +</div> +<div id="div_group_50" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_50" class="passed">oa:renderedVia</dt> + <script type="text/javascript">moveProgressBar('87.0');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00011s</span></dd> + <script type="text/javascript">moveProgressBar('87.4');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('87.7');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00086s</span></dd> + <script type="text/javascript">moveProgressBar('88.0');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_51" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_51" class="passed">oa:sourceDate</dt> + <script type="text/javascript">moveProgressBar('88.4');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('88.7');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('89.0');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00081s</span></dd> + <script type="text/javascript">moveProgressBar('89.4');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00011s</span></dd> + </dl> +</div> +<div id="div_group_52" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_52" class="passed">oa:sourceDateEnd</dt> + <script type="text/javascript">moveProgressBar('89.7');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('90.0');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00087s</span></dd> + <script type="text/javascript">moveProgressBar('90.3');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00082s</span></dd> + <script type="text/javascript">moveProgressBar('90.7');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00011s</span></dd> + </dl> +</div> +<div id="div_group_53" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_53" class="passed">oa:sourceDateStart</dt> + <script type="text/javascript">moveProgressBar('91.0');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('91.3');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00089s</span></dd> + <script type="text/javascript">moveProgressBar('91.7');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00082s</span></dd> + <script type="text/javascript">moveProgressBar('92.0');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_54" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_54" class="passed">oa:start</dt> + <script type="text/javascript">moveProgressBar('92.3');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('92.7');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('93.0');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00083s</span></dd> + <script type="text/javascript">moveProgressBar('93.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_55" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_55" class="passed">oa:styleClass</dt> + <script type="text/javascript">moveProgressBar('93.7');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('94.0');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('94.3');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00082s</span></dd> + <script type="text/javascript">moveProgressBar('94.7');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_56" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_56" class="passed">oa:styledBy</dt> + <script type="text/javascript">moveProgressBar('95.0');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('95.3');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00092s</span></dd> + <script type="text/javascript">moveProgressBar('95.6');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('96.0');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00013s</span></dd> + </dl> +</div> +<div id="div_group_57" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_57" class="passed">oa:suffix</dt> + <script type="text/javascript">moveProgressBar('96.3');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('96.6');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00010s</span></dd> + <script type="text/javascript">moveProgressBar('97.0');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00081s</span></dd> + <script type="text/javascript">moveProgressBar('97.3');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_58" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_58" class="passed">oa:textDirection</dt> + <script type="text/javascript">moveProgressBar('97.6');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('98.0');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('98.3');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00088s</span></dd> + <script type="text/javascript">moveProgressBar('98.6');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00012s</span></dd> + </dl> +</div> +<div id="div_group_59" class="example_group passed"> + <dl style="margin-left: 30px;"> + <dt id="example_group_59" class="passed">oa:via</dt> + <script type="text/javascript">moveProgressBar('99.0');</script> + <dd class="example passed"><span class="passed_spec_name">subPropertyOf</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('99.3');</script> + <dd class="example passed"><span class="passed_spec_name">domain</span><span class='duration'>0.00009s</span></dd> + <script type="text/javascript">moveProgressBar('99.6');</script> + <dd class="example passed"><span class="passed_spec_name">range</span><span class='duration'>0.00011s</span></dd> + <script type="text/javascript">moveProgressBar('100.0');</script> + <dd class="example passed"><span class="passed_spec_name">equivalentProperty</span><span class='duration'>0.00011s</span></dd> + </dl> +</div> +<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>52.01192 seconds</strong>";</script> +<script type="text/javascript">document.getElementById('totals').innerHTML = "302 examples, 3 failures, 2 pending";</script> +</div> +</div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Rakefile b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Rakefile new file mode 100644 index 00000000000..70b446b915a --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/Rakefile @@ -0,0 +1,11 @@ +require "bundler/setup" + +begin + require 'rspec/core/rake_task' + RSpec::Core::RakeTask.new(:spec) do |t| + t.pattern = "annotation-vocab_spec.rb" + end + + task :default => :spec +rescue LoadError +end
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/annotation-vocab_spec.rb b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/annotation-vocab_spec.rb new file mode 100644 index 00000000000..3ae53b29fbf --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/ruby-rdf/annotation-vocab_spec.rb @@ -0,0 +1,120 @@ +require "bundler/setup" +require 'rdf' +require 'linkeddata' +require 'rdf/spec/matchers' +require 'rspec' + +SAMPLES = File.expand_path("../../samples/", __FILE__) +CORRECT = Dir.glob(File.join(SAMPLES, "correct/*.json")) +INCORRECT = Dir.glob(File.join(SAMPLES, "incorrect/*.json")) +RDF::Reasoner.apply(:rdfs, :owl) +VOCAB_URI = "http://www.w3.org/ns/oa#" +VOCAB_GRAPH = begin + g = RDF::Graph.load(VOCAB_URI, format: :jsonld, headers: {"Accept" => "application/ld+json"}) + g.each_object {|o| o.squish! if o.literal?} + g +end + +describe "Web Annotation Vocab" do + let(:vocab) {VOCAB_URI} + let(:vocab_graph) {VOCAB_GRAPH} + + # Load Annotation vocabulary first, so that that defined in rdf-vocab is not lazy-loaded + before(:all) do + RDF::Vocabulary.from_graph(VOCAB_GRAPH, url: VOCAB_URI, class_name: RDF::Vocab::OA) + end + + it "The JSON-LD context document can be parsed without errors by JSON-LD validators" do + expect {JSON::LD::API.expand(vocab, validate: true)}.not_to raise_error + end + + context "The JSON-LD context document can be used to convert JSON-LD serialized Annotations into RDF triples" do + CORRECT.each do |file| + it "#{file.split('/').last}" do + nt = file.sub(/.json$/, '.nt') + gjld = RDF::Graph.load(file, format: :jsonld) + gnt = RDF::Graph.load(nt, format: :ntriples) + expect(gjld).to be_equivalent_graph(gnt) + end + + it "lint #{file.split('/').last}" do + gjld = RDF::Graph.load(file, format: :jsonld) + gjld.entail! + expect(gjld.lint).to be_empty + end + end + end + + context "detects errors in incorrect examples" do + INCORRECT.each do |file| + it "#{file.split('/').last}" do + pending "Empty Documents are invalid" if file =~ /anno2.json|anno3.json/ + expect {RDF::Graph.load(file, validate: true, format: :jsonld, logger: false)}.to raise_error(RDF::ReaderError) + end + end + end + + context "The ontology documents can be parsed without errors by RDF Schema validators" do + { + jsonld: "application/ld+json", + rdfxml: "application/rdf+xml", + ttl: "text/turtle", + }.each do |format, content_type| + it "JSON-LD version is isomorphic to #{format}" do + expect do + RDF::Graph.load(vocab, format: format, validate: true, headers: {"Accept" => content_type}) + end.not_to raise_error + end + end + end + + context "The ontology documents are isomorphic to each other" do + { + rdfxml: "application/rdf+xml", + ttl: "text/turtle", + }.each do |format, content_type| + it format do + fg = RDF::Graph.load(vocab, format: format, headers: {"Accept" => content_type}) + + # XXX Normalize whitespace in literals to ease comparision + fg.each_object {|o| o.squish! if o.literal?} + expect(fg).to be_equivalent_graph(vocab_graph) + end + end + end + + context "The ontology is internally consistent with respect to domains, ranges, inverses, and any other ontology features specified." do + it "lints cleanly" do + entailed_graph = vocab_graph.dup.entail! + expect(entailed_graph.lint).to be_empty + end + + RDF::Vocab::OA.each do |term| + if term.type.to_s =~ /Class/ + context term.pname do + it "subClassOf" do + expect {term.subClassOf.map(&:pname)}.not_to raise_error + end + it "equivalentClass" do + expect {term.equivalentClass.map(&:pname)}.not_to raise_error + end + end + elsif term.type.to_s =~ /Property/ + context term.pname do + it "subPropertyOf" do + expect {term.subPropertyOf.map(&:pname)}.not_to raise_error + end + it "domain" do + expect {term.domain.map(&:pname)}.not_to raise_error + end + it "range" do + expect {term.range.map(&:pname)}.not_to raise_error + end + it "equivalentProperty" do + expect {term.equivalentProperty.map(&:pname)}.not_to raise_error + end + end + end + end + end +end diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno1.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno1.json new file mode 100644 index 00000000000..905349bb468 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno1.json @@ -0,0 +1,7 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno1", + "type": "Annotation", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno1.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno1.nt new file mode 100644 index 00000000000..879b3b4960e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno1.nt @@ -0,0 +1,3 @@ +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/page1> . +<http://example.org/anno1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasBody> <http://example.org/post1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno10.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno10.json new file mode 100644 index 00000000000..766fddf3ac8 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno10.json @@ -0,0 +1,19 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno10", + "type": "Annotation", + "body": { + "type": "Choice", + "items": [ + { + "id": "http://example.org/note1", + "language": "en" + }, + { + "id": "http://example.org/note2", + "language": "fr" + } + ] + }, + "target": "http://example.org/website1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno10.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno10.nt new file mode 100644 index 00000000000..0db919d3050 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno10.nt @@ -0,0 +1,11 @@ +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/note2> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/note1> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 . +<http://example.org/note2> <http://purl.org/dc/elements/1.1/language> "fr" . +_:b0 <http://www.w3.org/ns/activitystreams#items> _:b1 . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Choice> . +<http://example.org/anno10> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/website1> . +<http://example.org/anno10> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/note1> <http://purl.org/dc/elements/1.1/language> "en" . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno11.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno11.json new file mode 100644 index 00000000000..7461493f46e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno11.json @@ -0,0 +1,18 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno11", + "type": "Annotation", + "motivation": "commenting", + "body": { + "type": "TextualBody", + "value": "These pages together provide evidence of the conspiracy" + }, + "target": { + "type": "Composite", + "items": [ + "http://example.com/page1", + "http://example.org/page6", + "http://example.net/page4" + ] + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno11.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno11.nt new file mode 100644 index 00000000000..cb071e57376 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno11.nt @@ -0,0 +1,14 @@ +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/page1> . +<http://example.org/anno11> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno11> <http://www.w3.org/ns/oa#hasTarget> _:b1 . +<http://example.org/anno11> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno11> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#commenting> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.net/page4> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Composite> . +_:b1 <http://www.w3.org/ns/activitystreams#items> _:b2 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/page6> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "These pages together provide evidence of the conspiracy" . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno12.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno12.json new file mode 100644 index 00000000000..a8039b207df --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno12.json @@ -0,0 +1,19 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno12", + "type": "Annotation", + "motivation": "tagging", + "body": { + "type": "TextualBody", + "value": "important" + }, + "target": { + "type": "List", + "items": [ + "http://example.com/book/page1", + "http://example.com/book/page2", + "http://example.com/book/page3", + "http://example.com/book/page4" + ] + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno12.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno12.nt new file mode 100644 index 00000000000..5890c8b9957 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno12.nt @@ -0,0 +1,16 @@ +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "important" . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page4> . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +<http://example.org/anno12> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno12> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#tagging> . +<http://example.org/anno12> <http://www.w3.org/ns/oa#hasTarget> _:b1 . +<http://example.org/anno12> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page1> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page2> . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 . +_:b1 <http://www.w3.org/ns/activitystreams#items> _:b2 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#List> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page3> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b5 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno13.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno13.json new file mode 100644 index 00000000000..8bf663330da --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno13.json @@ -0,0 +1,16 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno13", + "type": "Annotation", + "motivation": "classifying", + "body": "http://example.org/vocab/art/portrait", + "target": { + "type": "Independents", + "items": [ + "http://example.com/image1", + "http://example.net/image2", + "http://example.com/image4", + "http://example.org/image9" + ] + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno13.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno13.nt new file mode 100644 index 00000000000..e7544503ee9 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno13.nt @@ -0,0 +1,14 @@ +_:b0 <http://www.w3.org/ns/activitystreams#items> _:b1 . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Independents> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/image1> . +<http://example.org/anno13> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#classifying> . +<http://example.org/anno13> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno13> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno13> <http://www.w3.org/ns/oa#hasBody> <http://example.org/vocab/art/portrait> . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/image4> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.net/image2> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/image9> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno14.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno14.json new file mode 100644 index 00000000000..102225b729e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno14.json @@ -0,0 +1,16 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno14", + "type": "Annotation", + "creator": "http://example.org/user1", + "created": "2015-01-28T12:00:00Z", + "modified": "2015-01-29T09:00:00Z", + "generator": "http://example.org/client1", + "generated": "2015-02-04T12:00:00Z", + "body": { + "id": "http://example.net/review1", + "creator": "http://example.net/user2", + "created": "2014-06-02T17:00:00Z" + }, + "target": "http://example.com/restaurant1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno14.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno14.nt new file mode 100644 index 00000000000..f37cb0d3a01 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno14.nt @@ -0,0 +1,10 @@ +<http://example.org/anno14> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno14> <http://purl.org/dc/terms/modified> "2015-01-29T09:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno14> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno14> <http://www.w3.org/ns/activitystreams#generator> <http://example.org/client1> . +<http://example.org/anno14> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/restaurant1> . +<http://example.org/anno14> <http://purl.org/dc/terms/created> "2015-01-28T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno14> <http://purl.org/dc/terms/issued> "2015-02-04T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno14> <http://purl.org/dc/terms/creator> <http://example.org/user1> . +<http://example.net/review1> <http://purl.org/dc/terms/creator> <http://example.net/user2> . +<http://example.net/review1> <http://purl.org/dc/terms/created> "2014-06-02T17:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno15.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno15.json new file mode 100644 index 00000000000..1280eef4cd9 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno15.json @@ -0,0 +1,20 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno15", + "type": "Annotation", + "creator": { + "id": "http://example.org/user1", + "type": "Person", + "name": "My Pseudonym", + "nickname": "pseudo", + "email_sha1": "58bad08927902ff9307b621c54716dcc5083e339" + }, + "generator": { + "id": "http://example.org/client1", + "type": "Software", + "name": "Code v2.1", + "homepage": "http://example.org/client1/homepage1" + }, + "body": "http://example.net/review1", + "target": "http://example.com/restaurant1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno15.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno15.nt new file mode 100644 index 00000000000..2afb3d2a2eb --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno15.nt @@ -0,0 +1,12 @@ +<http://example.org/user1> <http://xmlns.com/foaf/0.1/nick> "pseudo" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/mbox_sha1sum> "58bad08927902ff9307b621c54716dcc5083e339" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/name> "My Pseudonym" . +<http://example.org/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . +<http://example.org/anno15> <http://purl.org/dc/terms/creator> <http://example.org/user1> . +<http://example.org/anno15> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/restaurant1> . +<http://example.org/anno15> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno15> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno15> <http://www.w3.org/ns/activitystreams#generator> <http://example.org/client1> . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/name> "Code v2.1" . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/homepage> <http://example.org/client1/homepage1> . +<http://example.org/client1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#Application> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno16.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno16.json new file mode 100644 index 00000000000..f110169c345 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno16.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno16", + "type": "Annotation", + "audience": { + "id": "http://example.edu/roles/teacher", + "type": "schema:EducationalAudience", + "schema:educationalRole": "teacher" + }, + "body": "http://example.net/classnotes1", + "target": "http://example.com/textbook1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno16.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno16.nt new file mode 100644 index 00000000000..b511107f61d --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno16.nt @@ -0,0 +1,6 @@ +<http://example.edu/roles/teacher> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/EducationalAudience> . +<http://example.edu/roles/teacher> <http://schema.org/educationalRole> "teacher" . +<http://example.org/anno16> <http://www.w3.org/ns/oa#hasBody> <http://example.net/classnotes1> . +<http://example.org/anno16> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno16> <http://schema.org/audience> <http://example.edu/roles/teacher> . +<http://example.org/anno16> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/textbook1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno17.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno17.json new file mode 100644 index 00000000000..056b8e4f534 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno17.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno17", + "type": "Annotation", + "motivation": "commenting", + "body": "http://example.net/comment1", + "target": { + "id": "http://example.com/video1", + "type": "Video", + "accessibility": "captions" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno17.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno17.nt new file mode 100644 index 00000000000..ebfceb4e28e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno17.nt @@ -0,0 +1,6 @@ +<http://example.org/anno17> <http://www.w3.org/ns/oa#hasBody> <http://example.net/comment1> . +<http://example.org/anno17> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/video1> . +<http://example.org/anno17> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno17> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#commenting> . +<http://example.com/video1> <http://schema.org/accessibilityFeature> "captions" . +<http://example.com/video1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/MovingImage> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno18.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno18.json new file mode 100644 index 00000000000..cdf50fcd8f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno18.json @@ -0,0 +1,19 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno18", + "type": "Annotation", + "motivation": "bookmarking", + "body": [ + { + "type": "TextualBody", + "value": "readme", + "purpose": "tagging" + }, + { + "type": "TextualBody", + "value": "A good description of the topic that bears further investigation", + "purpose": "describing" + } + ], + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno18.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno18.nt new file mode 100644 index 00000000000..2e4e05bf4dc --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno18.nt @@ -0,0 +1,11 @@ +<http://example.org/anno18> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno18> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/page1> . +<http://example.org/anno18> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#bookmarking> . +<http://example.org/anno18> <http://www.w3.org/ns/oa#hasBody> _:b1 . +<http://example.org/anno18> <http://www.w3.org/ns/oa#hasBody> _:b0 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "A good description of the topic that bears further investigation" . +_:b1 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "readme" . +_:b0 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#tagging> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno19.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno19.json new file mode 100644 index 00000000000..bd572ce6883 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno19.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno19", + "type": "Annotation", + "rights": "https://creativecommons.org/publicdomain/zero/1.0/", + "body": { + "id": "http://example.net/review1", + "rights": "http://creativecommons.org/licenses/by-nc/4.0/" + }, + "target": "http://example.com/product1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno19.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno19.nt new file mode 100644 index 00000000000..11fa7ab215e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno19.nt @@ -0,0 +1,5 @@ +<http://example.net/review1> <http://purl.org/dc/terms/rights> <http://creativecommons.org/licenses/by-nc/4.0/> . +<http://example.org/anno19> <http://purl.org/dc/terms/rights> <https://creativecommons.org/publicdomain/zero/1.0/> . +<http://example.org/anno19> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno19> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno19> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/product1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno2.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno2.json new file mode 100644 index 00000000000..f950f2db8d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno2.json @@ -0,0 +1,17 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno2", + "type": "Annotation", + "body": { + "id": "http://example.org/analysis1.mp3", + "format": "audio/mpeg", + "language": "fr" + }, + "target": { + "id": "http://example.gov/patent1.pdf", + "format": "application/pdf", + "language": ["en", "ar"], + "textDirection": "ltr", + "processingLanguage": "en" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno2.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno2.nt new file mode 100644 index 00000000000..b1377ef57e3 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno2.nt @@ -0,0 +1,10 @@ +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasTarget> <http://example.gov/patent1.pdf> . +<http://example.org/anno2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasBody> <http://example.org/analysis1.mp3> . +<http://example.org/analysis1.mp3> <http://purl.org/dc/elements/1.1/language> "fr" . +<http://example.org/analysis1.mp3> <http://purl.org/dc/elements/1.1/format> "audio/mpeg" . +<http://example.gov/patent1.pdf> <http://www.w3.org/ns/oa#processingLanguage> "en" . +<http://example.gov/patent1.pdf> <http://purl.org/dc/elements/1.1/language> "ar" . +<http://example.gov/patent1.pdf> <http://purl.org/dc/elements/1.1/language> "en" . +<http://example.gov/patent1.pdf> <http://www.w3.org/ns/oa#textDirection> <http://www.w3.org/ns/oa#ltrDirection> . +<http://example.gov/patent1.pdf> <http://purl.org/dc/elements/1.1/format> "application/pdf" . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno20.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno20.json new file mode 100644 index 00000000000..17fcc7185a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno20.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno20", + "type": "Annotation", + "canonical": "urn:uuid:dbfb1861-0ecf-41ad-be94-a584e5c4f1df", + "via": "http://other.example.org/anno1", + "body": { + "id": "http://example.net/review1", + "rights": "http://creativecommons.org/licenses/by/4.0/" + }, + "target": "http://example.com/product1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno20.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno20.nt new file mode 100644 index 00000000000..465f79bc621 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno20.nt @@ -0,0 +1,6 @@ +<http://example.net/review1> <http://purl.org/dc/terms/rights> <http://creativecommons.org/licenses/by/4.0/> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/product1> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#canonical> <urn:uuid:dbfb1861-0ecf-41ad-be94-a584e5c4f1df> . +<http://example.org/anno20> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#via> <http://other.example.org/anno1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno21.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno21.json new file mode 100644 index 00000000000..9ae284df040 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno21.json @@ -0,0 +1,14 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno21", + "type": "Annotation", + "body": { + "type": "SpecificResource", + "purpose": "tagging", + "source": "http://example.org/city1" + }, + "target": { + "id": "http://example.org/photo1", + "type": "Image" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno21.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno21.nt new file mode 100644 index 00000000000..cc028dce7c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno21.nt @@ -0,0 +1,7 @@ +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SpecificResource> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/city1> . +_:b0 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#tagging> . +<http://example.org/anno21> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno21> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno21> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/photo1> . +<http://example.org/photo1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/StillImage> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno22.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno22.json new file mode 100644 index 00000000000..767080c05e8 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno22.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno22", + "type": "Annotation", + "body": { + "source": "http://example.org/page1", + "selector": "http://example.org/paraselector1" + }, + "target": { + "source": "http://example.com/dataset1", + "selector": "http://example.org/dataselector1" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno22.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno22.nt new file mode 100644 index 00000000000..4a2e4b5978c --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno22.nt @@ -0,0 +1,7 @@ +_:b0 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/paraselector1> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +<http://example.org/anno22> <http://www.w3.org/ns/oa#hasTarget> _:b1 . +<http://example.org/anno22> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno22> <http://www.w3.org/ns/oa#hasBody> _:b0 . +_:b1 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/dataselector1> . +_:b1 <http://www.w3.org/ns/oa#hasSource> <http://example.com/dataset1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno23.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno23.json new file mode 100644 index 00000000000..53b6c676b15 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno23.json @@ -0,0 +1,15 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno23", + "type": "Annotation", + "body": { + "source": "http://example.org/video1", + "purpose": "describing", + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "t=30,60" + } + }, + "target": "http://example.org/image1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno23.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno23.nt new file mode 100644 index 00000000000..9bfe050b030 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno23.nt @@ -0,0 +1,9 @@ +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +_:b1 <http://purl.org/dc/terms/conformsTo> <http://www.w3.org/TR/media-frags/> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "t=30,60" . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b0 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/video1> . +<http://example.org/anno23> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/image1> . +<http://example.org/anno23> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno23> <http://www.w3.org/ns/oa#hasBody> _:b0 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno24.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno24.json new file mode 100644 index 00000000000..6cca6cb0a6d --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno24.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno24", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1.html", + "selector": { + "type": "CssSelector", + "value": "#elemid > .elemclass + p" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno24.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno24.nt new file mode 100644 index 00000000000..090cad89c92 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno24.nt @@ -0,0 +1,7 @@ +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1.html> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#CssSelector> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "#elemid > .elemclass + p" . +<http://example.org/anno24> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno24> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno24> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno25.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno25.json new file mode 100644 index 00000000000..0e48d3be6a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno25.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno25", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1.html", + "selector": { + "type": "XPathSelector", + "value": "/html/body/p[2]/table/tr[2]/td[3]/span" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno25.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno25.nt new file mode 100644 index 00000000000..5bd4b28c5da --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno25.nt @@ -0,0 +1,7 @@ +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#XPathSelector> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "/html/body/p[2]/table/tr[2]/td[3]/span" . +<http://example.org/anno25> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno25> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno25> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1.html> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno26.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno26.json new file mode 100644 index 00000000000..1777fd781b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno26.json @@ -0,0 +1,15 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno26", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/page1", + "selector": { + "type": "TextQuoteSelector", + "exact": "anotation", + "prefix": "this is an ", + "suffix": " that has some" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno26.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno26.nt new file mode 100644 index 00000000000..9ecd4318390 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno26.nt @@ -0,0 +1,9 @@ +_:b1 <http://www.w3.org/ns/oa#prefix> "this is an " . +_:b1 <http://www.w3.org/ns/oa#exact> "anotation" . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextQuoteSelector> . +_:b1 <http://www.w3.org/ns/oa#suffix> " that has some" . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +<http://example.org/anno26> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/anno26> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno26> <http://www.w3.org/ns/oa#hasTarget> _:b0 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno27.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno27.json new file mode 100644 index 00000000000..4844979a241 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno27.json @@ -0,0 +1,14 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno27", + "type": "Annotation", + "body": "http://example.org/review1", + "target": { + "source": "http://example.org/ebook1", + "selector": { + "type": "TextPositionSelector", + "start": 412, + "end": 795 + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno27.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno27.nt new file mode 100644 index 00000000000..68df84db6a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno27.nt @@ -0,0 +1,8 @@ +<http://example.org/anno27> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno27> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno27> <http://www.w3.org/ns/oa#hasBody> <http://example.org/review1> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextPositionSelector> . +_:b1 <http://www.w3.org/ns/oa#start> "412"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b1 <http://www.w3.org/ns/oa#end> "795"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/ebook1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno28.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno28.json new file mode 100644 index 00000000000..2dd1bc7afcc --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno28.json @@ -0,0 +1,14 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno28", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/diskimg1", + "selector": { + "type": "DataPositionSelector", + "start": 4096, + "end": 4104 + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno28.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno28.nt new file mode 100644 index 00000000000..e84bcb2400f --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno28.nt @@ -0,0 +1,8 @@ +_:b1 <http://www.w3.org/ns/oa#end> "4104"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#DataPositionSelector> . +_:b1 <http://www.w3.org/ns/oa#start> "4096"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/diskimg1> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +<http://example.org/anno28> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno28> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno28> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno29.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno29.json new file mode 100644 index 00000000000..77914acaeb2 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno29.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno29", + "type": "Annotation", + "body": "http://example.org/road1", + "target": { + "source": "http://example.org/map1", + "selector": { + "id": "http://example.org/svg1", + "type": "SvgSelector" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno29.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno29.nt new file mode 100644 index 00000000000..79178d342e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno29.nt @@ -0,0 +1,6 @@ +<http://example.org/svg1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SvgSelector> . +<http://example.org/anno29> <http://www.w3.org/ns/oa#hasBody> <http://example.org/road1> . +<http://example.org/anno29> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno29> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/map1> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/svg1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno3.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno3.json new file mode 100644 index 00000000000..548825c76bc --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno3.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno3", + "type": "Annotation", + "body": { + "id": "http://example.org/video1", + "type": "Video" + }, + "target": { + "id": "http://example.org/website1", + "type": "Text" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno3.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno3.nt new file mode 100644 index 00000000000..87a7767c9c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno3.nt @@ -0,0 +1,5 @@ +<http://example.org/website1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/Text> . +<http://example.org/video1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/MovingImage> . +<http://example.org/anno3> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/website1> . +<http://example.org/anno3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno3> <http://www.w3.org/ns/oa#hasBody> <http://example.org/video1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno30.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno30.json new file mode 100644 index 00000000000..1a7619afc1e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno30.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno30", + "type": "Annotation", + "body": "http://example.org/road1", + "target": { + "source": "http://example.org/map1", + "selector": { + "type": "SvgSelector", + "value": "<svg:svg> ... </svg:svg>" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno30.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno30.nt new file mode 100644 index 00000000000..7889db4bb16 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno30.nt @@ -0,0 +1,7 @@ +<http://example.org/anno30> <http://www.w3.org/ns/oa#hasBody> <http://example.org/road1> . +<http://example.org/anno30> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno30> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/map1> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "<svg:svg> ... </svg:svg>" . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SvgSelector> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno31.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno31.json new file mode 100644 index 00000000000..ee6902c3968 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno31.json @@ -0,0 +1,20 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno31", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/page1.html", + "selector": { + "type": "RangeSelector", + "startSelector": { + "type": "XPathSelector", + "value": "//table[1]/tr[1]/td[2]" + }, + "endSelector": { + "type": "XPathSelector", + "value": "//table[1]/tr[1]/td[4]" + } + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno31.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno31.nt new file mode 100644 index 00000000000..efb8e991e87 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno31.nt @@ -0,0 +1,12 @@ +_:b1 <http://www.w3.org/ns/oa#hasEndSelector> _:b3 . +_:b1 <http://www.w3.org/ns/oa#hasStartSelector> _:b2 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#RangeSelector> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1.html> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "//table[1]/tr[1]/td[4]" . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#XPathSelector> . +<http://example.org/anno31> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno31> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno31> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "//table[1]/tr[1]/td[2]" . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#XPathSelector> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno32.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno32.json new file mode 100644 index 00000000000..f7c189ceb63 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno32.json @@ -0,0 +1,19 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno32", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/page1", + "selector": { + "type": "FragmentSelector", + "value": "para5", + "refinedBy": { + "type": "TextQuoteSelector", + "exact": "Selected Text", + "prefix": "text before the ", + "suffix": " and text after it" + } + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno32.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno32.nt new file mode 100644 index 00000000000..7ffcc146c13 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno32.nt @@ -0,0 +1,12 @@ +<http://example.org/anno32> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno32> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/anno32> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> _:b1 . +_:b2 <http://www.w3.org/ns/oa#suffix> " and text after it" . +_:b2 <http://www.w3.org/ns/oa#prefix> "text before the " . +_:b2 <http://www.w3.org/ns/oa#exact> "Selected Text" . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextQuoteSelector> . +_:b1 <http://www.w3.org/ns/oa#refinedBy> _:b2 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "para5" . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno33.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno33.json new file mode 100644 index 00000000000..f2866eef56e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno33.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno33", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1", + "state": { + "id": "http://example.org/state1" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno33.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno33.nt new file mode 100644 index 00000000000..cc71ce37b60 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno33.nt @@ -0,0 +1,5 @@ +_:b0 <http://www.w3.org/ns/oa#hasState> <http://example.org/state1> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +<http://example.org/anno33> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno33> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +<http://example.org/anno33> <http://www.w3.org/ns/oa#hasTarget> _:b0 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno34.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno34.json new file mode 100644 index 00000000000..c3df38c2823 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno34.json @@ -0,0 +1,14 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno34", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1", + "state": { + "type": "TimeState", + "cached": "http://archive.example.org/copy1", + "sourceDate": "2015-07-20T13:30:00Z" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno34.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno34.nt new file mode 100644 index 00000000000..040a1c755fc --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno34.nt @@ -0,0 +1,8 @@ +<http://example.org/anno34> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno34> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno34> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +_:b0 <http://www.w3.org/ns/oa#hasState> _:b1 . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b1 <http://www.w3.org/ns/oa#sourceDate> "2015-07-20T13:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TimeState> . +_:b1 <http://www.w3.org/ns/oa#cachedSource> <http://archive.example.org/copy1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno35.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno35.json new file mode 100644 index 00000000000..39050abb133 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno35.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno35", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "source": "http://example.org/resource1", + "state": { + "type": "HttpRequestState", + "value": "Accept: application/pdf" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno35.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno35.nt new file mode 100644 index 00000000000..9d528523afa --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno35.nt @@ -0,0 +1,7 @@ +_:b0 <http://www.w3.org/ns/oa#hasState> _:b1 . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/resource1> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#HttpRequestState> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Accept: application/pdf" . +<http://example.org/anno35> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno35> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno35> <http://www.w3.org/ns/oa#hasBody> <http://example.org/description1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno36.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno36.json new file mode 100644 index 00000000000..77581efb3df --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno36.json @@ -0,0 +1,22 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno36", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/ebook1", + "state": { + "type": "TimeState", + "sourceDate": "2016-02-01T12:05:23Z", + "refinedBy": { + "type": "HttpRequestState", + "value": "Accept: application/pdf", + "refinedBy": { + "type": "FragmentSelector", + "value": "page=10", + "conformsTo": "http://tools.ietf.org/rfc/rfc3778" + } + } + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno36.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno36.nt new file mode 100644 index 00000000000..aa27b88d835 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno36.nt @@ -0,0 +1,14 @@ +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#HttpRequestState> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Accept: application/pdf" . +_:b2 <http://www.w3.org/ns/oa#refinedBy> _:b3 . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/ebook1> . +_:b0 <http://www.w3.org/ns/oa#hasState> _:b1 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "page=10" . +_:b3 <http://purl.org/dc/terms/conformsTo> <http://tools.ietf.org/rfc/rfc3778> . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +_:b1 <http://www.w3.org/ns/oa#sourceDate> "2016-02-01T12:05:23Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TimeState> . +_:b1 <http://www.w3.org/ns/oa#refinedBy> _:b2 . +<http://example.org/anno36> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno36> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/anno36> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno37.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno37.json new file mode 100644 index 00000000000..96796db9a0b --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno37.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno37", + "type": "Annotation", + "stylesheet": "http://example.org/style1", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/document1", + "styleClass": "red" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno37.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno37.nt new file mode 100644 index 00000000000..6b03f75dc6f --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno37.nt @@ -0,0 +1,6 @@ +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/document1> . +_:b0 <http://www.w3.org/ns/oa#styleClass> "red" . +<http://example.org/anno37> <http://www.w3.org/ns/oa#styledBy> <http://example.org/style1> . +<http://example.org/anno37> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno37> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/anno37> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno38.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno38.json new file mode 100644 index 00000000000..67f24b80eae --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno38.json @@ -0,0 +1,14 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno38", + "type": "Annotation", + "stylesheet": { + "type": "CssStylesheet", + "value": ".red { color: red }" + }, + "body": "http://example.org/body1", + "target": { + "source": "http://example.org/target1", + "styleClass": "red" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno38.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno38.nt new file mode 100644 index 00000000000..0a05adbd1ba --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno38.nt @@ -0,0 +1,8 @@ +_:b1 <http://www.w3.org/ns/oa#styleClass> "red" . +_:b1 <http://www.w3.org/ns/oa#hasSource> <http://example.org/target1> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#CssStyle> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> ".red { color: red }" . +<http://example.org/anno38> <http://www.w3.org/ns/oa#styledBy> _:b0 . +<http://example.org/anno38> <http://www.w3.org/ns/oa#hasBody> <http://example.org/body1> . +<http://example.org/anno38> <http://www.w3.org/ns/oa#hasTarget> _:b1 . +<http://example.org/anno38> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno39.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno39.json new file mode 100644 index 00000000000..27e639cd343 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno39.json @@ -0,0 +1,15 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno39", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.edu/article.pdf", + "selector": "http://example.org/selectors/html-selector1", + "renderedVia": { + "id": "http://example.com/pdf-to-html-library", + "type": "Software", + "schema:softwareVersion": "2.5" + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno39.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno39.nt new file mode 100644 index 00000000000..8905e96cdad --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno39.nt @@ -0,0 +1,8 @@ +<http://example.org/anno39> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno39> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/anno39> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.com/pdf-to-html-library> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#Application> . +<http://example.com/pdf-to-html-library> <http://schema.org/softwareVersion> "2.5" . +_:b0 <http://www.w3.org/ns/oa#renderedVia> <http://example.com/pdf-to-html-library> . +_:b0 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/selectors/html-selector1> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.edu/article.pdf> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno4.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno4.json new file mode 100644 index 00000000000..5655fb39e13 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno4.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno4", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "id": "http://example.com/image1#xywh=100,100,300,300", + "type": "Image", + "format": "image/jpeg" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno4.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno4.nt new file mode 100644 index 00000000000..32f8137b386 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno4.nt @@ -0,0 +1,5 @@ +<http://example.org/anno4> <http://www.w3.org/ns/oa#hasBody> <http://example.org/description1> . +<http://example.org/anno4> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/image1#xywh=100,100,300,300> . +<http://example.org/anno4> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.com/image1#xywh=100,100,300,300> <http://purl.org/dc/elements/1.1/format> "image/jpeg" . +<http://example.com/image1#xywh=100,100,300,300> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/StillImage> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno40.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno40.json new file mode 100644 index 00000000000..63b47f145c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno40.json @@ -0,0 +1,10 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno40", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/image1", + "scope": "http://example.org/page1" + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno40.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno40.nt new file mode 100644 index 00000000000..6afaad5a700 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno40.nt @@ -0,0 +1,5 @@ +<http://example.org/anno40> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno40> <http://www.w3.org/ns/oa#hasTarget> _:b0 . +<http://example.org/anno40> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +_:b0 <http://www.w3.org/ns/oa#hasSource> <http://example.org/image1> . +_:b0 <http://www.w3.org/ns/oa#hasScope> <http://example.org/page1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno41-example44.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno41-example44.json new file mode 100644 index 00000000000..80afc748948 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno41-example44.json @@ -0,0 +1,82 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno41", + "type": "Annotation", + "motivation": "commenting", + "creator": { + "id": "http://example.org/user1", + "type": "Person", + "name": "A. Person", + "nickname": "user1" + }, + "created": "2015-10-13T13:00:00Z", + "generator": { + "id": "http://example.org/client1", + "type": "Software", + "name": "Code v2.1", + "homepage": "http://example.org/homepage1" + }, + "generated": "2015-10-14T15:13:28Z", + "stylesheet": { + "id": "http://example.org/stylesheet1", + "type": "CssStylesheet" + }, + "body": [ + { + "type": "TextualBody", + "purpose": "tagging", + "value": "love" + }, + { + "type": "Choice", + "items": [ + { + "type": "TextualBody", + "purpose": "describing", + "value": "I really love this particular bit of text in this XML. No really.", + "format": "text/plain", + "language": "en", + "creator": "http://example.org/user1" + }, + { + "type": "SpecificResource", + "purpose": "describing", + "source": { + "id": "http://example.org/comment1", + "type": "Audio", + "format": "audio/mpeg", + "language": "de", + "creator": { + "id": "http://example.org/user2", + "type": "Person" + } + } + } + ] + } + ], + "target": { + "type": "SpecificResource", + "styleClass": "mystyle", + "source": "http://example.com/document1", + "state": [ + { + "type": "HttpRequestState", + "value": "Accept: application/xml", + "refinedBy": { + "type": "TimeState", + "sourceDate": "2015-09-25T12:00:00Z" + } + } + ], + "selector": { + "type": "FragmentSelector", + "value": "xpointer(/doc/body/section[2]/para[1])", + "refinedBy": { + "type": "TextPositionSelector", + "start": 6, + "end": 27 + } + } + } +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno41-example44.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno41-example44.nt new file mode 100644 index 00000000000..5d5122e7d2d --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno41-example44.nt @@ -0,0 +1,56 @@ +<http://example.org/user1> <http://xmlns.com/foaf/0.1/nick> "user1" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/name> "A. Person" . +<http://example.org/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . +_:b10 <http://www.w3.org/ns/oa#start> "6"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b10 <http://www.w3.org/ns/oa#end> "27"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextPositionSelector> . +<http://example.org/stylesheet1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#CssStyle> . +<http://example.org/comment1> <http://purl.org/dc/elements/1.1/language> "de" . +<http://example.org/comment1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/Sound> . +<http://example.org/comment1> <http://purl.org/dc/terms/creator> <http://example.org/user2> . +<http://example.org/comment1> <http://purl.org/dc/elements/1.1/format> "audio/mpeg" . +_:b7 <http://www.w3.org/ns/oa#refinedBy> _:b8 . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#HttpRequestState> . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Accept: application/xml" . +_:b3 <http://purl.org/dc/elements/1.1/language> "en" . +_:b3 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b3 <http://purl.org/dc/terms/creator> <http://example.org/user1> . +_:b3 <http://purl.org/dc/elements/1.1/format> "text/plain" . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "I really love this particular bit of text in this XML. No really." . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b3 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Choice> . +_:b1 <http://www.w3.org/ns/activitystreams#items> _:b2 . +_:b5 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b5 <http://www.w3.org/ns/oa#hasSource> <http://example.org/comment1> . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SpecificResource> . +<http://example.org/anno41> <http://purl.org/dc/terms/created> "2015-10-13T13:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#hasBody> _:b1 . +<http://example.org/anno41> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno41> <http://www.w3.org/ns/oa#styledBy> <http://example.org/stylesheet1> . +<http://example.org/anno41> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno41> <http://purl.org/dc/terms/issued> "2015-10-14T15:13:28Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno41> <http://purl.org/dc/terms/creator> <http://example.org/user1> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#commenting> . +<http://example.org/anno41> <http://www.w3.org/ns/activitystreams#generator> <http://example.org/client1> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#hasTarget> _:b6 . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b5 . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b9 <http://www.w3.org/ns/oa#refinedBy> _:b10 . +_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "xpointer(/doc/body/section[2]/para[1])" . +_:b0 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#tagging> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "love" . +<http://example.org/user2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/name> "Code v2.1" . +<http://example.org/client1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#Application> . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/homepage> <http://example.org/homepage1> . +_:b8 <http://www.w3.org/ns/oa#sourceDate> "2015-09-25T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TimeState> . +_:b6 <http://www.w3.org/ns/oa#styleClass> "mystyle" . +_:b6 <http://www.w3.org/ns/oa#hasSelector> _:b9 . +_:b6 <http://www.w3.org/ns/oa#hasSource> <http://example.com/document1> . +_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SpecificResource> . +_:b6 <http://www.w3.org/ns/oa#hasState> _:b7 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno5.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno5.json new file mode 100644 index 00000000000..85532e87850 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno5.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno5", + "type":"Annotation", + "body": { + "type" : "TextualBody", + "value" : "<p>j'adore !</p>", + "format" : "text/html", + "language" : "fr" + }, + "target": "http://example.org/photo1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno5.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno5.nt new file mode 100644 index 00000000000..cb0359fd2a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno5.nt @@ -0,0 +1,7 @@ +<http://example.org/anno5> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno5> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno5> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/photo1> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b0 <http://purl.org/dc/elements/1.1/format> "text/html" . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "<p>j'adore !</p>" . +_:b0 <http://purl.org/dc/elements/1.1/language> "fr" . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno6.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno6.json new file mode 100644 index 00000000000..9ae0d88eaee --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno6.json @@ -0,0 +1,7 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno6", + "type":"Annotation", + "bodyValue": "Comment text", + "target": "http://example.org/target1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno6.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno6.nt new file mode 100644 index 00000000000..4d99f2a8ced --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno6.nt @@ -0,0 +1,3 @@ +<http://example.org/anno6> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/target1> . +<http://example.org/anno6> <http://www.w3.org/ns/oa#bodyValue> "Comment text" . +<http://example.org/anno6> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno7.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno7.json new file mode 100644 index 00000000000..9f821d22fb2 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno7.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno7", + "type":"Annotation", + "body": { + "type": "TextualBody", + "value": "Comment text", + "format": "text/plain" + }, + "target": "http://example.org/target1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno7.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno7.nt new file mode 100644 index 00000000000..79707fade81 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno7.nt @@ -0,0 +1,6 @@ +<http://example.org/anno7> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/target1> . +<http://example.org/anno7> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno7> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Comment text" . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b0 <http://purl.org/dc/elements/1.1/format> "text/plain" . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno8.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno8.json new file mode 100644 index 00000000000..3187af65746 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno8.json @@ -0,0 +1,6 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno8", + "type": "Annotation", + "target": "http://example.org/ebook1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno8.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno8.nt new file mode 100644 index 00000000000..72188231a95 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno8.nt @@ -0,0 +1,2 @@ +<http://example.org/anno8> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno8> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/ebook1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno9.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno9.json new file mode 100644 index 00000000000..8d72da3563f --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno9.json @@ -0,0 +1,16 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/anno9", + "type": "Annotation", + "body": [ + "http://example.org/description1", + { + "type": "TextualBody", + "value": "tag1" + } + ], + "target": [ + "http://example.org/image1", + "http://example.org/image2" + ] +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno9.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno9.nt new file mode 100644 index 00000000000..16f583209b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/anno9.nt @@ -0,0 +1,7 @@ +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "tag1" . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasBody> <http://example.org/description1> . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasBody> _:b0 . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/image2> . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/image1> . +<http://example.org/anno9> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/collection1.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/collection1.json new file mode 100644 index 00000000000..e3a5d80c129 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/collection1.json @@ -0,0 +1,618 @@ + +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/collection1", + "type": "AnnotationCollection", + "creator": "http://www.w3.org/", + "label": "Annotation Examples", + "total": 41, + "first": { + "id": "http://example.org/collection1/page1", + "type": "AnnotationPage", + "startIndex": 0, + "items": [ + { + "id": "http://example.org/anno1", + "type": "Annotation", + "body": "http://example.org/post1", + "target": "http://example.com/page1" + }, + { + "id": "http://example.org/anno2", + "type": "Annotation", + "body": { + "id": "http://example.org/analysis1.mp3", + "format": "audio/mpeg", + "language": "fr" + }, + "target": { + "id": "http://example.gov/patent1.pdf", + "format": "application/pdf", + "language": ["en", "ar"], + "textDirection": "ltr", + "processingLanguage": "en" + } + }, + { + "id": "http://example.org/anno3", + "type": "Annotation", + "body": { + "id": "http://example.org/video1", + "type": "Video" + }, + "target": { + "id": "http://example.org/website1", + "type": "Text" + } + }, + { + "id": "http://example.org/anno4", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "id": "http://example.com/image1#xywh=100,100,300,300", + "type": "Image", + "format": "image/jpeg" + } + }, + { + "id": "http://example.org/anno5", + "type":"Annotation", + "body": { + "type" : "TextualBody", + "value" : "<p>j'adore !</p>", + "format" : "text/html", + "language" : "fr" + }, + "target": "http://example.org/photo1" + }, + { + "id": "http://example.org/anno6", + "type":"Annotation", + "bodyValue": "Comment text", + "target": "http://example.org/target1" + }, + { + "id": "http://example.org/anno7", + "type":"Annotation", + "body": { + "type": "TextualBody", + "value": "Comment text", + "format": "text/plain" + }, + "target": "http://example.org/target1" + }, + { + "id": "http://example.org/anno8", + "type": "Annotation", + "target": "http://example.org/ebook1" + }, + { + "id": "http://example.org/anno9", + "type": "Annotation", + "body": [ + "http://example.org/description1", + { + "type": "TextualBody", + "value": "tag1" + } + ], + "target": [ + "http://example.org/image1", + "http://example.org/image2" + ] + }, + { + "id": "http://example.org/anno10", + "type": "Annotation", + "body": { + "type": "Choice", + "items": [ + { + "id": "http://example.org/note1", + "language": "en" + }, + { + "id": "http://example.org/note2", + "language": "fr" + } + ] + }, + "target": "http://example.org/website1" + }, + { + "id": "http://example.org/anno11", + "type": "Annotation", + "motivation": "commenting", + "body": { + "type": "TextualBody", + "value": "These pages together provide evidence of the conspiracy" + }, + "target": { + "type": "Composite", + "items": [ + "http://example.com/page1", + "http://example.org/page6", + "http://example.net/page4" + ] + } + }, + { + "id": "http://example.org/anno12", + "type": "Annotation", + "motivation": "tagging", + "body": { + "type": "TextualBody", + "value": "important" + }, + "target": { + "type": "List", + "items": [ + "http://example.com/book/page1", + "http://example.com/book/page2", + "http://example.com/book/page3", + "http://example.com/book/page4" + ] + } + }, + { + "id": "http://example.org/anno13", + "type": "Annotation", + "motivation": "classifying", + "body": "http://example.org/vocab/art/portrait", + "target": { + "type": "Independents", + "items": [ + "http://example.com/image1", + "http://example.net/image2", + "http://example.com/image4", + "http://example.org/image9" + ] + } + }, + { + "id": "http://example.org/anno14", + "type": "Annotation", + "creator": "http://example.org/user1", + "created": "2015-01-28T12:00:00Z", + "modified": "2015-01-29T09:00:00Z", + "generator": "http://example.org/client1", + "generated": "2015-02-04T12:00:00Z", + "body": { + "id": "http://example.net/review1", + "creator": "http://example.net/user2", + "created": "2014-06-02T17:00:00Z" + }, + "target": "http://example.com/restaurant1" + }, + { + "id": "http://example.org/anno15", + "type": "Annotation", + "creator": { + "id": "http://example.org/user1", + "type": "Person", + "name": "My Pseudonym", + "nickname": "pseudo", + "email_sha1": "58bad08927902ff9307b621c54716dcc5083e339" + }, + "generator": { + "id": "http://example.org/client1", + "type": "Software", + "name": "Code v2.1", + "homepage": "http://example.org/client1/homepage1" + }, + "body": "http://example.net/review1", + "target": "http://example.com/restaurant1" + }, + { + "id": "http://example.org/anno16", + "type": "Annotation", + "audience": { + "id": "http://example.edu/roles/teacher", + "type": "schema:EducationalAudience", + "schema:educationalRole": "teacher" + }, + "body": "http://example.net/classnotes1", + "target": "http://example.com/textbook1" + }, + { + "id": "http://example.org/anno17", + "type": "Annotation", + "motivation": "commenting", + "body": "http://example.net/comment1", + "target": { + "id": "http://example.com/video1", + "type": "Video", + "accessibility": "captions" + } + }, + { + "id": "http://example.org/anno18", + "type": "Annotation", + "motivation": "bookmarking", + "body": [ + { + "type": "TextualBody", + "value": "readme", + "purpose": "tagging" + }, + { + "type": "TextualBody", + "value": "A good description of the topic that bears further investigation", + "purpose": "describing" + } + ], + "target": "http://example.com/page1" + }, + { + "id": "http://example.org/anno19", + "type": "Annotation", + "rights": "https://creativecommons.org/publicdomain/zero/1.0/", + "body": { + "id": "http://example.net/review1", + "rights": "http://creativecommons.org/licenses/by-nc/4.0/" + }, + "target": "http://example.com/product1" + }, + { + "id": "http://example.org/anno20", + "type": "Annotation", + "canonical": "urn:uuid:dbfb1861-0ecf-41ad-be94-a584e5c4f1df", + "via": "http://other.example.org/anno1", + "body": { + "id": "http://example.net/review1", + "rights": "http://creativecommons.org/licenses/by/4.0/" + }, + "target": "http://example.com/product1" + }, + { + "id": "http://example.org/anno21", + "type": "Annotation", + "body": { + "type": "SpecificResource", + "purpose": "tagging", + "source": "http://example.org/city1" + }, + "target": { + "id": "http://example.org/photo1", + "type": "Image" + } + }, + { + "id": "http://example.org/anno22", + "type": "Annotation", + "body": { + "source": "http://example.org/page1", + "selector": "http://example.org/paraselector1" + }, + "target": { + "source": "http://example.com/dataset1", + "selector": "http://example.org/dataselector1" + } + }, + { + "id": "http://example.org/anno23", + "type": "Annotation", + "body": { + "source": "http://example.org/video1", + "purpose": "describing", + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "t=30,60" + } + }, + "target": "http://example.org/image1" + }, + { + "id": "http://example.org/anno24", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1.html", + "selector": { + "type": "CssSelector", + "value": "#elemid > .elemclass + p" + } + } + }, + { + "id": "http://example.org/anno25", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1.html", + "selector": { + "type": "XPathSelector", + "value": "/html/body/p[2]/table/tr[2]/td[3]/span" + } + } + }, + { + "id": "http://example.org/anno26", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/page1", + "selector": { + "type": "TextQuoteSelector", + "exact": "anotation", + "prefix": "this is an ", + "suffix": " that has some" + } + } + }, + { + "id": "http://example.org/anno27", + "type": "Annotation", + "body": "http://example.org/review1", + "target": { + "source": "http://example.org/ebook1", + "selector": { + "type": "TextPositionSelector", + "start": 412, + "end": 795 + } + } + }, + { + "id": "http://example.org/anno28", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/diskimg1", + "selector": { + "type": "DataPositionSelector", + "start": 4096, + "end": 4104 + } + } + }, + { + "id": "http://example.org/anno29", + "type": "Annotation", + "body": "http://example.org/road1", + "target": { + "source": "http://example.org/map1", + "selector": { + "id": "http://example.org/svg1", + "type": "SvgSelector" + } + } + }, + { + "id": "http://example.org/anno30", + "type": "Annotation", + "body": "http://example.org/road1", + "target": { + "source": "http://example.org/map1", + "selector": { + "type": "SvgSelector", + "value": "<svg:svg> ... </svg:svg>" + } + } + }, + { + "id": "http://example.org/anno31", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/page1.html", + "selector": { + "type": "RangeSelector", + "startSelector": { + "type": "XPathSelector", + "value": "//table[1]/tr[1]/td[2]" + }, + "endSelector": { + "type": "XPathSelector", + "value": "//table[1]/tr[1]/td[4]" + } + } + } + }, + { + "id": "http://example.org/anno32", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/page1", + "selector": { + "type": "FragmentSelector", + "value": "para5", + "refinedBy": { + "type": "TextQuoteSelector", + "exact": "Selected Text", + "prefix": "text before the ", + "suffix": " and text after it" + } + } + } + }, + { + "id": "http://example.org/anno33", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1", + "state": { + "id": "http://example.org/state1" + } + } + }, + { + "id": "http://example.org/anno34", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/page1", + "state": { + "type": "TimeState", + "cached": "http://archive.example.org/copy1", + "sourceDate": "2015-07-20T13:30:00Z" + } + } + }, + { + "id": "http://example.org/anno35", + "type": "Annotation", + "body": "http://example.org/description1", + "target": { + "source": "http://example.org/resource1", + "state": { + "type": "HttpRequestState", + "value": "Accept: application/pdf" + } + } + }, + { + "id": "http://example.org/anno36", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/ebook1", + "state": { + "type": "TimeState", + "sourceDate": "2016-02-01T12:05:23Z", + "refinedBy": { + "type": "HttpRequestState", + "value": "Accept: application/pdf", + "refinedBy": { + "type": "FragmentSelector", + "value": "page=10", + "conformsTo": "http://tools.ietf.org/rfc/rfc3778" + } + } + } + } + }, + { + "id": "http://example.org/anno37", + "type": "Annotation", + "stylesheet": "http://example.org/style1", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.org/document1", + "styleClass": "red" + } + }, + { + "id": "http://example.org/anno38", + "type": "Annotation", + "stylesheet": { + "type": "CssStylesheet", + "value": ".red { color: red }" + }, + "body": "http://example.org/body1", + "target": { + "source": "http://example.org/target1", + "styleClass": "red" + } + }, + { + "id": "http://example.org/anno39", + "type": "Annotation", + "body": "http://example.org/comment1", + "target": { + "source": "http://example.edu/article.pdf", + "selector": "http://example.org/selectors/html-selector1", + "renderedVia": { + "id": "http://example.com/pdf-to-html-library", + "type": "Software", + "schema:softwareVersion": "2.5" + } + } + }, + { + "id": "http://example.org/anno40", + "type": "Annotation", + "body": "http://example.org/note1", + "target": { + "source": "http://example.org/image1", + "scope": "http://example.org/page1" + } + }, + { + "id": "http://example.org/anno41", + "type": "Annotation", + "motivation": "commenting", + "creator": { + "id": "http://example.org/user1", + "type": "Person", + "name": "A. Person", + "nickname": "user1" + }, + "created": "2015-10-13T13:00:00Z", + "generator": { + "id": "http://example.org/client1", + "type": "Software", + "name": "Code v2.1", + "homepage": "http://example.org/homepage1" + }, + "generated": "2015-10-14T15:13:28Z", + "stylesheet": { + "id": "http://example.org/stylesheet1", + "type": "CssStylesheet" + }, + "body": [ + { + "type": "TextualBody", + "purpose": "tagging", + "value": "love" + }, + { + "type": "Choice", + "items": [ + { + "type": "TextualBody", + "purpose": "describing", + "value": "I really love this particular bit of text in this XML. No really.", + "format": "text/plain", + "language": "en", + "creator": "http://example.org/user1" + }, + { + "type": "SpecificResource", + "purpose": "describing", + "source": { + "id": "http://example.org/comment1", + "type": "Audio", + "format": "audio/mpeg", + "language": "de", + "creator": { + "id": "http://example.org/user2", + "type": "Person" + } + } + } + ] + } + ], + "target": { + "type": "SpecificResource", + "styleClass": "mystyle", + "source": "http://example.com/document1", + "state": [ + { + "type": "HttpRequestState", + "value": "Accept: application/xml", + "refinedBy": { + "type": "TimeState", + "sourceDate": "2015-09-25T12:00:00Z" + } + } + ], + "selector": { + "type": "FragmentSelector", + "value": "xpointer(/doc/body/section[2]/para[1])", + "refinedBy": { + "type": "TextPositionSelector", + "start": 6, + "end": 27 + } + } + } + } + ] + } +} diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/collection1.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/collection1.nt new file mode 100644 index 00000000000..4aa2fc29e34 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/collection1.nt @@ -0,0 +1,462 @@ +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno4> . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 . +<http://example.org/anno11> <http://www.w3.org/ns/oa#hasTarget> _:b18 . +<http://example.org/anno11> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#commenting> . +<http://example.org/anno11> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno11> <http://www.w3.org/ns/oa#hasBody> _:b17 . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno5> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b6 . +_:b37 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno16> . +_:b37 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b38 . +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/page1> . +<http://example.org/anno1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasBody> <http://example.org/post1> . +_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno6> . +_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b7 . +_:b15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/note2> . +_:b15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno2> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 . +_:b17 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "These pages together provide evidence of the conspiracy" . +_:b17 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b35 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno14> . +_:b35 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b36 . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/image2> . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/image1> . +<http://example.org/anno9> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasBody> <http://example.org/description1> . +<http://example.org/anno9> <http://www.w3.org/ns/oa#hasBody> _:b11 . +<http://example.org/anno13> <http://www.w3.org/ns/oa#hasTarget> _:b30 . +<http://example.org/anno13> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#classifying> . +<http://example.org/anno13> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno13> <http://www.w3.org/ns/oa#hasBody> <http://example.org/vocab/art/portrait> . +_:b23 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "important" . +_:b23 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +<http://example.org/anno7> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/target1> . +<http://example.org/anno7> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno7> <http://www.w3.org/ns/oa#hasBody> _:b8 . +<http://example.org/anno3> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/website1> . +<http://example.org/anno3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno3> <http://www.w3.org/ns/oa#hasBody> <http://example.org/video1> . +_:b31 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/image1> . +_:b31 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b32 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno3> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/homepage> <http://example.org/client1/homepage1> . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/homepage> <http://example.org/homepage1> . +<http://example.org/client1> <http://xmlns.com/foaf/0.1/name> "Code v2.1" . +<http://example.org/client1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#Application> . +<http://example.org/note1> <http://purl.org/dc/elements/1.1/language> "en" . +<http://example.org/video1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/MovingImage> . +_:b5 <http://purl.org/dc/elements/1.1/language> "fr" . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "<p>j'adore !</p>" . +_:b5 <http://purl.org/dc/elements/1.1/format> "text/html" . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno1> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 . +_:b60 <http://www.w3.org/ns/oa#prefix> "this is an " . +_:b60 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextQuoteSelector> . +_:b60 <http://www.w3.org/ns/oa#exact> "anotation" . +_:b60 <http://www.w3.org/ns/oa#suffix> " that has some" . +_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Comment text" . +_:b8 <http://purl.org/dc/elements/1.1/format> "text/plain" . +_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +<http://example.org/website1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/Text> . +_:b41 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "A good description of the topic that bears further investigation" . +_:b41 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b41 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +<http://example.net/review1> <http://purl.org/dc/terms/creator> <http://example.net/user2> . +<http://example.net/review1> <http://purl.org/dc/terms/rights> <http://creativecommons.org/licenses/by-nc/4.0/> . +<http://example.net/review1> <http://purl.org/dc/terms/rights> <http://creativecommons.org/licenses/by/4.0/> . +<http://example.net/review1> <http://purl.org/dc/terms/created> "2014-06-02T17:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/collection1> <http://purl.org/dc/terms/creator> <http://www.w3.org/> . +<http://example.org/collection1> <http://www.w3.org/ns/activitystreams#totalItems> "41"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +<http://example.org/collection1> <http://www.w3.org/ns/activitystreams#first> <http://example.org/collection1/page1> . +<http://example.org/collection1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#OrderedCollection> . +<http://example.org/collection1> <http://www.w3.org/2000/01/rdf-schema#label> "Annotation Examples" . +<http://example.org/analysis1.mp3> <http://purl.org/dc/elements/1.1/language> "fr" . +<http://example.org/analysis1.mp3> <http://purl.org/dc/elements/1.1/format> "audio/mpeg" . +<http://example.org/collection1/page1> <http://www.w3.org/ns/activitystreams#startIndex> "0"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +<http://example.org/collection1/page1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . +<http://example.org/collection1/page1> <http://www.w3.org/ns/activitystreams#items> _:b0 . +_:b11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "tag1" . +_:b11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b20 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/page6> . +_:b20 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b21 . +_:b111 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#HttpRequestState> . +_:b111 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Accept: application/xml" . +_:b111 <http://www.w3.org/ns/oa#refinedBy> _:b112 . +_:b70 <http://www.w3.org/ns/oa#hasSource> <http://example.org/map1> . +_:b70 <http://www.w3.org/ns/oa#hasSelector> _:b71 . +_:b91 <http://www.w3.org/ns/oa#sourceDate> "2016-02-01T12:05:23Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +_:b91 <http://www.w3.org/ns/oa#refinedBy> _:b92 . +_:b91 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TimeState> . +_:b28 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page4> . +_:b28 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b83 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno34> . +_:b83 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b86 . +<http://example.org/anno12> <http://www.w3.org/ns/oa#hasTarget> _:b24 . +<http://example.org/anno12> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#tagging> . +<http://example.org/anno12> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno12> <http://www.w3.org/ns/oa#hasBody> _:b23 . +<http://example.org/user2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . +_:b84 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b84 <http://www.w3.org/ns/oa#hasState> _:b85 . +<http://example.org/anno4> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/image1#xywh=100,100,300,300> . +<http://example.org/anno4> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno4> <http://www.w3.org/ns/oa#hasBody> <http://example.org/description1> . +_:b89 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno36> . +_:b89 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b94 . +<http://example.org/anno6> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/target1> . +<http://example.org/anno6> <http://www.w3.org/ns/oa#bodyValue> "Comment text" . +<http://example.org/anno6> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/svg1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SvgSelector> . +_:b18 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Composite> . +_:b18 <http://www.w3.org/ns/activitystreams#items> _:b19 . +<http://example.gov/patent1.pdf> <http://www.w3.org/ns/oa#textDirection> <http://www.w3.org/ns/oa#ltrDirection> . +<http://example.gov/patent1.pdf> <http://purl.org/dc/elements/1.1/language> "ar" . +<http://example.gov/patent1.pdf> <http://purl.org/dc/elements/1.1/language> "en" . +<http://example.gov/patent1.pdf> <http://purl.org/dc/elements/1.1/format> "application/pdf" . +<http://example.gov/patent1.pdf> <http://www.w3.org/ns/oa#processingLanguage> "en" . +_:b74 <http://www.w3.org/ns/oa#hasEndSelector> _:b76 . +_:b74 <http://www.w3.org/ns/oa#hasStartSelector> _:b75 . +_:b74 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#RangeSelector> . +<http://example.org/anno36> <http://www.w3.org/ns/oa#hasTarget> _:b90 . +<http://example.org/anno36> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno36> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +_:b66 <http://www.w3.org/ns/oa#end> "4104"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b66 <http://www.w3.org/ns/oa#start> "4096"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b66 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#DataPositionSelector> . +_:b63 <http://www.w3.org/ns/oa#end> "795"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b63 <http://www.w3.org/ns/oa#start> "412"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b63 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextPositionSelector> . +_:b36 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno15> . +_:b36 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b37 . +_:b30 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Independents> . +_:b30 <http://www.w3.org/ns/activitystreams#items> _:b31 . +_:b33 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/image4> . +_:b33 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b34 . +_:b76 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "//table[1]/tr[1]/td[4]" . +_:b76 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#XPathSelector> . +_:b65 <http://www.w3.org/ns/oa#hasSource> <http://example.org/diskimg1> . +_:b65 <http://www.w3.org/ns/oa#hasSelector> _:b66 . +<http://example.org/anno32> <http://www.w3.org/ns/oa#hasTarget> _:b78 . +<http://example.org/anno32> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno32> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +_:b27 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page3> . +_:b27 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b28 . +<http://example.org/anno31> <http://www.w3.org/ns/oa#hasTarget> _:b73 . +<http://example.org/anno31> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno31> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +_:b26 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page2> . +_:b26 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b27 . +<http://example.org/note2> <http://purl.org/dc/elements/1.1/language> "fr" . +_:b24 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#List> . +_:b24 <http://www.w3.org/ns/activitystreams#items> _:b25 . +_:b54 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "#elemid > .elemclass + p" . +_:b54 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#CssSelector> . +_:b34 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/image9> . +_:b34 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b77 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno32> . +_:b77 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b81 . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/mbox_sha1sum> "58bad08927902ff9307b621c54716dcc5083e339" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/name> "My Pseudonym" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/name> "A. Person" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/nick> "user1" . +<http://example.org/user1> <http://xmlns.com/foaf/0.1/nick> "pseudo" . +<http://example.org/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . +<http://example.org/anno33> <http://www.w3.org/ns/oa#hasTarget> _:b82 . +<http://example.org/anno33> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno33> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +<http://example.org/anno21> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/photo1> . +<http://example.org/anno21> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno21> <http://www.w3.org/ns/oa#hasBody> _:b45 . +<http://example.org/anno35> <http://www.w3.org/ns/oa#hasTarget> _:b87 . +<http://example.org/anno35> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno35> <http://www.w3.org/ns/oa#hasBody> <http://example.org/description1> . +_:b103 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno41> . +_:b103 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b97 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> ".red { color: red }" . +_:b97 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#CssStyle> . +<http://example.org/anno39> <http://www.w3.org/ns/oa#hasTarget> _:b100 . +<http://example.org/anno39> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno39> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +_:b49 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno23> . +_:b49 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b52 . +<http://example.org/anno41> <http://purl.org/dc/terms/creator> <http://example.org/user1> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#hasTarget> _:b110 . +<http://example.org/anno41> <http://purl.org/dc/terms/issued> "2015-10-14T15:13:28Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#commenting> . +<http://example.org/anno41> <http://purl.org/dc/terms/created> "2015-10-13T13:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#styledBy> <http://example.org/stylesheet1> . +<http://example.org/anno41> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno41> <http://www.w3.org/ns/oa#hasBody> _:b105 . +<http://example.org/anno41> <http://www.w3.org/ns/oa#hasBody> _:b104 . +<http://example.org/anno41> <http://www.w3.org/ns/activitystreams#generator> <http://example.org/client1> . +_:b73 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1.html> . +_:b73 <http://www.w3.org/ns/oa#hasSelector> _:b74 . +_:b40 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "readme" . +_:b40 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#tagging> . +_:b40 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b67 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno29> . +_:b67 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b69 . +<http://example.org/photo1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/StillImage> . +_:b50 <http://www.w3.org/ns/oa#hasSource> <http://example.org/video1> . +_:b50 <http://www.w3.org/ns/oa#hasSelector> _:b51 . +_:b50 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b78 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b78 <http://www.w3.org/ns/oa#hasSelector> _:b79 . +_:b94 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno37> . +_:b94 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b96 . +_:b105 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Choice> . +_:b105 <http://www.w3.org/ns/activitystreams#items> _:b106 . +_:b102 <http://www.w3.org/ns/oa#hasSource> <http://example.org/image1> . +_:b102 <http://www.w3.org/ns/oa#hasScope> <http://example.org/page1> . +<http://example.org/anno40> <http://www.w3.org/ns/oa#hasTarget> _:b102 . +<http://example.org/anno40> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno40> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +<http://example.org/anno19> <http://purl.org/dc/terms/rights> <https://creativecommons.org/publicdomain/zero/1.0/> . +<http://example.org/anno19> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/product1> . +<http://example.org/anno19> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno19> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +_:b114 <http://www.w3.org/ns/oa#end> "27"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b114 <http://www.w3.org/ns/oa#start> "6"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b114 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextPositionSelector> . +_:b99 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno39> . +_:b99 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b101 . +<http://example.com/video1> <http://schema.org/accessibilityFeature> "captions" . +<http://example.com/video1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/MovingImage> . +_:b82 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b82 <http://www.w3.org/ns/oa#hasState> <http://example.org/state1> . +_:b95 <http://www.w3.org/ns/oa#hasSource> <http://example.org/document1> . +_:b95 <http://www.w3.org/ns/oa#styleClass> "red" . +_:b101 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno40> . +_:b101 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b103 . +_:b93 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "page=10" . +_:b93 <http://purl.org/dc/terms/conformsTo> <http://tools.ietf.org/rfc/rfc3778> . +_:b93 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +<http://example.org/anno18> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/page1> . +<http://example.org/anno18> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#bookmarking> . +<http://example.org/anno18> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno18> <http://www.w3.org/ns/oa#hasBody> _:b40 . +<http://example.org/anno18> <http://www.w3.org/ns/oa#hasBody> _:b41 . +<http://example.org/anno17> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/video1> . +<http://example.org/anno17> <http://www.w3.org/ns/oa#motivatedBy> <http://www.w3.org/ns/oa#commenting> . +<http://example.org/anno17> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno17> <http://www.w3.org/ns/oa#hasBody> <http://example.net/comment1> . +_:b58 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno26> . +_:b58 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b61 . +_:b61 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno27> . +_:b61 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b64 . +_:b85 <http://www.w3.org/ns/oa#sourceDate> "2015-07-20T13:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +_:b85 <http://www.w3.org/ns/oa#cachedSource> <http://archive.example.org/copy1> . +_:b85 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TimeState> . +<http://example.org/anno23> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/image1> . +<http://example.org/anno23> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno23> <http://www.w3.org/ns/oa#hasBody> _:b50 . +<http://example.com/image1#xywh=100,100,300,300> <http://purl.org/dc/elements/1.1/format> "image/jpeg" . +<http://example.com/image1#xywh=100,100,300,300> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/StillImage> . +_:b81 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno33> . +_:b81 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b83 . +_:b88 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#HttpRequestState> . +_:b88 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Accept: application/pdf" . +_:b57 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "/html/body/p[2]/table/tr[2]/td[3]/span" . +_:b57 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#XPathSelector> . +_:b55 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno25> . +_:b55 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b58 . +_:b72 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno31> . +_:b72 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b77 . +_:b47 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b47 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/paraselector1> . +<http://example.org/anno34> <http://www.w3.org/ns/oa#hasTarget> _:b84 . +<http://example.org/anno34> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno34> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +<http://example.org/anno24> <http://www.w3.org/ns/oa#hasTarget> _:b53 . +<http://example.org/anno24> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno24> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +_:b104 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "love" . +_:b104 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#tagging> . +_:b104 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b22 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno12> . +_:b22 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b29 . +_:b109 <http://www.w3.org/ns/oa#hasSource> <http://example.org/comment1> . +_:b109 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b109 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SpecificResource> . +_:b29 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno13> . +_:b29 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b35 . +_:b43 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno20> . +_:b43 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b44 . +<http://example.org/anno30> <http://www.w3.org/ns/oa#hasTarget> _:b70 . +<http://example.org/anno30> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno30> <http://www.w3.org/ns/oa#hasBody> <http://example.org/road1> . +_:b52 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno24> . +_:b52 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b55 . +<http://example.org/anno5> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/photo1> . +<http://example.org/anno5> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno5> <http://www.w3.org/ns/oa#hasBody> _:b5 . +<http://example.org/anno16> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/textbook1> . +<http://example.org/anno16> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno16> <http://schema.org/audience> <http://example.edu/roles/teacher> . +<http://example.org/anno16> <http://www.w3.org/ns/oa#hasBody> <http://example.net/classnotes1> . +_:b19 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/page1> . +_:b19 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b20 . +<http://example.org/anno22> <http://www.w3.org/ns/oa#hasTarget> _:b48 . +<http://example.org/anno22> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno22> <http://www.w3.org/ns/oa#hasBody> _:b47 . +_:b13 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Choice> . +_:b13 <http://www.w3.org/ns/activitystreams#items> _:b14 . +_:b32 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.net/image2> . +_:b32 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b33 . +_:b80 <http://www.w3.org/ns/oa#prefix> "text before the " . +_:b80 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextQuoteSelector> . +_:b80 <http://www.w3.org/ns/oa#exact> "Selected Text" . +_:b80 <http://www.w3.org/ns/oa#suffix> " and text after it" . +_:b48 <http://www.w3.org/ns/oa#hasSource> <http://example.com/dataset1> . +_:b48 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/dataselector1> . +<http://example.org/comment1> <http://purl.org/dc/terms/creator> <http://example.org/user2> . +<http://example.org/comment1> <http://purl.org/dc/elements/1.1/language> "de" . +<http://example.org/comment1> <http://purl.org/dc/elements/1.1/format> "audio/mpeg" . +<http://example.org/comment1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/dc/dcmitype/Sound> . +_:b113 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "xpointer(/doc/body/section[2]/para[1])" . +_:b113 <http://www.w3.org/ns/oa#refinedBy> _:b114 . +_:b113 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +<http://example.org/anno38> <http://www.w3.org/ns/oa#hasTarget> _:b98 . +<http://example.org/anno38> <http://www.w3.org/ns/oa#styledBy> _:b97 . +<http://example.org/anno38> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno38> <http://www.w3.org/ns/oa#hasBody> <http://example.org/body1> . +_:b69 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno30> . +_:b69 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b72 . +_:b45 <http://www.w3.org/ns/oa#hasSource> <http://example.org/city1> . +_:b45 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#tagging> . +_:b45 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SpecificResource> . +<http://example.org/anno29> <http://www.w3.org/ns/oa#hasTarget> _:b68 . +<http://example.org/anno29> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno29> <http://www.w3.org/ns/oa#hasBody> <http://example.org/road1> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#via> <http://other.example.org/anno1> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/product1> . +<http://example.org/anno20> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno20> <http://www.w3.org/ns/oa#canonical> <urn:uuid:dbfb1861-0ecf-41ad-be94-a584e5c4f1df> . +_:b44 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno21> . +_:b44 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b46 . +_:b92 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#HttpRequestState> . +_:b92 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "Accept: application/pdf" . +_:b92 <http://www.w3.org/ns/oa#refinedBy> _:b93 . +<http://example.org/anno37> <http://www.w3.org/ns/oa#hasTarget> _:b95 . +<http://example.org/anno37> <http://www.w3.org/ns/oa#styledBy> <http://example.org/style1> . +<http://example.org/anno37> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno37> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/stylesheet1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#CssStyle> . +_:b112 <http://www.w3.org/ns/oa#sourceDate> "2015-09-25T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +_:b112 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TimeState> . +_:b100 <http://www.w3.org/ns/oa#hasSource> <http://example.edu/article.pdf> . +_:b100 <http://www.w3.org/ns/oa#renderedVia> <http://example.com/pdf-to-html-library> . +_:b100 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/selectors/html-selector1> . +_:b71 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "<svg:svg> ... </svg:svg>" . +_:b71 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SvgSelector> . +_:b108 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b109 . +_:b108 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b68 <http://www.w3.org/ns/oa#hasSource> <http://example.org/map1> . +_:b68 <http://www.w3.org/ns/oa#hasSelector> <http://example.org/svg1> . +<http://example.com/pdf-to-html-library> <http://schema.org/softwareVersion> "2.5" . +<http://example.com/pdf-to-html-library> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#Application> . +<http://example.edu/roles/teacher> <http://schema.org/educationalRole> "teacher" . +<http://example.edu/roles/teacher> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/EducationalAudience> . +<http://example.org/anno14> <http://purl.org/dc/terms/creator> <http://example.org/user1> . +<http://example.org/anno14> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/restaurant1> . +<http://example.org/anno14> <http://purl.org/dc/terms/issued> "2015-02-04T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno14> <http://purl.org/dc/terms/created> "2015-01-28T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno14> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno14> <http://purl.org/dc/terms/modified> "2015-01-29T09:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> . +<http://example.org/anno14> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno14> <http://www.w3.org/ns/activitystreams#generator> <http://example.org/client1> . +_:b107 <http://purl.org/dc/terms/creator> <http://example.org/user1> . +_:b107 <http://purl.org/dc/elements/1.1/language> "en" . +_:b107 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "I really love this particular bit of text in this XML. No really." . +_:b107 <http://www.w3.org/ns/oa#hasPurpose> <http://www.w3.org/ns/oa#describing> . +_:b107 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#TextualBody> . +_:b107 <http://purl.org/dc/elements/1.1/format> "text/plain" . +_:b98 <http://www.w3.org/ns/oa#hasSource> <http://example.org/target1> . +_:b98 <http://www.w3.org/ns/oa#styleClass> "red" . +_:b42 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno19> . +_:b42 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b43 . +_:b90 <http://www.w3.org/ns/oa#hasSource> <http://example.org/ebook1> . +_:b90 <http://www.w3.org/ns/oa#hasState> _:b91 . +_:b87 <http://www.w3.org/ns/oa#hasSource> <http://example.org/resource1> . +_:b87 <http://www.w3.org/ns/oa#hasState> _:b88 . +_:b79 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "para5" . +_:b79 <http://www.w3.org/ns/oa#refinedBy> _:b80 . +_:b79 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +_:b110 <http://www.w3.org/ns/oa#hasSource> <http://example.com/document1> . +_:b110 <http://www.w3.org/ns/oa#hasSelector> _:b113 . +_:b110 <http://www.w3.org/ns/oa#hasState> _:b111 . +_:b110 <http://www.w3.org/ns/oa#styleClass> "mystyle" . +_:b110 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#SpecificResource> . +_:b96 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno38> . +_:b96 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b99 . +_:b14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/note1> . +_:b14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b15 . +_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno8> . +_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b10 . +_:b25 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/book/page1> . +_:b25 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b26 . +_:b38 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno17> . +_:b38 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b39 . +<http://example.org/anno25> <http://www.w3.org/ns/oa#hasTarget> _:b56 . +<http://example.org/anno25> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno25> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +<http://example.org/anno26> <http://www.w3.org/ns/oa#hasTarget> _:b59 . +<http://example.org/anno26> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno26> <http://www.w3.org/ns/oa#hasBody> <http://example.org/comment1> . +<http://example.org/anno8> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/ebook1> . +<http://example.org/anno8> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +_:b16 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno11> . +_:b16 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b22 . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno7> . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b9 . +_:b53 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1.html> . +_:b53 <http://www.w3.org/ns/oa#hasSelector> _:b54 . +_:b106 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b107 . +_:b106 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b108 . +_:b51 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "t=30,60" . +_:b51 <http://purl.org/dc/terms/conformsTo> <http://www.w3.org/TR/media-frags/> . +_:b51 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#FragmentSelector> . +<http://example.org/anno15> <http://purl.org/dc/terms/creator> <http://example.org/user1> . +<http://example.org/anno15> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/restaurant1> . +<http://example.org/anno15> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno15> <http://www.w3.org/ns/oa#hasBody> <http://example.net/review1> . +<http://example.org/anno15> <http://www.w3.org/ns/activitystreams#generator> <http://example.org/client1> . +<http://example.org/anno28> <http://www.w3.org/ns/oa#hasTarget> _:b65 . +<http://example.org/anno28> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno28> <http://www.w3.org/ns/oa#hasBody> <http://example.org/note1> . +_:b39 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno18> . +_:b39 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b42 . +<http://example.org/anno10> <http://www.w3.org/ns/oa#hasTarget> <http://example.org/website1> . +<http://example.org/anno10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno10> <http://www.w3.org/ns/oa#hasBody> _:b13 . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasTarget> <http://example.gov/patent1.pdf> . +<http://example.org/anno2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasBody> <http://example.org/analysis1.mp3> . +_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno9> . +_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b12 . +_:b62 <http://www.w3.org/ns/oa#hasSource> <http://example.org/ebook1> . +_:b62 <http://www.w3.org/ns/oa#hasSelector> _:b63 . +_:b12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno10> . +_:b12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b16 . +_:b64 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno28> . +_:b64 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b67 . +_:b46 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno22> . +_:b46 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b49 . +_:b59 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1> . +_:b59 <http://www.w3.org/ns/oa#hasSelector> _:b60 . +_:b75 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "//table[1]/tr[1]/td[2]" . +_:b75 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#XPathSelector> . +<http://example.org/anno27> <http://www.w3.org/ns/oa#hasTarget> _:b62 . +<http://example.org/anno27> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno27> <http://www.w3.org/ns/oa#hasBody> <http://example.org/review1> . +_:b86 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno35> . +_:b86 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b89 . +_:b21 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.net/page4> . +_:b21 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b56 <http://www.w3.org/ns/oa#hasSource> <http://example.org/page1.html> . +_:b56 <http://www.w3.org/ns/oa#hasSelector> _:b57 . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example41.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example41.json new file mode 100644 index 00000000000..0f5a4759efe --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example41.json @@ -0,0 +1,10 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/collection1", + "type": "AnnotationCollection", + "label": "Steampunk Annotations", + "creator": "http://example.com/publisher", + "total": 42023, + "first": "http://example.org/page1", + "last": "http://example.org/page42" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example41.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example41.nt new file mode 100644 index 00000000000..7d44e9be237 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example41.nt @@ -0,0 +1,6 @@ +<http://example.org/collection1> <http://www.w3.org/ns/activitystreams#last> <http://example.org/page42> . +<http://example.org/collection1> <http://www.w3.org/ns/activitystreams#first> <http://example.org/page1> . +<http://example.org/collection1> <http://www.w3.org/ns/activitystreams#totalItems> "42023"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +<http://example.org/collection1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#OrderedCollection> . +<http://example.org/collection1> <http://www.w3.org/2000/01/rdf-schema#label> "Steampunk Annotations" . +<http://example.org/collection1> <http://purl.org/dc/terms/creator> <http://example.com/publisher> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example42.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example42.json new file mode 100644 index 00000000000..15306a55690 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example42.json @@ -0,0 +1,22 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/page1", + "type": "AnnotationPage", + "partOf": "http://example.org/collection1", + "next": "http://example.org/page2", + "startIndex": 0, + "items": [ + { + "id": "http://example.org/anno1", + "type": "Annotation", + "body": "http://example.net/comment1", + "target": "http://example.com/book/chapter1" + }, + { + "id": "http://example.org/anno2", + "type": "Annotation", + "body": "http://example.net/comment2", + "target": "http://example.com/book/chapter2" + } + ] +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example42.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example42.nt new file mode 100644 index 00000000000..9d8934d991f --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example42.nt @@ -0,0 +1,15 @@ +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasBody> <http://example.net/comment1> . +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/book/chapter1> . +<http://example.org/anno1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#partOf> <http://example.org/collection1> . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#items> _:b0 . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#next> <http://example.org/page2> . +<http://example.org/page1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#startIndex> "0"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno2> . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasBody> <http://example.net/comment2> . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/book/chapter2> . +<http://example.org/anno2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno1> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example43.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example43.json new file mode 100644 index 00000000000..15306a55690 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example43.json @@ -0,0 +1,22 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "http://example.org/page1", + "type": "AnnotationPage", + "partOf": "http://example.org/collection1", + "next": "http://example.org/page2", + "startIndex": 0, + "items": [ + { + "id": "http://example.org/anno1", + "type": "Annotation", + "body": "http://example.net/comment1", + "target": "http://example.com/book/chapter1" + }, + { + "id": "http://example.org/anno2", + "type": "Annotation", + "body": "http://example.net/comment2", + "target": "http://example.com/book/chapter2" + } + ] +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example43.nt b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example43.nt new file mode 100644 index 00000000000..16b8b3bc185 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/correct/example43.nt @@ -0,0 +1,15 @@ +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno2> . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 . +_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/anno1> . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#partOf> <http://example.org/collection1> . +<http://example.org/page1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/activitystreams#OrderedCollectionPage> . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#next> <http://example.org/page2> . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#items> _:b0 . +<http://example.org/page1> <http://www.w3.org/ns/activitystreams#startIndex> "0"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> . +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasBody> <http://example.net/comment1> . +<http://example.org/anno1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno1> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/book/chapter1> . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasBody> <http://example.net/comment2> . +<http://example.org/anno2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/oa#Annotation> . +<http://example.org/anno2> <http://www.w3.org/ns/oa#hasTarget> <http://example.com/book/chapter2> . diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno1.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno1.json new file mode 100644 index 00000000000..8c8155222d3 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno1.json @@ -0,0 +1 @@ +this is not json
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno10.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno10.json new file mode 100644 index 00000000000..23927866055 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno10.json @@ -0,0 +1,7 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "no target", + "body": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno11.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno11.json new file mode 100644 index 00000000000..183a6bfd344 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno11.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad target", + "body": "http://example.org/post1", + "target": 9 +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno12.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno12.json new file mode 100644 index 00000000000..4d6e66730db --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno12.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad body", + "body": "this is not a uri", + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno13.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno13.json new file mode 100644 index 00000000000..714b58fa7ba --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno13.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad body id", + "body": { + "id": "this is not a uri either", + "format": "text/plain", + "langauage": "en" }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno14.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno14.json new file mode 100644 index 00000000000..984cf1c33b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno14.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad format", + "body": { + "id": "http://example.com/1", + "format": 6, + "langauage": "en" }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno15.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno15.json new file mode 100644 index 00000000000..1ec07d34c58 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno15.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad language", + "body": { + "id": "http://example.com/1", + "format": "text/plain", + "langauage": 3 }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno16.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno16.json new file mode 100644 index 00000000000..83abbc3eca4 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno16.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad text direction", + "body": { + "id": "http://example.com/1", + "format": "text/plain", + "textDirection": "squirrel" }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno17.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno17.json new file mode 100644 index 00000000000..40e5bfb6d6e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno17.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "no value for textual body", + "body": { + "type": "TextualBody", + "format": "text/plain" + }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno18.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno18.json new file mode 100644 index 00000000000..d8ac1edcda0 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno18.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad value for textual body", + "body": { + "type": "TextualBody", + "format": "text/plain", + "value": ["this should", "not have", "multiple values"] + }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno19.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno19.json new file mode 100644 index 00000000000..14dc133e27d --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno19.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "body and bodyValue", + "body": { + "type": "TextualBody", + "format": "text/plain", + "value": "body" + }, + "bodyValue": "doppelganger", + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno2.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno2.json new file mode 100644 index 00000000000..7a73a41bfdf --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno2.json @@ -0,0 +1,2 @@ +{ +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno20.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno20.json new file mode 100644 index 00000000000..66b2f1a3693 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno20.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad bodyValue", + "bodyValue": ["body", "doppelganger"], + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno21.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno21.json new file mode 100644 index 00000000000..37faba142f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno21.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad bodyValue", + "bodyValue": 23, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno22.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno22.json new file mode 100644 index 00000000000..ef1eaf9aab0 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno22.json @@ -0,0 +1,11 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "Too many composite types (choice? list?)", + "body": { + "type": ["Choice", "List"], + "items": ["http://example.com/1", "http://example.com/2"] + }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno23.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno23.json new file mode 100644 index 00000000000..8d5610be4ab --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno23.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "too many processing languages", + "body": { + "id": "http://example.com/1", + "format": "text/plain", + "processingLanguage": ["en", "de"] + }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno24.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno24.json new file mode 100644 index 00000000000..66d088cf5e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno24.json @@ -0,0 +1,12 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad text direction", + "body": { + "id": "http://example.com/1", + "format": "text/plain", + "textDirection": ["ltr","rtl"] + }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno25.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno25.json new file mode 100644 index 00000000000..67346fcd28b --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno25.json @@ -0,0 +1,10 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "Uninterpretable body (choice? list?)", + "body": { + "items": ["http://example.com/1", "http://example.com/2"] + }, + "target": "http://example.org/post1", +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno26.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno26.json new file mode 100644 index 00000000000..2c0c161390e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno26.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad creator", + "creator": 6, + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno27.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno27.json new file mode 100644 index 00000000000..0cd8cc2317d --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno27.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad generator", + "generator": 42, + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno28.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno28.json new file mode 100644 index 00000000000..041fefd2225 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno28.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad created", + "created": "yesterday", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno29.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno29.json new file mode 100644 index 00000000000..ce48fc74c7b --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno29.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad created", + "modified": "an hour ago", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno3.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno3.json new file mode 100644 index 00000000000..7afbb4f25c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno3.json @@ -0,0 +1,6 @@ +{ + "id": "http://example.org/anno1", + "type": "Annotation", + "label": "No context", + "target": "http://example.org/target" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno30.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno30.json new file mode 100644 index 00000000000..fcadc17bc0b --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno30.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad created", + "generated": "now", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno31.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno31.json new file mode 100644 index 00000000000..c857a12b004 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno31.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad created", + "modified": ["2015-01-28T12:00:00Z","2015-01-28T12:00:01Z"], + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno32.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno32.json new file mode 100644 index 00000000000..cccc1accb23 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno32.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad created", + "created": ["2015-01-28T12:00:00Z","2015-01-28T12:00:01Z"], + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno33.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno33.json new file mode 100644 index 00000000000..267dfa4a7d2 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno33.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad created", + "generated": ["2015-01-28T12:00:00Z","2015-01-28T12:00:01Z"], + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno34.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno34.json new file mode 100644 index 00000000000..c81b0fe1392 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno34.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad rights", + "rights": "not a uri", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno35.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno35.json new file mode 100644 index 00000000000..f2f590e8f98 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno35.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad via", + "via": "not a uri", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno36.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno36.json new file mode 100644 index 00000000000..d9bb4afed6c --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno36.json @@ -0,0 +1,9 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "bad canonical", + "canonical": "not a uri", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno37.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno37.json new file mode 100644 index 00000000000..072c5409c4e --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno37.json @@ -0,0 +1,10 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "no source for specific resource", + "body": "http://example.org/post1", + "target": { + "type": "SpecificResource", + } +} diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno38.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno38.json new file mode 100644 index 00000000000..9da7c0b92e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno38.json @@ -0,0 +1,13 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "no value for Fragment Selector", + "body": "http://example.org/post1", + "target": { + "type": "SpecificResource", + "selector": { + "type": "FragmentSelector" + } + } +} diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno39.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno39.json new file mode 100644 index 00000000000..50510f807f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno39.json @@ -0,0 +1,14 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "multiple values for Fragment Selector", + "body": "http://example.org/post1", + "target": { + "type": "SpecificResource", + "selector": { + "type": "FragmentSelector", + "value": ["xxx", "yyy"] + } + } +} diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno4.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno4.json new file mode 100644 index 00000000000..a0aa6b996dd --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno4.json @@ -0,0 +1,7 @@ +{ + "@context": "fish", + "id": "http://example.org/anno1", + "type": "Annotation", + "label": "Bad context", + "target": "http://example.org/target" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno5.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno5.json new file mode 100644 index 00000000000..12afee60224 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno5.json @@ -0,0 +1,9 @@ +{ + "@context": ["http://example.org/not/my/context.json", + "http://example.org/nor/this/one.json" + ], + "id": "http://example.org/anno1", + "type": "Annotation", + "label": "Bad context", + "target": "http://example.org/target" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno6.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno6.json new file mode 100644 index 00000000000..eeb1b2edbb4 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno6.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "not a uri", + "label": "bad id", + "type": "Annotation", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno7.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno7.json new file mode 100644 index 00000000000..68cbff0e223 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno7.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Annotation", + "label": "multiple identifiers", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno8.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno8.json new file mode 100644 index 00000000000..0f284244892 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno8.json @@ -0,0 +1,7 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "label": "no type", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno9.json b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno9.json new file mode 100644 index 00000000000..db0f8caf8a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/samples/incorrect/anno9.json @@ -0,0 +1,8 @@ +{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": ["http://example.org/1", "http://example.org/2"], + "type": "Squirrel", + "label": "bad type", + "body": "http://example.org/post1", + "target": "http://example.com/page1" +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/annotation-vocab/tools/vocab_tester.py b/tests/wpt/web-platform-tests/annotation-vocab/tools/vocab_tester.py new file mode 100644 index 00000000000..873377c517f --- /dev/null +++ b/tests/wpt/web-platform-tests/annotation-vocab/tools/vocab_tester.py @@ -0,0 +1,240 @@ + +# Author: Rob Sanderson (azaroth42@gmail.com) +# License: Apache2 +# Last Modified: 2016-09-02 + +import json +from rdflib import ConjunctiveGraph, URIRef +from pyld import jsonld +from pyld.jsonld import compact, expand, frame, from_rdf, to_rdf, JsonLdProcessor +import urllib + +# Stop code from looking up the contexts online for every operation +docCache = {} + +def fetch(url): + fh = urllib.urlopen(url) + data = fh.read() + fh.close() + return data + +def load_document_and_cache(url): + if docCache.has_key(url): + return docCache[url] + + doc = { + 'contextUrl': None, + 'documentUrl': None, + 'document': '' + } + data = fetch(url) + doc['document'] = data; + docCache[url] = doc + return doc + +jsonld.set_document_loader(load_document_and_cache) + +class Validator(object): + + def __init__(self): + + self.rdflib_class_map = { + "Annotation": "oa:Annotation", + "Dataset": "dctypes:Dataset", + "Image": "dctypes:StillImage", + "Video": "dctypes:MovingImage", + "Audio": "dctypes:Sound", + "Text": "dctypes:Text", + "TextualBody": "oa:TextualBody", + "ResourceSelection": "oa:ResourceSelection", + "SpecificResource": "oa:SpecificResource", + "FragmentSelector": "oa:FragmentSelector", + "CssSelector": "oa:CssSelector", + "XPathSelector": "oa:XPathSelector", + "TextQuoteSelector": "oa:TextQuoteSelector", + "TextPositionSelector": "oa:TextPositionSelector", + "DataPositionSelector": "oa:DataPositionSelector", + "SvgSelector": "oa:SvgSelector", + "RangeSelector": "oa:RangeSelector", + "TimeState": "oa:TimeState", + "HttpState": "oa:HttpRequestState", + "CssStylesheet": "oa:CssStyle", + "Choice": "oa:Choice", + "Composite": "oa:Composite", + "List": "oa:List", + "Independents": "oa:Independents", + "Person": "foaf:Person", + "Software": "as:Application", + "Organization": "foaf:Organization", + "AnnotationCollection": "as:OrderedCollection", + "AnnotationPage": "as:OrderedCollectionPage", + "Audience": "schema:Audience" + } + + + def _clean_bnode_ids(self, js): + new = {} + for (k,v) in js.items(): + if k == 'id' and v.startswith("_:"): + continue + elif type(v) == dict: + # recurse + res = self._clean_bnode_ids(v) + new[k] = res + else: + new[k] = v + return new + + def _mk_rdflib_jsonld(self, js): + # rdflib's json-ld implementation sucks + # Pre-process to make it work + # recurse the structure looking for types, and replacing them. + new = {} + for (k,v) in js.items(): + if k == 'type': + if type(v) == list: + nl = [] + for i in v: + if self.rdflib_class_map.has_key(i): + nl.append(self.rdflib_class_map[i]) + new['type'] = nl + else: + if self.rdflib_class_map.has_key(v): + new['type'] = self.rdflib_class_map[v] + elif type(v) == dict: + # recurse + res = self._mk_rdflib_jsonld(v) + new[k] = res + else: + new[k] = v + return new + + def json_to_rdf(self, js, fmt=None): + d2 = self._mk_rdflib_jsonld(js) + js = json.dumps(d2) + g = ConjunctiveGraph() + g.parse(data=js, format='json-ld') + if fmt: + out = g.serialize(format=fmt) + return out + else: + return g + + def rdf_to_jsonld(self, rdf, fmt): + + g = ConjunctiveGraph() + g.parse(data=rdf, format=fmt) + out = g.serialize(format='json-ld') + + j2 = json.loads(out) + j2 = {"@context": context_js, "@graph": j2} + framed = frame(j2, frame_js) + out = compact(framed, context_js) + # recursively clean blank node ids + #out = self._clean_bnode_ids(out) + return out + + def compact_and_clean(self, js): + newjs = compact(js, context_js) + newjs['@context'] = context + if newjs.has_key("@graph"): + for k,v in newjs['@graph'].items(): + newjs[k] = v + del newjs['@graph'] + return newjs + +validator = Validator() + +example = "https://raw.githubusercontent.com/w3c/web-annotation/gh-pages/model/wd2/examples/correct/anno4.json" +example_ttl = "https://raw.githubusercontent.com/w3c/web-annotation/gh-pages/vocab/wd/examples/correct/anno1.ttl" +context = "http://www.w3.org/ns/anno.jsonld" +frameURI = "https://raw.githubusercontent.com/w3c/web-annotation/gh-pages/jsonld/annotation_frame.jsonld" +# ontology = "https://www.w3.org/ns/oa.ttl" +ontology = "https://raw.githubusercontent.com/w3c/web-annotation/gh-pages/vocab/wd/ontology/oa.ttl" + +data = fetch(context) +context_js = json.loads(data) +data = fetch(example) +example_js = json.loads(data) +data = fetch(frameURI) +frame_js = json.loads(data) + +# Test1: JSON-LD context document can be parsed without errors by JSON-LD validators +# Context document is parsable if it can be loaded and used to expand the example +try: + expanded = expand(example_js, context_js) +except: + print "Context is invalid, failed Test 1" + + +# Test2: JSON-LD context document can be used to convert JSON-LD serialized Annotations into RDF triples. +try: + jsonld_nq = to_rdf(example_js, {"base": "http://example.org/", "format": "application/nquads"}) +except: + print "Cannot use context to convert JSON-LD to NQuads" + + +# Test3: Graphs produced are isomorphic +try: + rl_g = validator.json_to_rdf(example_js) + g = ConjunctiveGraph() + js_g = g.parse(data=jsonld_nq, format="nt") + rl_g_nq = rl_g.serialize(format="nquads") + assert(len(rl_g.store) == len(js_g.store)) + assert(rl_g.isomorphic(js_g)) +except: + print "Different triples from two parsers, or non-isomorphic graphs" + + +# Test4: The graphs produced can be converted back into JSON-LD without loss of information +try: + js = validator.rdf_to_jsonld(jsonld_nq, "nt") + js2 = validator.compact_and_clean(js) + assert(js2 == example_js) +except: + print "Failed to recompact parsed data" + raise + + +# Test5: ontology documents can be parsed without errors by validators +try: + g = ConjunctiveGraph().parse(ontology, format="turtle") +except: + raise + + +# Test6: ontology is internally consistent with respect to domains, ranges, etc + +# step 1: find all the classes. +rdftype = URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#type") +rdfsdomain = URIRef("http://www.w3.org/2000/01/rdf-schema#domain") +rdfsrange = URIRef("http://www.w3.org/2000/01/rdf-schema#range") +rdfsresource = URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#Resource") +rdfssco = URIRef("http://www.w3.org/2000/01/rdf-schema#subClassOf") +asColl = URIRef("http://www.w3.org/ns/activitystreams#OrderedCollection") +skosConcept = URIRef("http://www.w3.org/2004/02/skos/core#Concept") + +otherClasses = [asColl, skosConcept] +classes = list(g.subjects(rdftype, URIRef("http://www.w3.org/2000/01/rdf-schema#Class"))) +props = list(g.subjects(rdftype, URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"))) + +for p in props: + domains = list(g.objects(p, rdfsdomain)) + for d in domains: + assert(d in classes) + +for p in props: + ranges = list(g.objects(p, rdfsrange)) + for r in ranges: + if not r in classes and not str(r).startswith("http://www.w3.org/2001/XMLSchema#") and \ + not r == rdfsresource: + print "Found inconsistent property: %s has unknown range" % p + +for c in classes: + parents = list(g.objects(c, rdfssco)) + for p in parents: + if not p in classes and not p in otherClasses: + print "Found inconsistent class: %s has unknown superClass" % c + + +print "Done." diff --git a/tests/wpt/web-platform-tests/auxclick/OWNERS b/tests/wpt/web-platform-tests/auxclick/OWNERS new file mode 100644 index 00000000000..fe0105ee965 --- /dev/null +++ b/tests/wpt/web-platform-tests/auxclick/OWNERS @@ -0,0 +1 @@ +@NavidZ diff --git a/tests/wpt/web-platform-tests/auxclick/auxclick_event-manual.html b/tests/wpt/web-platform-tests/auxclick/auxclick_event-manual.html new file mode 100644 index 00000000000..786ebfaaebb --- /dev/null +++ b/tests/wpt/web-platform-tests/auxclick/auxclick_event-manual.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Clicking with primary vs non-primary buttons</title> + <link rel="help" href="https://wicg.github.io/auxclick/"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <style> +#target { + background-color: green; + height: 200px; + width: 200px; +} + </style> + </head> + <body> + <h1>Clicking with primary vs non-primary buttons</h1> + <p>Double-click on the green box with a non-primary button. When using mouse any button other than the left button is non-primary. If a "PASS" result appears, the test passes; otherwise, it fails.</p> + <div id="target"></div> + <script> + var test_auxclick = async_test("auxclick event sequence received."); + var target = document.querySelector('#target'); + document.addEventListener('contextmenu', event => { event.preventDefault(); }); + ['click', 'dblclick'].forEach(eventName => { + target.addEventListener(eventName, () => { + test_auxclick.step(() => { + assert_unreached(eventName + ' event should not be dispatched for non-primary buttons.'); + }); + }); + document.addEventListener(eventName, () => { + test_auxclick.step(() => { + assert_unreached('document should not receive ' + eventName + ' for non-primary buttons.'); + }); + }, true); + }); + var click_count = 0; + var events = []; + ['mousedown', 'mouseup'].forEach(eventName => { + target.addEventListener(eventName, event => { + events.push(event.type); + }); + }); + target.addEventListener('auxclick', event => { + events.push(event.type); + click_count++; + if (click_count==1) { + test (() => { + assert_equals(event.detail, click_count, 'detail attribute of auxclick should be the click count.'); + }, "First auxclick should have detail=1 indicating the fire click"); + } else { + test (() => { + assert_equals(event.detail, click_count, 'detail attribute of auxclick should be the click count.'); + }, "Second auxclick should have detail=2 indicating the fire click"); + test_auxclick.step(() => { + assert_array_equals(events, ['mousedown', 'mouseup', 'auxclick', 'mousedown', 'mouseup', 'auxclick'], + 'There should be two auxclick events for a non-primary button double click each preceded by one mousemove and one mouseup'); + assert_equals(event.detail, click_count, 'detail attribute of auxclick should be the click count.'); + }); + test_auxclick.done(); + } + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/check_stability.py b/tests/wpt/web-platform-tests/check_stability.py index 7b707212158..421f8cb1820 100644 --- a/tests/wpt/web-platform-tests/check_stability.py +++ b/tests/wpt/web-platform-tests/check_stability.py @@ -14,6 +14,7 @@ import zipfile from cStringIO import StringIO from collections import defaultdict from urlparse import urljoin +from tools.manifest import manifest import requests @@ -27,7 +28,6 @@ reader = None wptcommandline = None wptrunner = None - logger = logging.getLogger(os.path.splitext(__file__)[0]) @@ -89,13 +89,14 @@ class TravisFold(object): class GitHub(object): - def __init__(self, org, repo, token): + def __init__(self, org, repo, token, browser): self.token = token self.headers = {"Accept": "application/vnd.github.v3+json"} self.auth = (self.token, "x-oauth-basic") self.org = org self.repo = repo self.base_url = "https://api.github.com/repos/%s/%s/" % (org, repo) + self.browser = browser def _headers(self, headers): if headers is None: @@ -117,6 +118,19 @@ class GitHub(object): resp.raise_for_status() return resp + def patch(self, url, data, headers=None): + logger.debug("PATCH %s" % url) + if data is not None: + data = json.dumps(data) + resp = requests.patch( + url, + data=data, + headers=self._headers(headers), + auth=self.auth + ) + resp.raise_for_status() + return resp + def get(self, url, headers=None): logger.debug("GET %s" % url) resp = requests.get( @@ -128,8 +142,19 @@ class GitHub(object): return resp def post_comment(self, issue_number, body): - url = urljoin(self.base_url, "issues/%s/comments" % issue_number) - return self.post(url, {"body": body}) + user = self.get(urljoin(self.base_url, "/user")).json() + issue_comments_url = urljoin(self.base_url, "issues/%s/comments" % issue_number) + comments = self.get(issue_comments_url).json() + title_line = "# %s #" % self.browser.title() + data = {"body": body} + for comment in comments: + if (comment["user"]["login"] == user["login"] and + comment["body"].startswith(title_line)): + comment_url = urljoin(self.base_url, "issues/comments/%s" % comment["id"]) + self.patch(comment_url, data) + break + else: + self.post(issue_comments_url, data) def releases(self): url = urljoin(self.base_url, "releases/latest") @@ -167,7 +192,7 @@ class Firefox(Browser): def install(self): call("pip", "install", "-r", "w3c/wptrunner/requirements_firefox.txt") - resp = get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/firefox-52.0a1.en-US.linux-x86_64.tar.bz2") + resp = get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/firefox-53.0a1.en-US.linux-x86_64.tar.bz2") untar(resp.raw) if not os.path.exists("profiles"): @@ -192,7 +217,6 @@ class Firefox(Browser): assert latest_release != 0 return "v%s.%s.%s" % tuple(str(item) for item in latest_release) - def install_webdriver(self): version = self._latest_geckodriver_version() logger.debug("Latest geckodriver release %s" % version) @@ -244,7 +268,13 @@ def get(url): def call(*args): logger.debug("%s" % " ".join(args)) - return subprocess.check_output(args) + try: + return subprocess.check_output(args) + except subprocess.CalledProcessError as e: + logger.critical("%s exited with return code %i" % + (e.cmd, e.returncode)) + logger.critical(e.output) + raise def get_git_cmd(repo_path): @@ -288,7 +318,7 @@ def unzip(fileobj): def setup_github_logging(args): gh_handler = None if args.comment_pr: - github = GitHub("w3c", "web-platform-tests", args.gh_token) + github = GitHub("w3c", "web-platform-tests", args.gh_token, args.browser) try: pr_number = int(args.comment_pr) except ValueError: @@ -326,6 +356,7 @@ def get_sha1(): git = get_git_cmd(os.path.join(os.path.abspath(os.curdir), "w3c", "web-platform-tests")) return git("rev-parse", "HEAD").strip() + def build_manifest(): with pwd(os.path.join(os.path.abspath(os.curdir), "w3c", "web-platform-tests")): # TODO: Call the manifest code directly @@ -353,6 +384,52 @@ def get_files_changed(): for item in files[:-1].split("\0")] +def get_affected_testfiles(files_changed): + affected_testfiles = [] + all_tests = set() + nontests_changed = set(files_changed) + repo_root = os.path.abspath(os.path.join(os.path.abspath(os.curdir), "w3c", "web-platform-tests")) + manifest_file = os.path.join(repo_root, "MANIFEST.json") + for test, _ in manifest.load(repo_root, manifest_file): + test_full_path = os.path.join(repo_root, test) + all_tests.add(test_full_path) + if test_full_path in nontests_changed: + # Reduce the set of changed files to only non-tests. + nontests_changed.remove(test_full_path) + for changedfile_pathname in nontests_changed: + changed_file_repo_path = os.path.join(os.path.sep, os.path.relpath(changedfile_pathname, repo_root)) + os.path.normpath(changed_file_repo_path) + path_components = changed_file_repo_path.split(os.sep)[1:] + if len(path_components) < 2: + # This changed file is in the repo root, so skip it + # (because it's not part of any test). + continue + top_level_subdir = path_components[0] + if top_level_subdir in ["conformance-checkers", "docs"]: + continue + # OK, this changed file is the kind we care about: It's something + # other than a test (e.g., it's a .js or .json file), and it's + # somewhere down beneath one of the top-level "spec" directories. + # So now we try to find any tests that reference it. + for root, dirs, fnames in os.walk(os.path.join(repo_root, top_level_subdir)): + # Walk top_level_subdir looking for test files containing either the + # relative filepath or absolute filepatch to the changed file. + for fname in fnames: + testfile_full_path = os.path.join(root, fname) + # Skip any test file that's already in files_changed. + if testfile_full_path in files_changed: + continue + # Skip any file that's not a test file. + if testfile_full_path not in all_tests: + continue + with open(testfile_full_path, "r") as fh: + file_contents = fh.read() + changed_file_relpath = os.path.relpath(changedfile_pathname, root).replace(os.path.sep, "/") + if changed_file_relpath in file_contents or changed_file_repo_path.replace(os.path.sep, "/") in file_contents: + affected_testfiles.append(testfile_full_path) + return affected_testfiles + + def wptrunner_args(root, files_changed, iterations, browser): parser = wptcommandline.create_parser([browser.product]) args = vars(parser.parse_args([])) @@ -442,7 +519,7 @@ def table(headings, data, log): def write_inconsistent(inconsistent, iterations): logger.error("## Unstable results ##\n") strings = [("`%s`" % markdown_adjust(test), ("`%s`" % markdown_adjust(subtest)) if subtest else "", err_string(results, iterations)) - for test, subtest, results in inconsistent] + for test, subtest, results in inconsistent] table(["Test", "Subtest", "Results"], strings, logger.error) @@ -539,6 +616,12 @@ def main(): logger.debug("Files changed:\n%s" % "".join(" * %s\n" % item for item in files_changed)) + affected_testfiles = get_affected_testfiles(files_changed) + + logger.debug("Affected tests:\n%s" % "".join(" * %s\n" % item for item in affected_testfiles)) + + files_changed.extend(affected_testfiles) + browser = browser_cls(args.gh_token) browser.install() diff --git a/tests/wpt/web-platform-tests/clear-site-data/navigation.html b/tests/wpt/web-platform-tests/clear-site-data/navigation.html new file mode 100644 index 00000000000..cd0f83e17f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/clear-site-data/navigation.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html> + <head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/test_utils.js"></script> + </head> + + <body> + <script> + /** Ensures that all datatypes are nonempty. */ + function populateDatatypes() { + return Promise.all(TestUtils.DATATYPES.map(function(datatype) { + return datatype.add().then(datatype.isEmpty().then(function(isEmpty) { + assert_false( + isEmpty, + datatype.name + " has to be nonempty before the test starts."); + })); + })); + } + + /** + * @param Array.<Array.<Datatype>> combination A combination of datatypes. + * @param Dict.<string, boolean> report A map between a datatype name and + * whether it is empty. + * @return boolean Whether all datatypes are empty if and only if they are + * included in the |combination|. + */ + function verifyDatatypes(combination, report) { + TestUtils.DATATYPES.forEach(function(datatype) { + if (combination.indexOf(datatype) != -1) { + assert_true( + report[datatype.name], + datatype.name + " should have been cleared."); + } else { + assert_false( + report[datatype.name], + datatype.name + " should NOT have been cleared."); + } + }) + } + + TestUtils.COMBINATIONS.forEach(function(combination) { + var test_name = + "Clear datatypes on navigation: " + + combination.map(function(e) { return e.name; }).join(", "); + + promise_test(function(test) { + return populateDatatypes() + .then(function() { + // Navigate to a resource with a Clear-Site-Data header in an + // iframe, then verify that the correct types have been deleted. + return new Promise(function(resolve, reject) { + window.addEventListener("message", resolve); + var iframe = document.createElement("iframe"); + iframe.src = TestUtils.getClearSiteDataUrl(combination); + document.body.appendChild(iframe); + }).then(function(messageEvent) { + verifyDatatypes(combination, messageEvent.data); + }); + }); + }, test_name); + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py b/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py new file mode 100644 index 00000000000..e8ec8d55327 --- /dev/null +++ b/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py @@ -0,0 +1,40 @@ +import json + +RESPONSE = """ +<!DOCTYPE html> +<html> + <head> + <title>Clear-Site-Data</title> + <script src="test_utils.js"></script> + </head> + <body> + <script> + /** + * A map between a datatype name and whether it is empty. + * @property Object.<string, boolean> + */ + var report = {}; + + Promise.all(TestUtils.DATATYPES.map(function(datatype) { + return datatype.isEmpty().then(function(isEmpty) { + report[datatype.name] = isEmpty; + }); + })).then(function() { + window.top.postMessage(report, "*"); + }); + </script> + </body> +</html> +""" + +# A support server that receives a list of datatypes in the GET query +# and returns a Clear-Site-Data header with those datatypes. The content +# of the response is a html site using postMessage to report the status +# of the datatypes, so that if used in an iframe, it can inform the +# embedder whether the data deletion succeeded. +def main(request, response): + types = [key for key in request.GET.keys()] + header = json.dumps({ "types": types }) + return ([("Clear-Site-Data", header), + ("Content-Type", "text/html")], + RESPONSE) diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js b/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js new file mode 100644 index 00000000000..6aff373f23a --- /dev/null +++ b/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js @@ -0,0 +1,89 @@ +var TestUtils = (function() { + function randomString() { + var result = ""; + for (var i = 0; i < 5; i++) + result += String.fromCharCode(97 + Math.floor(Math.random() * 26)); + return result; + }; + + /** + * Representation of one datatype. + * @typedef Datatype + * @type{object} + * @property{string} name Name of the datatype. + * @method{function():Void} add A function to add an instance of the datatype. + * @method{function():boolean} isEmpty A function that tests whether + * the datatype's storage backend is empty. + */ + var Datatype; + + var TestUtils = {}; + + /** + * All datatypes supported by Clear-Site-Data. + * @param{Array.<Datatype>} + */ + TestUtils.DATATYPES = [ + { + "name": "cookies", + "add": function() { + return new Promise(function(resolve, reject) { + document.cookie = randomString() + "=" + randomString(); + resolve(); + }); + }, + "isEmpty": function() { + return new Promise(function(resolve, reject) { + resolve(!document.cookie); + }); + } + }, + { + "name": "storage", + "add": function() { + return new Promise(function(resolve, reject) { + localStorage.setItem(randomString(), randomString()); + resolve(); + }); + }, + "isEmpty": function() { + return new Promise(function(resolve, reject) { + resolve(!localStorage.length); + }); + } + } + ]; + + /** + * All possible combinations of datatypes. + * @property {Array.<Array.<Datatype>>} + */ + TestUtils.COMBINATIONS = (function() { + var combinations = []; + for (var mask = 0; mask < (1 << TestUtils.DATATYPES.length); mask++) { + var combination = []; + + for (var datatype = 0; + datatype < TestUtils.DATATYPES.length; datatype++) { + if (mask & (1 << datatype)) + combination.push(TestUtils.DATATYPES[datatype]); + } + + combinations.push(combination); + } + return combinations; + })(); + + /** + * Get the support server URL that returns a Clear-Site-Data header + * to clear |datatypes|. + * @param{Array.<Datatype>} datatypes The list of datatypes to be deleted. + * @return string The URL to be queried. + */ + TestUtils.getClearSiteDataUrl = function(datatypes) { + names = datatypes.map(function(e) { return e.name }); + return "support/echo-clear-site-data.py?" + names.join("&"); + } + + return TestUtils; +})(); diff --git a/tests/wpt/web-platform-tests/common/redirect-opt-in.py b/tests/wpt/web-platform-tests/common/redirect-opt-in.py new file mode 100644 index 00000000000..ff5744b1815 --- /dev/null +++ b/tests/wpt/web-platform-tests/common/redirect-opt-in.py @@ -0,0 +1,20 @@ +def main(request, response): + """Simple handler that causes redirection. + + The request should typically have two query parameters: + status - The status to use for the redirection. Defaults to 302. + location - The resource to redirect to. + """ + status = 302 + if "status" in request.GET: + try: + status = int(request.GET.first("status")) + except ValueError: + pass + + response.status = status + + location = request.GET.first("location") + + response.headers.set("Location", location) + response.headers.set("Timing-Allow-Origin", "*") diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest-empty-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest-empty-novalid.html deleted file mode 100644 index 23b82f543ca..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest-empty-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=""> -<meta charset=utf-8> -<title>empty manifest is not valid</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest-whitespace-only-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest-whitespace-only-novalid.html deleted file mode 100644 index d9ee8070a02..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest-whitespace-only-novalid.html +++ /dev/null @@ -1,6 +0,0 @@ -<!DOCTYPE html> -<html manifest=" -"> -<meta charset=utf-8> -<title>empty manifest is not valid</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-backslash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-backslash-novalid.html deleted file mode 100644 index 00259455e15..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-backslash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="#\"> -<meta charset=utf-8> -<title>invalid manifest: fragment-backslash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-hash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-hash-novalid.html deleted file mode 100644 index 09d918e3eaa..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-hash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo/path#f#g"> -<meta charset=utf-8> -<title>invalid manifest: fragment-contains-hash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-pile-of-poo-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-pile-of-poo-isvalid.html deleted file mode 100644 index fffad819a85..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-pile-of-poo-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo#💩"> -<meta charset=utf-8> -<title>valid manifest: fragment-contains-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-question-mark-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-question-mark-isvalid.html deleted file mode 100644 index 19187c700c5..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-contains-question-mark-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo/abcd#foo?bar"> -<meta charset=utf-8> -<title>valid manifest: fragment-contains-question-mark</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-empty-hash-only-no-path-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-empty-hash-only-no-path-relative-isvalid.html deleted file mode 100644 index 27b57ce2372..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-empty-hash-only-no-path-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="#"> -<meta charset=utf-8> -<title>valid manifest: fragment-empty-hash-only-no-path-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-leading-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-leading-space-novalid.html deleted file mode 100644 index c150d0835bb..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-leading-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:21/b# e"> -<meta charset=utf-8> -<title>invalid manifest: fragment-leading-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-non-ascii-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-non-ascii-relative-isvalid.html deleted file mode 100644 index fb991b68e62..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-non-ascii-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="#β"> -<meta charset=utf-8> -<title>valid manifest: fragment-non-ascii-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-semicolon-question-mark-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-semicolon-question-mark-relative-isvalid.html deleted file mode 100644 index ea5b805626e..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-semicolon-question-mark-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="#;?"> -<meta charset=utf-8> -<title>valid manifest: fragment-semicolon-question-mark-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-slash-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-slash-relative-isvalid.html deleted file mode 100644 index 6ce956067fd..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/fragment-slash-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="#/"> -<meta charset=utf-8> -<title>valid manifest: fragment-slash-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-192.0x00A80001-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-192.0x00A80001-isvalid.html deleted file mode 100644 index 345fd9d6408..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-192.0x00A80001-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://192.0x00A80001"> -<meta charset=utf-8> -<title>valid manifest: host-192.0x00A80001</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-broken-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-broken-isvalid.html deleted file mode 100644 index 38865022c0f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-broken-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://192.168.0.257/"> -<meta charset=utf-8> -<title>valid manifest: host-IP-address-broken</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-fullwidth-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-fullwidth-isvalid.html deleted file mode 100644 index 10666ae29d1..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-fullwidth-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://0Xc0.0250.01"> -<meta charset=utf-8> -<title>valid manifest: host-IP-address-fullwidth</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-percent-encoded-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-percent-encoded-isvalid.html deleted file mode 100644 index 200da79baf8..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-IP-address-percent-encoded-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%30%78%63%30%2e%30%32%35%30.01"> -<meta charset=utf-8> -<title>valid manifest: host-IP-address-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-cr-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-cr-novalid.html deleted file mode 100644 index 67825718acd..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-cr-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.
org"> -<meta charset=utf-8> -<title>invalid manifest: host-cr</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-novalid.html deleted file mode 100644 index e18e4216b9a..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%41.com"> -<meta charset=utf-8> -<title>invalid manifest: host-double-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-percent-encoded-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-percent-encoded-novalid.html deleted file mode 100644 index b2f7fb39912..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-percent-encoded-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%ef%bc%85%ef%bc%94%ef%bc%91.com"> -<meta charset=utf-8> -<title>invalid manifest: host-double-percent-encoded-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-novalid.html deleted file mode 100644 index c24cde01edd..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://"> -<meta charset=utf-8> -<title>invalid manifest: host-empty</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-userinfo-empty-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-userinfo-empty-novalid.html deleted file mode 100644 index 36e22f73651..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-userinfo-empty-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://@/www.example.com"> -<meta charset=utf-8> -<title>invalid manifest: host-empty-userinfo-empty</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-with-userinfo-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-with-userinfo-novalid.html deleted file mode 100644 index 80b3f8f076c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-empty-with-userinfo-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://user:pass@/"> -<meta charset=utf-8> -<title>invalid manifest: host-empty-with-userinfo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-exotic-dot-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-exotic-dot-isvalid.html deleted file mode 100644 index fa81d73b01f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-exotic-dot-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://www.foo。bar.com"> -<meta charset=utf-8> -<title>valid manifest: host-exotic-dot</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-exotic-whitespace-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-exotic-whitespace-isvalid.html deleted file mode 100644 index 04d2499cace..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-exotic-whitespace-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://GOOgoo.com"> -<meta charset=utf-8> -<title>valid manifest: host-exotic-whitespace</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-fullwidth-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-fullwidth-isvalid.html deleted file mode 100644 index 9d355c9eac8..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-fullwidth-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://Go.com"> -<meta charset=utf-8> -<title>valid manifest: host-fullwidth</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-hostname-in-brackets-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-hostname-in-brackets-novalid.html deleted file mode 100644 index a651c000396..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-hostname-in-brackets-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://[www.google.com]/"> -<meta charset=utf-8> -<title>invalid manifest: host-hostname-in-brackets</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-idn-unicode-han-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-idn-unicode-han-isvalid.html deleted file mode 100644 index 71e9530f5eb..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-idn-unicode-han-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://你好你好"> -<meta charset=utf-8> -<title>valid manifest: host-idn-unicode-han</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-novalid.html deleted file mode 100644 index d86538bd46a..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://zyx.com"> -<meta charset=utf-8> -<title>invalid manifest: host-invalid-unicode</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-percent-encoded-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-percent-encoded-novalid.html deleted file mode 100644 index c5a3810d492..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-percent-encoded-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%ef%b7%90zyx.com"> -<meta charset=utf-8> -<title>invalid manifest: host-invalid-unicode-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-ipv6-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-ipv6-isvalid.html deleted file mode 100644 index c6cf132922c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-ipv6-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://[2001::1]"> -<meta charset=utf-8> -<title>valid manifest: host-ipv6</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-ipv6-port-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-ipv6-port-isvalid.html deleted file mode 100644 index 18292187adf..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-ipv6-port-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://[2001::1]:80"> -<meta charset=utf-8> -<title>valid manifest: host-ipv6-port</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-is-pile-of-poo-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-is-pile-of-poo-isvalid.html deleted file mode 100644 index a56696d181f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-is-pile-of-poo-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://💩"> -<meta charset=utf-8> -<title>valid manifest: host-is-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-newline-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-newline-novalid.html deleted file mode 100644 index 8b4f8e048da..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-newline-novalid.html +++ /dev/null @@ -1,6 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example. -org"> -<meta charset=utf-8> -<title>invalid manifest: host-newline</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-space-novalid.html deleted file mode 100644 index 53d49012ee4..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example .org"> -<meta charset=utf-8> -<title>invalid manifest: host-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-square-brackets-port-contains-colon-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-square-brackets-port-contains-colon-novalid.html deleted file mode 100644 index cb654811fea..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-square-brackets-port-contains-colon-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://[1::2]:3:4"> -<meta charset=utf-8> -<title>invalid manifest: host-square-brackets-port-contains-colon</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-tab-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-tab-novalid.html deleted file mode 100644 index abc896073db..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-tab-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example .org"> -<meta charset=utf-8> -<title>invalid manifest: host-tab</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-novalid.html deleted file mode 100644 index f1f22dfb2fc..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%00.com"> -<meta charset=utf-8> -<title>invalid manifest: host-u0000-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-percent-encoded-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-percent-encoded-novalid.html deleted file mode 100644 index bc5254117dd..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-percent-encoded-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%ef%bc%85%ef%bc%90%ef%bc%90.com"> -<meta charset=utf-8> -<title>invalid manifest: host-u0000-percent-encoded-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-bare-percent-sign-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-bare-percent-sign-novalid.html deleted file mode 100644 index 39cb890aa76..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-bare-percent-sign-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo%"> -<meta charset=utf-8> -<title>invalid manifest: path-bare-percent-sign</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-colon-colon-number-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-colon-colon-number-relative-isvalid.html deleted file mode 100644 index 9110e619424..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-colon-colon-number-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="::23"> -<meta charset=utf-8> -<title>valid manifest: path-colon-colon-number-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-colon-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-colon-relative-isvalid.html deleted file mode 100644 index 9387fbf07e9..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-colon-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":"> -<meta charset=utf-8> -<title>valid manifest: path-colon-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-contains-pile-of-poo-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-contains-pile-of-poo-isvalid.html deleted file mode 100644 index 7fcc6f644dc..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-contains-pile-of-poo-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http💩//:foo"> -<meta charset=utf-8> -<title>valid manifest: path-contains-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-contains-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-contains-space-novalid.html deleted file mode 100644 index e44c2fbcb85..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-contains-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="/a/ /c"> -<meta charset=utf-8> -<title>invalid manifest: path-contains-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-backslash-at-sign-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-backslash-at-sign-novalid.html deleted file mode 100644 index efc42dfb6b5..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-backslash-at-sign-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo.com/\@"> -<meta charset=utf-8> -<title>invalid manifest: path-leading-backslash-at-sign</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-backslash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-backslash-novalid.html deleted file mode 100644 index 7621629aa46..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-backslash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":\"> -<meta charset=utf-8> -<title>invalid manifest: path-leading-colon-backslash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-backslash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-backslash-novalid.html deleted file mode 100644 index 61407fb5373..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-backslash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":foo.com\"> -<meta charset=utf-8> -<title>invalid manifest: path-leading-colon-chars-backslash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-relative-isvalid.html deleted file mode 100644 index d211906ba90..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":foo.com"> -<meta charset=utf-8> -<title>valid manifest: path-leading-colon-chars-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-colon-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-colon-relative-isvalid.html deleted file mode 100644 index 82d824f61e5..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-colon-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="::"> -<meta charset=utf-8> -<title>valid manifest: path-leading-colon-colon-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-hash-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-hash-relative-isvalid.html deleted file mode 100644 index 8e4165d0346..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-hash-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":#"> -<meta charset=utf-8> -<title>valid manifest: path-leading-colon-hash-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-letter-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-letter-relative-isvalid.html deleted file mode 100644 index d60081dc7fe..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-letter-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":a"> -<meta charset=utf-8> -<title>valid manifest: path-leading-colon-letter-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-number-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-number-relative-isvalid.html deleted file mode 100644 index d89a20bdadc..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-number-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":23"> -<meta charset=utf-8> -<title>valid manifest: path-leading-colon-number-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-slash-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-slash-relative-isvalid.html deleted file mode 100644 index 246fd8028fa..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-slash-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest=":/"> -<meta charset=utf-8> -<title>valid manifest: path-leading-colon-slash-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-space-novalid.html deleted file mode 100644 index e723ed665f0..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-leading-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:21/ b"> -<meta charset=utf-8> -<title>invalid manifest: path-leading-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-non-ascii-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-non-ascii-isvalid.html deleted file mode 100644 index 37ef395ea05..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-non-ascii-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/©zbar"> -<meta charset=utf-8> -<title>valid manifest: path-non-ascii</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-dot-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-dot-isvalid.html deleted file mode 100644 index 855f316cb95..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-dot-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo/%2e"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-dot</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-malformed-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-malformed-novalid.html deleted file mode 100644 index f9bbb42f693..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-malformed-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo/%2e%2"> -<meta charset=utf-8> -<title>invalid manifest: path-percent-encoded-malformed</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-mixed-case-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-mixed-case-isvalid.html deleted file mode 100644 index a8d9c9224b0..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-mixed-case-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/%3A%3a%3C%3c"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-mixed-case</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-multiple-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-multiple-isvalid.html deleted file mode 100644 index 4e9cfb94ef9..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-multiple-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo%41%7a"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-multiple</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-plus-slashes-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-plus-slashes-relative-isvalid.html deleted file mode 100644 index 6e703da5c1f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-plus-slashes-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="/a/%2f/c"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-slash-plus-slashes-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-relative-isvalid.html deleted file mode 100644 index 113fa978adf..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="/a%2fc"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-slash-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-space-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-space-isvalid.html deleted file mode 100644 index 4bf72938b58..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-space-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/%20foo"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0000-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0000-isvalid.html deleted file mode 100644 index 48173a3340a..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0000-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo%00"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-u0000</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0091-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0091-isvalid.html deleted file mode 100644 index 5956032c258..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0091-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo%91"> -<meta charset=utf-8> -<title>valid manifest: path-percent-encoded-u0091</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-relative-square-brackets-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-relative-square-brackets-novalid.html deleted file mode 100644 index 77b5bbc7822..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-relative-square-brackets-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="[61:24:74]:98"> -<meta charset=utf-8> -<title>invalid manifest: path-relative-square-brackets</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-simple-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-simple-relative-isvalid.html deleted file mode 100644 index 88927765855..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-simple-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="/a/b/c"> -<meta charset=utf-8> -<title>valid manifest: path-simple-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-slash-colon-number-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-slash-colon-number-relative-isvalid.html deleted file mode 100644 index e26fd678e46..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-slash-colon-number-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="/:23"> -<meta charset=utf-8> -<title>valid manifest: path-slash-colon-number-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-slash-only-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-slash-only-relative-isvalid.html deleted file mode 100644 index f4094bfde59..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-slash-only-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="/"> -<meta charset=utf-8> -<title>valid manifest: path-slash-only-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-starts-with-pile-of-poo-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-starts-with-pile-of-poo-isvalid.html deleted file mode 100644 index 8c54ac33d68..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-starts-with-pile-of-poo-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="💩http://foo"> -<meta charset=utf-8> -<title>valid manifest: path-starts-with-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-tab-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-tab-novalid.html deleted file mode 100644 index b895139445f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-tab-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo bar"> -<meta charset=utf-8> -<title>invalid manifest: path-tab</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-trailing-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-trailing-space-novalid.html deleted file mode 100644 index 419ef427d3b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-trailing-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:21/b ?"> -<meta charset=utf-8> -<title>invalid manifest: path-trailing-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-u0091-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-u0091-novalid.html deleted file mode 100644 index 66e754ea0d5..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-u0091-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo"> -<meta charset=utf-8> -<title>invalid manifest: path-u0091</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-u202E-u202D-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-u202E-u202D-isvalid.html deleted file mode 100644 index a2073bb1009..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-u202E-u202D-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com//foo//bar"> -<meta charset=utf-8> -<title>valid manifest: path-u202E-u202D</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-uFEFF-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-uFEFF-isvalid.html deleted file mode 100644 index 02d902a2845..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-uFEFF-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com//foo"> -<meta charset=utf-8> -<title>valid manifest: path-uFEFF</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-unicode-han-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-unicode-han-isvalid.html deleted file mode 100644 index d7f33f0698b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/path-unicode-han-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/你好你好"> -<meta charset=utf-8> -<title>valid manifest: path-unicode-han</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-0-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-0-isvalid.html deleted file mode 100644 index bd79085dd7b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-0-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:0/c"> -<meta charset=utf-8> -<title>valid manifest: port-0</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-00000000000000-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-00000000000000-isvalid.html deleted file mode 100644 index ed6136e5d23..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-00000000000000-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:00000000000000/c"> -<meta charset=utf-8> -<title>valid manifest: port-00000000000000</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-00000000000000000000080-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-00000000000000000000080-isvalid.html deleted file mode 100644 index 4bebdf91e3f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-00000000000000000000080-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:00000000000000000000080/c"> -<meta charset=utf-8> -<title>valid manifest: port-00000000000000000000080</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html deleted file mode 100644 index d05e591ed81..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:999999/c"> -<meta charset=utf-8> -<title>invalid manifest: port-999999</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-cr-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-cr-novalid.html deleted file mode 100644 index 9e21524abde..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-cr-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:
/c"> -<meta charset=utf-8> -<title>invalid manifest: port-cr</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-bracket-colon-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-bracket-colon-novalid.html deleted file mode 100644 index 50987282911..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-bracket-colon-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://2001::1]:80"> -<meta charset=utf-8> -<title>invalid manifest: port-leading-colon-bracket-colon</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-novalid.html deleted file mode 100644 index 605becab821..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://2001::1"> -<meta charset=utf-8> -<title>invalid manifest: port-leading-colon</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-dash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-dash-novalid.html deleted file mode 100644 index 01e665bfd67..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-leading-dash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo:-80/"> -<meta charset=utf-8> -<title>invalid manifest: port-leading-dash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-multiple-letters-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-multiple-letters-novalid.html deleted file mode 100644 index b01820a613b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-multiple-letters-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:fifty-two/c"> -<meta charset=utf-8> -<title>invalid manifest: port-multiple-letters</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-newline-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-newline-novalid.html deleted file mode 100644 index 4afb34049a8..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-newline-novalid.html +++ /dev/null @@ -1,6 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f: -/c"> -<meta charset=utf-8> -<title>invalid manifest: port-newline</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-none-but-colon-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-none-but-colon-isvalid.html deleted file mode 100644 index 1138973c4dd..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-none-but-colon-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:/c"> -<meta charset=utf-8> -<title>valid manifest: port-none-but-colon</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-single-letter-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-single-letter-novalid.html deleted file mode 100644 index 69c5a649fe1..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-single-letter-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:b/c"> -<meta charset=utf-8> -<title>invalid manifest: port-single-letter</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-space-novalid.html deleted file mode 100644 index 6c64dd7d81a..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f: /c"> -<meta charset=utf-8> -<title>invalid manifest: port-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-tab-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-tab-novalid.html deleted file mode 100644 index 0c3c9691c8d..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/port-tab-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f: /c"> -<meta charset=utf-8> -<title>invalid manifest: port-tab</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-contains-pile-of-poo-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-contains-pile-of-poo-isvalid.html deleted file mode 100644 index d87dab24702..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-contains-pile-of-poo-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://example.com/foo?💩"> -<meta charset=utf-8> -<title>valid manifest: query-contains-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-contains-question-mark-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-contains-question-mark-isvalid.html deleted file mode 100644 index 6bcfa74c11f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-contains-question-mark-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo/abcd?efgh?ijkl"> -<meta charset=utf-8> -<title>valid manifest: query-contains-question-mark</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-empty-no-path-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-empty-no-path-relative-isvalid.html deleted file mode 100644 index ccf1cd817b8..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-empty-no-path-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="?"> -<meta charset=utf-8> -<title>valid manifest: query-empty-no-path-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-leading-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-leading-space-novalid.html deleted file mode 100644 index 121125a2794..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-leading-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:21/b? d"> -<meta charset=utf-8> -<title>invalid manifest: query-leading-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-trailing-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-trailing-space-novalid.html deleted file mode 100644 index 5580a23fbd5..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/query-trailing-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://f:21/b?d #"> -<meta charset=utf-8> -<title>invalid manifest: query-trailing-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-contains-fragment-haswarn.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-contains-fragment-haswarn.html deleted file mode 100644 index 270fe8bc35a..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-contains-fragment-haswarn.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="data:text/html,test#test"> -<meta charset=utf-8> -<title>manifest warning: scheme-data-contains-fragment</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-no-slash-isvalid.html deleted file mode 100644 index 56853b148ae..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="data:text/plain,foo"> -<meta charset=utf-8> -<title>valid manifest: scheme-data-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-single-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-single-slash-novalid.html deleted file mode 100644 index ddd8293b10b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-data-single-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="data:/example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-data-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-backslash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-backslash-novalid.html deleted file mode 100644 index 3117d0284b8..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-backslash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:c:\foo\bar.html"> -<meta charset=utf-8> -<title>invalid manifest: scheme-file-backslash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-empty-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-empty-isvalid.html deleted file mode 100644 index f51329c0674..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-empty-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:///foo/bar.txt"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-host-empty</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-included-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-included-isvalid.html deleted file mode 100644 index f62e9596539..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-included-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file://server/foo/bar"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-host-included</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-no-slash-isvalid.html deleted file mode 100644 index 3706aaed2b1..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:test"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-scheme-only-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-scheme-only-isvalid.html deleted file mode 100644 index 37ddc808038..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-scheme-only-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-scheme-only</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-c-bar-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-c-bar-novalid.html deleted file mode 100644 index 90700a420e2..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-c-bar-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:/C|/foo/bar"> -<meta charset=utf-8> -<title>invalid manifest: scheme-file-single-slash-c-bar</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-isvalid.html deleted file mode 100644 index ccac15caf1d..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-only-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-only-isvalid.html deleted file mode 100644 index bd2b8514bbe..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-only-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:/"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-slash-only</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-abc-bar-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-abc-bar-isvalid.html deleted file mode 100644 index 2321c0c45db..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-abc-bar-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file://abc|/foo/bar"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-slash-slash-abc-bar</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-c-bar-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-c-bar-isvalid.html deleted file mode 100644 index 0743f63b6ed..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-c-bar-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file://C|/foo/bar"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-slash-slash-c-bar</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-only-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-only-isvalid.html deleted file mode 100644 index 32ac621a3b8..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-only-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file://"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-slash-slash-only</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-slash-only-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-slash-only-isvalid.html deleted file mode 100644 index b4707389417..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-slash-only-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:///"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-slash-slash-slash-only</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-triple-slash-c-bar-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-triple-slash-c-bar-novalid.html deleted file mode 100644 index a511e345edb..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-triple-slash-c-bar-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="file:///C|/foo/bar"> -<meta charset=utf-8> -<title>invalid manifest: scheme-file-triple-slash-c-bar</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-uppercase-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-uppercase-isvalid.html deleted file mode 100644 index 061784e82c7..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-file-uppercase-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="File://foo/bar.html"> -<meta charset=utf-8> -<title>valid manifest: scheme-file-uppercase</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-no-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-no-slash-novalid.html deleted file mode 100644 index 64d78da68c3..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-no-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="ftp:example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-ftp-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-single-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-single-slash-novalid.html deleted file mode 100644 index 40564d9ca99..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-single-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="ftp:/example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-ftp-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-no-slash-isvalid.html deleted file mode 100644 index 02ef1d62654..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="ftps:example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-ftps-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-single-slash-isvalid.html deleted file mode 100644 index 45366356e5e..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="ftps:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-ftps-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-no-slash-isvalid.html deleted file mode 100644 index 38270e19e88..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="gopher:example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-gopher-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-single-slash-isvalid.html deleted file mode 100644 index dfcb01513f9..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="gopher:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-gopher-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-backslash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-backslash-novalid.html deleted file mode 100644 index 1096e1b4c8c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-backslash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http:\\foo.com\"> -<meta charset=utf-8> -<title>invalid manifest: scheme-http-backslash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-colon-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-colon-novalid.html deleted file mode 100644 index de4733f4338..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-colon-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http::@c:29"> -<meta charset=utf-8> -<title>invalid manifest: scheme-http-no-slash-colon</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-novalid.html deleted file mode 100644 index b080bfc8073..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http:foo.com"> -<meta charset=utf-8> -<title>invalid manifest: scheme-http-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-square-bracket-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-square-bracket-novalid.html deleted file mode 100644 index bbf05a5e18e..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-square-bracket-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http:[61:27]/:foo"> -<meta charset=utf-8> -<title>invalid manifest: scheme-http-no-slash-square-bracket</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-single-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-single-slash-novalid.html deleted file mode 100644 index 5268c6061a0..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-http-single-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http:/example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-http-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-https-no-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-https-no-slash-novalid.html deleted file mode 100644 index 591686d950f..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-https-no-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="https:example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-https-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-https-single-slash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-https-single-slash-novalid.html deleted file mode 100644 index edb658d6e12..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-https-single-slash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="https:/example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-https-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-no-slash-malformed-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-no-slash-malformed-novalid.html deleted file mode 100644 index f1a91bbe3c1..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-no-slash-malformed-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="javascript:example.com/"> -<meta charset=utf-8> -<title>invalid manifest: scheme-javascript-no-slash-malformed</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-single-slash-isvalid.html deleted file mode 100644 index 306b7ac94d7..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="javascript:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-javascript-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-no-slash-isvalid.html deleted file mode 100644 index b55c8a8a36b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="mailto:example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-mailto-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-single-slash-isvalid.html deleted file mode 100644 index d29dc5e9a92..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="mailto:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-mailto-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-none-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-none-relative-isvalid.html deleted file mode 100644 index d1a0642c8d4..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-none-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo.com"> -<meta charset=utf-8> -<title>valid manifest: scheme-none-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-isvalid.html deleted file mode 100644 index e0ba7493279..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="a:foo.com"> -<meta charset=utf-8> -<title>valid manifest: scheme-private</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-no-slash-isvalid.html deleted file mode 100644 index 676da6f3ba0..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="madeupscheme:example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-isvalid.html deleted file mode 100644 index c839f760ab4..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo:/bar.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-path</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-chars-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-chars-isvalid.html deleted file mode 100644 index 9881ee4168a..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-chars-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo://///////bar.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-path-leading-slashes-chars</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-colon-slashes-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-colon-slashes-isvalid.html deleted file mode 100644 index 08aeb85c8f7..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-colon-slashes-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo:////://///"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-path-leading-slashes-colon-slashes</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-only-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-only-isvalid.html deleted file mode 100644 index 90aee1d494d..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-only-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo://///////"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-path-leading-slashes-only</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-letter-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-letter-isvalid.html deleted file mode 100644 index 88e344a114c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-letter-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="c:/foo"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-single-letter</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-slash-isvalid.html deleted file mode 100644 index 385ccceac94..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="madeupscheme:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-isvalid.html deleted file mode 100644 index 4f1b38b394c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo:/"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-slash-isvalid.html deleted file mode 100644 index d7444534694..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="foo://"> -<meta charset=utf-8> -<title>valid manifest: scheme-private-slash-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-schemeless-relative-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-schemeless-relative-isvalid.html deleted file mode 100644 index e2eb5fcc691..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-schemeless-relative-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="//foo/bar"> -<meta charset=utf-8> -<title>valid manifest: scheme-schemeless-relative</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-cr-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-cr-novalid.html deleted file mode 100644 index dd9f4173a79..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-cr-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="a:
foo.com"> -<meta charset=utf-8> -<title>invalid manifest: scheme-trailing-cr</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-newline-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-newline-novalid.html deleted file mode 100644 index a7ec3ec3a55..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-newline-novalid.html +++ /dev/null @@ -1,6 +0,0 @@ -<!DOCTYPE html> -<html manifest="a: -foo.com"> -<meta charset=utf-8> -<title>invalid manifest: scheme-trailing-newline</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-space-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-space-novalid.html deleted file mode 100644 index 5118f88b51e..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-space-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="a: foo.com"> -<meta charset=utf-8> -<title>invalid manifest: scheme-trailing-space</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-tab-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-tab-novalid.html deleted file mode 100644 index 200a48c6deb..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-tab-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="a: foo.com"> -<meta charset=utf-8> -<title>invalid manifest: scheme-trailing-tab</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ws-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ws-single-slash-isvalid.html deleted file mode 100644 index e8c33f70941..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-ws-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="ws:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-ws-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-wss-no-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-wss-no-slash-isvalid.html deleted file mode 100644 index 4b60718498c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-wss-no-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="wss:example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-wss-no-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-wss-single-slash-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-wss-single-slash-isvalid.html deleted file mode 100644 index a86f5617f8c..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/scheme-wss-single-slash-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="wss:/example.com/"> -<meta charset=utf-8> -<title>valid manifest: scheme-wss-single-slash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-backslash-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-backslash-novalid.html deleted file mode 100644 index d20219825bb..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-backslash-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://a\b:c\d@foo.com"> -<meta charset=utf-8> -<title>invalid manifest: userinfo-backslash</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-empty-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-empty-isvalid.html deleted file mode 100644 index 82a49feca48..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-empty-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://@www.example.com"> -<meta charset=utf-8> -<title>valid manifest: userinfo-empty</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-host-port-path-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-host-port-path-isvalid.html deleted file mode 100644 index 7ec46ffeaff..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-host-port-path-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://a:b@c:29/d"> -<meta charset=utf-8> -<title>valid manifest: userinfo-host-port-path</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-isvalid.html deleted file mode 100644 index c7008c60e21..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://user:pass@foo:21/bar;par?b#c"> -<meta charset=utf-8> -<title>valid manifest: userinfo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-bad-chars-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-bad-chars-novalid.html deleted file mode 100644 index 3b846b44fc6..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-bad-chars-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://&a:foo(b]c@d:2/"> -<meta charset=utf-8> -<title>invalid manifest: userinfo-password-bad-chars</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-contains-pile-of-poo-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-contains-pile-of-poo-novalid.html deleted file mode 100644 index 6f9774c053b..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-contains-pile-of-poo-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo:💩@example.com"> -<meta charset=utf-8> -<title>invalid manifest: userinfo-password-contains-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-empty-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-empty-isvalid.html deleted file mode 100644 index 51add89dc6e..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-password-empty-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://a:@www.example.com"> -<meta charset=utf-8> -<title>valid manifest: userinfo-password-empty</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-user-empty-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-user-empty-isvalid.html deleted file mode 100644 index 1da26e7edc7..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-user-empty-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://:b@www.example.com"> -<meta charset=utf-8> -<title>valid manifest: userinfo-user-empty</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-at-sign-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-at-sign-novalid.html deleted file mode 100644 index 2856f570442..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-at-sign-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://::@c@d:2"> -<meta charset=utf-8> -<title>invalid manifest: userinfo-username-contains-at-sign</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-percent-encoded-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-percent-encoded-isvalid.html deleted file mode 100644 index fa4a2223a52..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-percent-encoded-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://%25DOMAIN:foobar@foodomain.com"> -<meta charset=utf-8> -<title>valid manifest: userinfo-username-contains-percent-encoded</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-pile-of-poo-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-pile-of-poo-novalid.html deleted file mode 100644 index ce1e91b321d..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-pile-of-poo-novalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://💩:foo@example.com"> -<meta charset=utf-8> -<title>invalid manifest: userinfo-username-contains-pile-of-poo</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-non-alpha-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-non-alpha-isvalid.html deleted file mode 100644 index e5339b98d21..00000000000 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/html/manifest/userinfo-username-non-alpha-isvalid.html +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html manifest="http://foo.com:b@d/"> -<meta charset=utf-8> -<title>valid manifest: userinfo-username-non-alpha</title> -</html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/iframe/model-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/iframe/model-isvalid.html index 45e29ed72ef..f726659dc2c 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/iframe/model-isvalid.html +++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/iframe/model-isvalid.html @@ -16,21 +16,5 @@ src="uri" class="class" lang="en"></iframe></dfn></p> - - <p><dfn>strictly inline - <iframe> - text - </iframe> - </dfn></p> - <p>paragraph - <iframe> - text - </iframe> - </p> - <p><dfn>strictly inline - <iframe> - text - </iframe> - </dfn></p> </body> </html> diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/challenge-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/challenge-novalid.html index 09bb2a096c7..09bb2a096c7 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/challenge-isvalid.html +++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/challenge-novalid.html diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/keytype-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/keytype-novalid.html index a92a32a8644..a92a32a8644 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/keytype-isvalid.html +++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/keytype-novalid.html diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/model-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/model-also-novalid.html index 953ec6ad09c..953ec6ad09c 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/model-isvalid.html +++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/model-also-novalid.html diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/no-attributes-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/no-attributes-novalid.html index ca17832aa67..ca17832aa67 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/no-attributes-isvalid.html +++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/keygen/no-attributes-novalid.html diff --git a/tests/wpt/web-platform-tests/conformance-checkers/messages.json b/tests/wpt/web-platform-tests/conformance-checkers/messages.json index 0ec6b541ff8..b59b14ec996 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/messages.json +++ b/tests/wpt/web-platform-tests/conformance-checkers/messages.json @@ -841,73 +841,6 @@ "html/elements/header/nested-footer-novalid.html": "The element \u201cfooter\u201d must not appear as a descendant of the \u201cheader\u201d element.", "html/elements/header/nested-header-novalid.html": "The element \u201cheader\u201d must not appear as a descendant of the \u201cheader\u201d element.", "html/elements/hr/model-novalid.html": "No \u201cp\u201d element in scope but a \u201cp\u201d end tag seen.", - "html/elements/html/manifest-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Must be non-empty.", - "html/elements/html/manifest-whitespace-only-novalid.html": "Bad value \u201c\t \n\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Must be non-empty.", - "html/elements/html/manifest/fragment-backslash-novalid.html": "Bad value \u201c#\\\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in fragment: \u201c\\\u201d is not allowed.", - "html/elements/html/manifest/fragment-contains-hash-novalid.html": "Bad value \u201chttp://foo/path#f#g\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in fragment: \u201c#\u201d is not allowed.", - "html/elements/html/manifest/fragment-leading-space-novalid.html": "Bad value \u201chttp://f:21/b# e\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in fragment: space is not allowed.", - "html/elements/html/manifest/host-cr-novalid.html": "Bad value \u201chttp://example.\norg\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/host-double-percent-encoded-novalid.html": "Bad value \u201chttp://\uff05\uff14\uff11.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: Illegal character in domain: \u201c%\u201d is not allowed.", - "html/elements/html/manifest/host-double-percent-encoded-percent-encoded-novalid.html": "Bad value \u201chttp://%ef%bc%85%ef%bc%94%ef%bc%91.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: Illegal character in domain: \u201c%\u201d is not allowed.", - "html/elements/html/manifest/host-empty-novalid.html": "Bad value \u201chttp://\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: empty host.", - "html/elements/html/manifest/host-empty-userinfo-empty-novalid.html": "Bad value \u201chttp://@/www.example.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: empty host.", - "html/elements/html/manifest/host-empty-with-userinfo-novalid.html": "Bad value \u201chttp://user:pass@/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: empty host.", - "html/elements/html/manifest/host-hostname-in-brackets-novalid.html": "Bad value \u201chttp://[www.google.com]/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: Illegal character.", - "html/elements/html/manifest/host-invalid-unicode-novalid.html": "Forbidden code point U+fdd0.", - "html/elements/html/manifest/host-invalid-unicode-percent-encoded-novalid.html": "Bad value \u201chttp://%ef%b7%90zyx.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: A label or domain name contains disallowed characters..", - "html/elements/html/manifest/host-newline-novalid.html": "Bad value \u201chttp://example.\norg\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/host-space-novalid.html": "Bad value \u201chttp://example .org\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: Illegal character in domain: space is not allowed.", - "html/elements/html/manifest/host-square-brackets-port-contains-colon-novalid.html": "Bad value \u201chttp://[1::2]:3:4\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", - "html/elements/html/manifest/host-tab-novalid.html": "Bad value \u201chttp://example\t.org\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/host-u0000-percent-encoded-novalid.html": "Bad value \u201chttp://\uff05\uff10\uff10.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: Illegal character in domain: \u201c%\u201d is not allowed.", - "html/elements/html/manifest/host-u0000-percent-encoded-percent-encoded-novalid.html": "Bad value \u201chttp://%ef%bc%85%ef%bc%90%ef%bc%90.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Invalid host: Illegal character in domain: \u201c%\u201d is not allowed.", - "html/elements/html/manifest/path-bare-percent-sign-novalid.html": "Bad value \u201chttp://example.com/foo%\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Percentage (\"%\") is not followed by two hexadecimal digits.", - "html/elements/html/manifest/path-contains-space-novalid.html": "Bad value \u201c/a/ /c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: space is not allowed.", - "html/elements/html/manifest/path-leading-backslash-at-sign-novalid.html": "Bad value \u201chttp://foo.com/\\@\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.", - "html/elements/html/manifest/path-leading-colon-backslash-novalid.html": "Bad value \u201c:\\\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.", - "html/elements/html/manifest/path-leading-colon-chars-backslash-novalid.html": "Bad value \u201c:foo.com\\\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.", - "html/elements/html/manifest/path-leading-space-novalid.html": "Bad value \u201chttp://f:21/ b\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: space is not allowed.", - "html/elements/html/manifest/path-percent-encoded-malformed-novalid.html": "Bad value \u201chttp://example.com/foo/%2e%2\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Percentage (\"%\") is not followed by two hexadecimal digits.", - "html/elements/html/manifest/path-relative-square-brackets-novalid.html": "Bad value \u201c[61:24:74]:98\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: \u201c[\u201d is not allowed.", - "html/elements/html/manifest/path-tab-novalid.html": "Bad value \u201chttp://example.com/foo\tbar\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/path-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b ?\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: space is not allowed.", - "html/elements/html/manifest/path-u0091-novalid.html": "Forbidden code point U+0091.", - "html/elements/html/manifest/port-999999-novalid.html": "Bad value \u201chttp://f:999999/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Port number must be less than 65536.", - "html/elements/html/manifest/port-cr-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/port-leading-colon-bracket-colon-novalid.html": "Bad value \u201chttp://2001::1]:80\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", - "html/elements/html/manifest/port-leading-colon-novalid.html": "Bad value \u201chttp://2001::1\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c:\u201d is not allowed.", - "html/elements/html/manifest/port-leading-dash-novalid.html": "Bad value \u201chttp://foo:-80/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c-\u201d is not allowed.", - "html/elements/html/manifest/port-multiple-letters-novalid.html": "Bad value \u201chttp://f:fifty-two/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201cf\u201d is not allowed.", - "html/elements/html/manifest/port-newline-novalid.html": "Bad value \u201chttp://f:\n/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/port-single-letter-novalid.html": "Bad value \u201chttp://f:b/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201cb\u201d is not allowed.", - "html/elements/html/manifest/port-space-novalid.html": "Bad value \u201chttp://f: /c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in port: \u201c \u201d is not allowed.", - "html/elements/html/manifest/port-tab-novalid.html": "Bad value \u201chttp://f:\t/c\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Tab, new line or carriage return found.", - "html/elements/html/manifest/query-leading-space-novalid.html": "Bad value \u201chttp://f:21/b? d\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in query: space is not allowed.", - "html/elements/html/manifest/query-trailing-space-novalid.html": "Bad value \u201chttp://f:21/b?d #\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in query: space is not allowed.", - "html/elements/html/manifest/scheme-data-contains-fragment-haswarn.html": "Bad value \u201cdata:text/html,test#test\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Fragment is not allowed for data: URIs according to RFC 2397.", - "html/elements/html/manifest/scheme-data-single-slash-novalid.html": "Bad value \u201cdata:/example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a token character or a semicolon but saw \u201c/\u201d instead.", - "html/elements/html/manifest/scheme-file-backslash-novalid.html": "Bad value \u201cfile:c:\\foo\\bar.html\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.", - "html/elements/html/manifest/scheme-file-single-slash-c-bar-novalid.html": "Bad value \u201cfile:/C|/foo/bar\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: \u201c|\u201d is not allowed.", - "html/elements/html/manifest/scheme-file-triple-slash-c-bar-novalid.html": "Bad value \u201cfile:///C|/foo/bar\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in path segment: \u201c|\u201d is not allowed.", - "html/elements/html/manifest/scheme-ftp-no-slash-novalid.html": "Bad value \u201cftp:example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-ftp-single-slash-novalid.html": "Bad value \u201cftp:/example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-http-backslash-novalid.html": "Bad value \u201chttp:\\\\foo.com\\\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-http-no-slash-colon-novalid.html": "Bad value \u201chttp::@c:29\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-http-no-slash-novalid.html": "Bad value \u201chttp:foo.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-http-no-slash-square-bracket-novalid.html": "Bad value \u201chttp:[61:27]/:foo\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-http-single-slash-novalid.html": "Bad value \u201chttp:/example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-https-no-slash-novalid.html": "Bad value \u201chttps:example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-https-single-slash-novalid.html": "Bad value \u201chttps:/example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Expected a slash (\"/\").", - "html/elements/html/manifest/scheme-javascript-no-slash-malformed-novalid.html": "Bad value \u201cjavascript:example.com/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: syntax error", - "html/elements/html/manifest/scheme-trailing-cr-novalid.html": "Bad value \u201ca:\nfoo.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in scheme data: line break is not allowed.", - "html/elements/html/manifest/scheme-trailing-newline-novalid.html": "Bad value \u201ca:\nfoo.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in scheme data: line break is not allowed.", - "html/elements/html/manifest/scheme-trailing-space-novalid.html": "Bad value \u201ca: foo.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in scheme data: space is not allowed.", - "html/elements/html/manifest/scheme-trailing-tab-novalid.html": "Bad value \u201ca:\tfoo.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in scheme data: tab is not allowed.", - "html/elements/html/manifest/userinfo-backslash-novalid.html": "Bad value \u201chttp://a\\b:c\\d@foo.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.", - "html/elements/html/manifest/userinfo-password-bad-chars-novalid.html": "Bad value \u201chttp://&a:foo(b]c@d:2/\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in user or password: \u201c]\u201d is not allowed.", - "html/elements/html/manifest/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.", - "html/elements/html/manifest/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.", - "html/elements/html/manifest/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201cmanifest\u201d on element \u201chtml\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.", "html/elements/i/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.", "html/elements/iframe/model-novalid.html": "The \u201cframeborder\u201d attribute on the \u201ciframe\u201d element is obsolete. Use CSS instead.", "html/elements/iframe/src-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201csrc\u201d on element \u201ciframe\u201d: Bad URL: Must be non-empty.", @@ -1482,13 +1415,17 @@ "html/elements/ins/year-novalid.html": "Bad value \u201c2006\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.", "html/elements/ins/yearless-date-novalid.html": "Bad value \u201c07-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.", "html/elements/kbd/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.", - "html/elements/keygen/id-bad-novalid.html": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.", - "html/elements/keygen/id-missing-novalid.html": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.", - "html/elements/keygen/id-redundant-novalid.html": "The \u201clabel\u201d element may contain at most one \u201cbutton\u201d, \u201cinput\u201d, \u201ckeygen\u201d, \u201cmeter\u201d, \u201coutput\u201d, \u201cprogress\u201d, \u201cselect\u201d, or \u201ctextarea\u201d descendant.", + "html/elements/keygen/challenge-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/id-bad-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/id-missing-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/id-redundant-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", "html/elements/keygen/keytype-bad-value-novalid.html": "Bad value \u201cdsa\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.", "html/elements/keygen/keytype-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.", - "html/elements/keygen/model-novalid.html": "The element \u201ckeygen\u201d must not appear as a descendant of the \u201ca\u201d element.", - "html/elements/keygen/non-void-novalid.html": "Stray end tag \u201ckeygen\u201d.", + "html/elements/keygen/keytype-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/model-also-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/model-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/no-attributes-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", + "html/elements/keygen/non-void-novalid.html": "The \u201ckeygen\u201d element is obsolete. ", "html/elements/label/for-descendant-no-id-novalid.html": "Any \u201cinput\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.", "html/elements/label/multiple-descendants-novalid.html": "The \u201clabel\u201d element may contain at most one \u201cbutton\u201d, \u201cinput\u201d, \u201ckeygen\u201d, \u201cmeter\u201d, \u201coutput\u201d, \u201cprogress\u201d, \u201cselect\u201d, or \u201ctextarea\u201d descendant.", "html/elements/link/href-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Must be non-empty.", @@ -2474,18 +2411,23 @@ "xhtml/elements/img/004-novalid.xhtml": "The element \u201cimg\u201d with the attribute \u201cusemap\u201d must not appear as a descendant of the \u201ca\u201d element.", "xhtml/elements/img/051-novalid.xhtml": "Bad value \u201c-1\u201d for attribute \u201cwidth\u201d on element \u201cimg\u201d: Bad non-negative integer: Expected a digit but saw \u201c-\u201d instead.", "xhtml/elements/input/003-novalid.xhtml": "The \u201clist\u201d attribute of the \u201cinput\u201d element must refer to a \u201cdatalist\u201d element.", - "xhtml/elements/keygen/054-novalid.xhtml": "Text not allowed in element \u201ckeygen\u201d in this context.", + "xhtml/elements/keygen/054-also-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/054-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/055-also-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/056-also-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", "xhtml/elements/keygen/056-novalid.xhtml": "Bad value \u201cdsa\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.", + "xhtml/elements/keygen/057-also-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", "xhtml/elements/keygen/057-novalid.xhtml": "Bad value \u201c\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.", - "xhtml/elements/keygen/058-novalid.xhtml": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.", - "xhtml/elements/keygen/059-novalid.xhtml": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.", - "xhtml/elements/keygen/060-novalid.xhtml": "The \u201clabel\u201d element may contain at most one \u201cbutton\u201d, \u201cinput\u201d, \u201ckeygen\u201d, \u201cmeter\u201d, \u201coutput\u201d, \u201cprogress\u201d, \u201cselect\u201d, or \u201ctextarea\u201d descendant.", - "xhtml/elements/keygen/061-novalid.xhtml": "The element \u201ckeygen\u201d must not appear as a descendant of the \u201ca\u201d element.", - "xhtml/elements/keygen/154-novalid.xhtml": "Text not allowed in element \u201ckeygen\u201d in this context.", + "xhtml/elements/keygen/058-also-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/058-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/059-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/060-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/061-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/154-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", "xhtml/elements/keygen/157-novalid.xhtml": "Bad value \u201c\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.", - "xhtml/elements/keygen/359-novalid.xhtml": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.", - "xhtml/elements/keygen/360-novalid.xhtml": "The \u201clabel\u201d element may contain at most one \u201cbutton\u201d, \u201cinput\u201d, \u201ckeygen\u201d, \u201cmeter\u201d, \u201coutput\u201d, \u201cprogress\u201d, \u201cselect\u201d, or \u201ctextarea\u201d descendant.", - "xhtml/elements/keygen/361-novalid.xhtml": "The element \u201ckeygen\u201d must not appear as a descendant of the \u201ca\u201d element.", + "xhtml/elements/keygen/359-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/360-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", + "xhtml/elements/keygen/361-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ", "xhtml/elements/link/001-novalid.xhtml": "Element \u201clink\u201d is missing required attribute \u201chref\u201d.", "xhtml/elements/menu/001-haswarn.xhtml": "The \u201cmenu\u201d element is not supported in all browsers. Please be sure to test, and consider using a polyfill.", "xhtml/elements/menu/001-novalid.xhtml": "The \u201ccontextmenu\u201d attribute must refer to a \u201cmenu\u201d element.", diff --git a/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py b/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py index 21fd27e3e41..9fe4d3f05ca 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py +++ b/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py @@ -202,7 +202,6 @@ element_attribute_pairs = [ "del cite", "embed src", "form action", - "html manifest", "iframe src", "img src", # srcset is tested elsewhere "input formaction", # type=submit, type=image @@ -235,14 +234,6 @@ def write_novalid_files(): f.write(template + '<title>invalid %s: %s</title>\n' % (attr, desc)) f.write('<%s %s="%s">\n' % (el, attr, url)) f.close() - elif ("html" == el): - f = open(os.path.join(ccdir, "html/elements/html/manifest/%s-novalid.html" % desc), 'wb') - f.write('<!DOCTYPE html>\n') - f.write('<html manifest="%s">\n' % url) - f.write('<meta charset=utf-8>\n') - f.write('<title>invalid manifest: %s</title>\n' % desc) - f.write('</html>\n') - f.close() elif ("img" == el): f = open(os.path.join(ccdir, "html/elements/img/src/%s-novalid.html" % desc), 'wb') f.write(template + '<title>invalid src: %s</title>\n' % desc) @@ -310,14 +301,6 @@ def write_haswarn_files(): f.write(template + '<title>%s warning: %s</title>\n' % (attr, desc)) f.write('<%s %s="%s">\n' % (el, attr, url)) f.close() - elif ("html" == el): - f = open(os.path.join(ccdir, "html/elements/html/manifest/%s-haswarn.html" % desc), 'wb') - f.write('<!DOCTYPE html>\n') - f.write('<html manifest="%s">\n' % url) - f.write('<meta charset=utf-8>\n') - f.write('<title>%s warning: %s</title>\n' % (attr, desc)) - f.write('</html>\n') - f.close() elif ("img" == el): f = open(os.path.join(ccdir, "html/elements/img/src/%s-haswarn.html" % desc), 'wb') f.write(template + '<title>%s warning: %s</title>\n' % (attr, desc)) @@ -416,13 +399,6 @@ def write_isvalid_files(): f.write(template + '<title>valid href: %s</title>\n' % desc) f.write('<base href="%s">\n' % url) f.close() - f = open(os.path.join(ccdir, "html/elements/html/manifest/%s-isvalid.html" % desc), 'wb') - f.write('<!DOCTYPE html>\n') - f.write('<html manifest="%s">\n' % url) - f.write('<meta charset=utf-8>\n') - f.write('<title>valid manifest: %s</title>\n' % desc) - f.write('</html>\n') - f.close() f = open(os.path.join(ccdir, "html/elements/meta/refresh-isvalid.html"), 'wb') f.write(template + '<title>valid meta refresh</title>\n') for desc, url in valid.items(): diff --git a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/054-isvalid.xhtml b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/054-also-novalid.xhtml index b7bcb2021e1..b7bcb2021e1 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/054-isvalid.xhtml +++ b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/054-also-novalid.xhtml diff --git a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/055-isvalid.xhtml b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/055-also-novalid.xhtml index 95cf40f3000..95cf40f3000 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/055-isvalid.xhtml +++ b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/055-also-novalid.xhtml diff --git a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/056-isvalid.xhtml b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/056-also-novalid.xhtml index 979638cf6b5..979638cf6b5 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/056-isvalid.xhtml +++ b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/056-also-novalid.xhtml diff --git a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/057-isvalid.xhtml b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/057-also-novalid.xhtml index 9a42f1f283b..9a42f1f283b 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/057-isvalid.xhtml +++ b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/057-also-novalid.xhtml diff --git a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/058-isvalid.xhtml b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/058-also-novalid.xhtml index 3a4b6c38fd7..3a4b6c38fd7 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/058-isvalid.xhtml +++ b/tests/wpt/web-platform-tests/conformance-checkers/xhtml/elements/keygen/058-also-novalid.xhtml diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html new file mode 100644 index 00000000000..a806caf456f --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Allow-CSP-From header.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "Same origin iframes are always allowed.", + "origin": Host.SAME_ORIGIN, + "csp": "style-src 'unsafe-inline'; script-src 'unsafe-inline'", + "allow_csp_from": "¢¥§", + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": null}, + { "name": "Same origin iframes are allowed even if the Allow-CSP-From is empty.", + "origin": Host.SAME_ORIGIN, + "csp": "style-src 'unsafe-inline'; script-src 'unsafe-inline'", + "allow_csp_from": "", + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": null}, + { "name": "Same origin iframes are allowed even if the Allow-CSP-From is not present.", + "origin": Host.SAME_ORIGIN, + "csp": "style-src 'unsafe-inline'; script-src 'unsafe-inline'", + "allow_csp_from": null, + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": null}, + { "name": "Same origin iframes are allowed even if Allow-CSP-From does not match origin.", + "origin": Host.SAME_ORIGIN, + "csp": "style-src 'unsafe-inline'; script-src 'unsafe-inline'", + "allow_csp_from": "http://example.com:888", + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": null}, + { "name": "Cross origin iframe with an empty Allow-CSP-From header gets blocked.", + "origin": Host.CROSS_ORIGIN, + "csp": "script-src 'unsafe-inline'", + "allow_csp_from": "", + "expected": IframeLoad.EXPECT_BLOCK, + "blockedURI": null}, + { "name": "Cross origin iframe without Allow-CSP-From header gets blocked.", + "origin": Host.CROSS_ORIGIN, + "csp": "script-src 'unsafe-inline'", + "allow_csp_from": null, + "expected": IframeLoad.EXPECT_BLOCK, + "blockedURI": null}, + { "name": "iframe from cross origin does not load without Allow-CSP-From header.", + "origin": Host.CROSS_ORIGIN, + "csp": "style-src 'unsafe-inline'; script-src 'unsafe-inline'", + "allow_csp_from": getOrigin(), + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": null}, + { "name": "Iframe with improper Allow-CSP-From header gets blocked.", + "origin": Host.CROSS_ORIGIN, + "csp": "script-src 'unsafe-inline'", + "allow_csp_from": "* ¢¥§", + "expected": IframeLoad.EXPECT_BLOCK, + "blockedURI": null}, + { "name": "Allow-CSP-From header with a star value can be returned.", + "origin": Host.CROSS_ORIGIN, + "csp": "script-src 'unsafe-inline'", + "allow_csp_from": "*", + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": null}, + { "name": "Star Allow-CSP-From header enforces EmbeddingCSP.", + "origin": Host.CROSS_ORIGIN, + "csp": "script-src 'nonce-123'", + "allow_csp_from": "*", + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": "inline"}, + { "name": "Allow-CSP-From header enforces EmbeddingCSP.", + "origin": Host.CROSS_ORIGIN, + "csp": "style-src 'none'; script-src 'nonce-123'", + "allow_csp_from": getOrigin(), + "expected": IframeLoad.EXPECT_LOAD, + "blockedURI": "inline"}, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithAllowCSPFrom(test.origin, test.allow_csp_from); + assert_iframe_with_csp(t, url, test.csp, test.expected, test.name, test.blockedURI); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/embedding_csp-header.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/embedding_csp-header.html new file mode 100644 index 00000000000..424233a3ad8 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/embedding_csp-header.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Embedding-CSP header.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "Embedding-CSP is not sent if `csp` attribute is not set on <iframe>.", + "csp": null, + "expected": null }, + { "name": "Send Embedding-CSP when `csp` attribute of <iframe> is not empty.", + "csp": "script-src 'unsafe-inline'", + "expected": "script-src 'unsafe-inline'" }, + { "name": "Send Embedding-CSP Header on change of `src` attribute on iframe.", + "csp": "script-src 'unsafe-inline'", + "expected": "script-src 'unsafe-inline'" }, + { "name": "Wrong value of `csp` should not trigger sending Embedding-CSP Header.", + "csp": "completely wrong csp", + "expected": null}, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateURLString(Host.SAME_ORIGIN, PolicyHeader.EMBEDDING_CSP); + assert_embedding_csp(t, url, test.csp, test.expected); + }, "Test same origin: " + test.name); + + async_test(t => { + var url = generateURLString(Host.SAME_ORIGIN, PolicyHeader.EMBEDDING_CSP); + var redirect_url = generateRedirect(Host.SAME_ORIGIN, url); + assert_embedding_csp(t, redirect_url, test.csp, test.expected); + }, "Test same origin redirect: " + test.name); + + async_test(t => { + var url = generateURLString(Host.SAME_ORIGIN, PolicyHeader.EMBEDDING_CSP); + var redirect_url = generateRedirect(Host.CROSS_ORIGIN, url); + assert_embedding_csp(t, redirect_url, test.csp, test.expected); + }, "Test cross origin redirect: " + test.name); + + async_test(t => { + var url = generateURLString(Host.CROSS_ORIGIN, PolicyHeader.EMBEDDING_CSP); + var redirect_url = generateRedirect(Host.CROSS_ORIGIN, url); + assert_embedding_csp(t, redirect_url, test.csp, test.expected); + }, "Test cross origin redirect of cross origin iframe: " + test.name); + + async_test(t => { + var i = document.createElement('iframe'); + if (test.csp) + i.csp = test.csp; + i.src = generateURLString(Host.SAME_ORIGIN, PolicyHeader.EMBEDDING_CSP); + var loaded = false; + + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow || !('embedding_csp' in e.data)) + return; + if (!loaded) { + assert_equals(test.expected, e.data['embedding_csp']); + loaded = true; + i.csp = "default-src 'unsafe-inline'"; + i.src = generateURLString(Host.CROSS_ORIGIN, PolicyHeader.EMBEDDING_CSP); + } else { + // Once iframe has loaded, check that on change of `src` attribute + // Embedding-CSP value is based on latest `csp` attribute value. + assert_equals("default-src 'unsafe-inline'", e.data['embedding_csp']); + t.done(); + } + })); + + document.body.appendChild(i); + }, "Test Embedding-CSP value on `csp` change: " + test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/iframe-csp-attribute.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/iframe-csp-attribute.html new file mode 100644 index 00000000000..f23be1d0e92 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/iframe-csp-attribute.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> + <script> + test(t => { + var i = document.createElement('iframe'); + assert_equals('', i.csp); + assert_true('csp' in i); + assert_equals('string', typeof i.csp); + }, "<iframe> has a 'csp' attibute which is an empty string if undefined."); + + test(t => { + var i = document.createElement('iframe'); + i.setAttribute('csp', 123456); + assert_equals('123456', i.csp); + }, "<iframe>'s csp attribute is always a string."); + + test(t => { + var i = document.createElement('iframe'); + i.csp = 'value'; + assert_equals('value', i.getAttribute('csp')); + }, "<iframe>'s 'csp content attribute reflects the IDL attribute."); + + test(t => { + var i = document.createElement('iframe'); + i.setAttribute('csp', 'value'); + assert_equals('value', i.csp); + }, "<iframe>'s IDL attribute reflects the DOM attribute."); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html new file mode 100644 index 00000000000..f8e6b0bd0f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - Basic implementation.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "If there is no required csp, iframe should load.", + "required_csp": null, + "returned_csp": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Iframe with empty returned CSP should be blocked.", + "required_csp": "style-src 'none';", + "returned_csp": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Iframe with matching CSP should load.", + "required_csp": "style-src 'none'; script-src 'unsafe-inline'", + "returned_csp": "style-src 'none'; script-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Iframe with more restricting CSP should load.", + "required_csp": "script-src 'nonce-abc' 'nonce-123'", + "returned_csp": "script-src 'nonce-abc'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Iframe with less restricting CSP should be blocked.", + "required_csp": "style-src 'none'; script-src 'none'", + "returned_csp": "style-src 'none'; script-src 'self'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Iframe with a different CSP should be blocked.", + "required_csp": "script-src 'nonce-abc' 'nonce-123'", + "returned_csp": "style-src 'none'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Iframe with a matching and more restrictive ports should load.", + "required_csp": "frame-src http://c.com:443 http://b.com", + "returned_csp": "frame-src http://b.com:80 http://c.com:443", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Iframe should load even if the ports are different but are default for the protocols.", + "required_csp": "frame-src http://b.com:80", + "returned_csp": "child-src https://b.com:443", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html new file mode 100644 index 00000000000..c4990b518c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - Hashes.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "'sha256-abc123' is properly subsumed.", + "required_csp": "style-src 'sha256-abc123'", + "returned_csp_1": "style-src 'sha256-abc123'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned should not include hashes not present in required csp.", + "required_csp": "style-src http://example.com", + "returned_csp_1": "style-src 'sha256-abc123'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "'sha256-abc123' is properly subsumed with other sources.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes' 'strict-dynamic' 'sha256-abc123'", + "returned_csp_1": "style-src http://example1.com/foo/bar.html 'sha256-abc123'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Hashes do not have to be present in returned csp.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "returned_csp_1": "style-src http://example1.com/foo/", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Hashes do not have to be present in returned csp but must not allow all inline behavior.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Other expressions have to be subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-eval' 'sha256-abc123'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Other expressions have to be subsumed but 'unsafe-inline' gets ignored.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline' 'sha256-abc123'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Effective policy is properly found.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-hashed-attributes' 'sha256-abc123'", + "returned_csp_2": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required csp must allow 'sha256-abc123'.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src http://example1.com/foo/ 'self' 'sha256-abc123'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found where 'sha256-abc123' is not subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-hashed-attributes' 'sha256-abc123'", + "returned_csp_2": "style-src 'sha256-abc123' 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "'sha256-abc123' is not subsumed by 'sha256-abc456'.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc456'", + "returned_csp_1": "style-src 'unsafe-hashed-attributes' 'sha256-abc123'", + "returned_csp_2": "style-src 'sha256-abc123' 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy now does not allow 'sha256-abc123'.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'sha256-abc456'", + "returned_csp_1": "style-src 'unsafe-hashed-attributes' 'sha256-abc123' 'sha256-abc456'", + "returned_csp_2": "style-src 'sha256-abc456' 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Effective policy is properly found where 'sha256-abc123' is not part of it.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-hashed-attributes' 'self'", + "returned_csp_2": "style-src 'sha256-abc123' 'self'", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp_1); + if (test.returned_csp_2) + url.searchParams.append("policy2", test.returned_csp_2); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html new file mode 100644 index 00000000000..096c565062f --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - Host parts in host source expressions.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "Host must match.", + "required_csp": "img-src http://c.com", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Hosts without wildcards must match.", + "required_csp": "img-src http://c.com:* http://inner.b.com", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "More specific subdomain should not match.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src http://inner.b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Specified host should not match a wildcard host.", + "required_csp": "img-src http://c.com:* http://inner.b.com", + "returned_csp": "img-src http://*.b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "A wildcard host should match a more specific host.", + "required_csp": "img-src http://c.com:* http://*.b.com", + "returned_csp": "img-src https://inner.b.com", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html new file mode 100644 index 00000000000..6a3320875f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - Path parts in host source expressions.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "Returned CSP must specify a path.", + "required_csp": "img-src http://c.com:* http://b.com/example.html", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Returned CSP has a more specific path.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src http://b.com/example.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Matching paths.", + "required_csp": "img-src http://c.com:* http://b.com/example.html", + "returned_csp": "img-src http://b.com/example.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Empty path is not subsumed by specified paths.", + "required_csp": "img-src http://b.com/page1.html http://b.com/page2.html http://b.com/page3.html", + "returned_csp": "img-src http://b.com/", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "All specific paths match except the order.", + "required_csp": "img-src http://b.com/page1.html http://b.com/page2.html http://b.com/page3.html", + "returned_csp": "img-src http://b.com/page2.html http://b.com/page3.html http://b.com/page1.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP allows only one path.", + "required_csp": "img-src http://b.com/page1.html http://b.com/page2.html http://b.com/page3.html", + "returned_csp": "img-src http://b.com/page2.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "`/` path should be subsumed by an empty path.", + "required_csp": "img-src http://b.com", + "returned_csp": "img-src http://b.com/", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Unspecified path should be subsumed by `/`.", + "required_csp": "img-src http://b.com/", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "That should not be true when required csp specifies a specific page.", + "required_csp": "img-src http://b.com/path.html", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html new file mode 100644 index 00000000000..1b72b30387a --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html @@ -0,0 +1,82 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - Port parts in host source expressions.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "Specified ports must match.", + "required_csp": "img-src http://c.com:* http://b.com:80", + "returned_csp": "img-src http://b.com:36", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Returned CSP should be subsumed even if the port is not specified but is a default port for a scheme.", + "required_csp": "img-src http://c.com:* http://b.com:80", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP should be subsumed even if the port is not specified but is a default port for a more secure scheme.", + "required_csp": "img-src http://c.com:* http://b.com:80", + "returned_csp": "img-src https://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "The same should hold for `ws` case.", + "required_csp": "img-src http://c.com:* ws://b.com:80", + "returned_csp": "img-src wss://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Unspecified ports must match if schemes match.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src https://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP should be subsumed if the port is specified.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src http://b.com:80", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP should be subsumed if the port is specified but the scheme is more secure.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src https://b.com:443", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP should be subsumed if the port is specified but is not default for a more secure scheme.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src https://b.com:36", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Returned CSP should be subsumed if the ports match but schemes are not identical.", + "required_csp": "img-src http://c.com:* http://b.com:36", + "returned_csp": "img-src https://b.com:36", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP should be subsumed if the ports match but schemes are not identical for `ws`.", + "required_csp": "img-src http://c.com:* ws://b.com:36", + "returned_csp": "img-src wss://b.com:36", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Wildcard port should match unspecified port.", + "required_csp": "img-src http://c.com:* ws://b.com:*", + "returned_csp": "img-src wss://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Wildcard port should match any specific port.", + "required_csp": "img-src http://c.com:* ws://b.com:*", + "returned_csp": "img-src wss://b.com:36", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Wildcard port should match a wildcard.", + "required_csp": "img-src http://c.com:* ws://b.com:*", + "returned_csp": "img-src wss://b.com:*", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Wildcard port should not be subsumed by a default port.", + "required_csp": "img-src http://c.com:* ws://b.com", + "returned_csp": "img-src ws://b.com:*", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Wildcard port should not be subsumed by a spcified port.", + "required_csp": "img-src http://c.com:* ws://b.com:80", + "returned_csp": "img-src ws://b.com:*", + "expected": IframeLoad.EXPECT_BLOCK }, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html new file mode 100644 index 00000000000..cb4f686043b --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - Scheme parts in host source expressions.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "`https` is more restrictive than `http`.", + "required_csp": "img-src http://c.com:* https://b.com", + "returned_csp": "img-src http://b.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "The reverse allows iframe be to be loaded.", + "required_csp": "img-src http://c.com:* http://b.com", + "returned_csp": "img-src https://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Matching `https` protocols.", + "required_csp": "img-src http://c.com:* https://b.com", + "returned_csp": "img-src https://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "`http:` should subsume all host source expressions with this protocol.", + "required_csp": "img-src http:", + "returned_csp": "img-src http://c.com:* https://b.com http://c.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "`http:` should subsume all host source expressions with `https:`.", + "required_csp": "img-src http:", + "returned_csp": "img-src https://c.com:* https://b.com http://c.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "`http:` does not subsume other protocols.", + "required_csp": "img-src http:", + "returned_csp": "img-src https://c.com:* wss://b.com http://c.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "If scheme source is present in returned csp, it must be specified in required csp too.", + "required_csp": "img-src https://c.com:* wss://b.com http://c.com", + "returned_csp": "img-src http:", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "`http:` subsumes other `http:` source expression.", + "required_csp": "img-src http:", + "returned_csp": "img-src http: https://c.com:* https://b.com http://c.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "`http:` subsumes other `https:` source expression and expressions with `http:`.", + "required_csp": "img-src http:", + "returned_csp": "img-src https: https://c.com:* http://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "All scheme sources must be subsumed.", + "required_csp": "img-src http: wss:", + "returned_csp": "img-src https: ws:", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "All scheme sources are subsumed by their stronger variants.", + "required_csp": "img-src http: wss:", + "returned_csp": "img-src https: wss:", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html new file mode 100644 index 00000000000..98abe7d8355 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html @@ -0,0 +1,113 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - 'none' keyword.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "Empty required csp subsumes empty list of returned policies.", + "required_csp": "", + "returned_csp_1": "", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Empty required csp subsumes any list of policies.", + "required_csp": "", + "returned_csp_1": "img-src http://example.com", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Empty required csp subsumes a policy with `none`.", + "required_csp": "", + "returned_csp_1": "img-src 'none'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required policy that allows `none` does not subsume empty list of policies.", + "required_csp": "img-src ", + "returned_csp_1": "", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp with effective `none` does not subsume a host source expression.", + "required_csp": "img-src ", + "returned_csp_1": "img-src http://example.com", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp with `none` does not subsume a host source expression.", + "required_csp": "img-src 'none'", + "returned_csp_1": "img-src http://example.com", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp with effective `none` does not subsume `none` of another directive.", + "required_csp": "img-src ", + "returned_csp_1": "frame-src 'none'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp with `none` does not subsume `none` of another directive.", + "required_csp": "img-src 'none'", + "returned_csp_1": "frame-src 'none'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp with `none` does not subsume `none` of different directives.", + "required_csp": "img-src ", + "returned_csp_1": "img-src http://*.one.com", + "returned_csp_2": "frame-src https://two.com", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp with `none` subsumes effective list of `none`.", + "required_csp": "img-src ", + "returned_csp_1": "img-src http://*.one.com", + "returned_csp_2": "img-src https://two.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required csp with `none` subsumes effective list of `none` despite other keywords.", + "required_csp": "img-src 'none'", + "returned_csp_1": "img-src http://*.one.com", + "returned_csp_2": "img-src 'self'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Source list with exprssions other than `none` make `none` ineffective.", + "required_csp": "img-src http://example.com 'none'", + "returned_csp_1": "img-src http://example.com", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned csp with `none` is subsumed by any required csp.", + "required_csp": "img-src http://example.com", + "returned_csp_1": "img-src 'none'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned csp with effective `none` is subsumed by any required csp.", + "required_csp": "img-src http://example.com", + "returned_csp_1": "img-src http://example.com", + "returned_csp_2": "img-src http://non-example.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Both required and returned csp are `none`.", + "required_csp": "img-src 'none'", + "returned_csp_1": "img-src 'none'", + "returned_csp_2": "img-src http://non-example.com", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Both required and returned csp are `none` for only one directive.", + "required_csp": "default-src 'none'", + "returned_csp_1": "img-src 'none'", + "returned_csp_2": "script-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Both required and returned csp are empty.", + "required_csp": "img-src ", + "returned_csp_1": "img-src ", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Both required and returned csp are effectively 'none'.", + "required_csp": "img-src ", + "returned_csp_1": "img-src http://a.com", + "returned_csp_2": "img-src http://b.com", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp_1); + if (test.returned_csp_2) + url.searchParams.append("policy2", test.returned_csp_2); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html new file mode 100644 index 00000000000..9d08d24daba --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - 'self' keyword.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "'self' keywords should match.", + "required_csp": "img-src 'self' http://b.com:*", + "returned_csp": "img-src 'self' http://b.com:*", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP does not have to specify 'self'.", + "required_csp": "img-src 'self' http://b.com:*", + "returned_csp": "img-src http://b.com:*", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned CSP must not allow 'self' if required CSP does not.", + "required_csp": "img-src http://b.com:*", + "returned_csp": "img-src 'self' http://b.com:*", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Returned 'self' should match to an origin's url.", + "required_csp": "img-src 'self' http://b.com:*", + "returned_csp": "img-src " + getCrossOrigin(), + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required 'self' should match to a origin's url.", + "required_csp": "img-src " + getCrossOrigin() + " http://b.com:*", + "returned_csp": "img-src 'self'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required 'self' should subsume a more secure version of origin's url.", + "required_csp": "img-src 'self' http://b.com:*", + "returned_csp": "img-src " + getSecureCrossOrigin(), + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned 'self' should not be subsumed by a more secure version of origin's url.", + "required_csp": "img-src " + getSecureCrossOrigin() + " http://b.com:*", + "returned_csp": "img-src 'self'", + "expected": IframeLoad.EXPECT_BLOCK }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html new file mode 100644 index 00000000000..b3e0ea15bdc --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - 'strict-dynamic' keyword.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "'strict-dynamic' is ineffective for `style-src`.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'strict-dynamic' http://example1.com/foo/bar.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' is ineffective for `img-src`.", + "required_csp": "img-src http://example1.com/foo/ 'self'", + "returned_csp_1": "img-src 'strict-dynamic' http://example1.com/foo/bar.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' is ineffective for `frame-src`.", + "required_csp": "frame-src http://example1.com/foo/ 'self'", + "returned_csp_1": "frame-src 'strict-dynamic' http://example1.com/foo/bar.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' is ineffective for `child-src`.", + "required_csp": "child-src http://example1.com/foo/ 'self'", + "returned_csp_1": "child-src 'strict-dynamic' http://example1.com/foo/bar.html", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' is effective only for `script-src`.", + "required_csp": "script-src http://example1.com/foo/ 'self'", + "returned_csp_1": "script-src 'strict-dynamic' http://example1.com/foo/bar.html", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "'strict-dynamic' is proper handled for finding effective policy.", + "required_csp": "script-src http://example1.com/foo/ 'self'", + "returned_csp_1": "script-src 'strict-dynamic' http://example1.com/foo/bar.html", + "returned_csp_2": "script-src 'strict-dynamic' 'nonce-abc'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "'strict-dynamic' makes host source expressions ineffective.", + "required_csp": "script-src 'strict-dynamic' 'nonce-abc'", + "returned_csp_1": "script-src http://example.com 'strict-dynamic' 'nonce-abc'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' makes scheme source expressions ineffective.", + "required_csp": "script-src 'strict-dynamic' 'nonce-abc'", + "returned_csp_1": "script-src http: 'strict-dynamic' 'nonce-abc'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' makes 'self' ineffective.", + "required_csp": "script-src 'strict-dynamic' 'nonce-abc'", + "returned_csp_1": "script-src 'self' 'strict-dynamic' 'nonce-abc'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' makes 'unsafe-inline' ineffective.", + "required_csp": "script-src 'strict-dynamic' 'nonce-abc'", + "returned_csp_1": "script-src 'unsafe-inline' 'strict-dynamic' 'nonce-abc'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'strict-dynamic' has to be allowed by required csp if it is present in returned csp.", + "required_csp": "script-src 'nonce-abc'", + "returned_csp_1": "script-src 'strict-dynamic' 'nonce-abc'", + "expected": IframeLoad.EXPECT_BLOCK }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp_1); + if (test.returned_csp_2) + url.searchParams.append("policy2", test.returned_csp_2); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html new file mode 100644 index 00000000000..e111f152f80 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - 'unsafe-eval' keyword.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "'unsafe-eval' is properly subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes' 'strict-dynamic' 'unsafe-eval'", + "returned_csp_1": "style-src http://example1.com/foo/bar.html 'unsafe-eval'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "No other keyword has the same effect as 'unsafe-eval'.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-eval'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Other expressions have to be subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-eval'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline' 'unsafe-eval'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-eval'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-hashed-attributes' 'unsafe-eval'", + "returned_csp_2": "style-src http://example1.com/foo/ 'self' 'unsafe-eval'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required csp must allow 'unsafe-eval'.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src http://example1.com/foo/ 'self' 'unsafe-eval'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found where 'unsafe-eval' is not subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-hashed-attributes' 'unsafe-eval'", + "returned_csp_2": "style-src 'unsafe-eval' 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found where 'unsafe-eval' is not part of it.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-hashed-attributes' 'self'", + "returned_csp_2": "style-src 'unsafe-eval' 'self'", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp_1); + if (test.returned_csp_2) + url.searchParams.append("policy2", test.returned_csp_2); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html new file mode 100644 index 00000000000..889210c253a --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - 'unsafe-hashed-attributes' keyword.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "'unsafe-hashed-attributes' is properly subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-eval' 'strict-dynamic' 'unsafe-hashed-attributes'", + "returned_csp_1": "style-src http://example1.com/foo/bar.html 'unsafe-hashed-attributes'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "No other keyword has the same effect as 'unsafe-hashed-attributes'.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Other expressions have to be subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline' 'unsafe-hashed-attributes'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-eval' 'unsafe-hashed-attributes'", + "returned_csp_2": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required csp must allow 'unsafe-hashed-attributes'.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src http://example1.com/foo/ 'self' 'unsafe-hashed-attributes'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found where 'unsafe-hashed-attributes' is not subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-eval' 'unsafe-hashed-attributes'", + "returned_csp_2": "style-src 'unsafe-hashed-attributes' 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective policy is properly found where 'unsafe-hashed-attributes' is not part of it.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-eval' 'self'", + "returned_csp_2": "style-src 'unsafe-hashed-attributes' 'self'", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp_1); + if (test.returned_csp_2) + url.searchParams.append("policy2", test.returned_csp_2); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html new file mode 100644 index 00000000000..96f0e38699b --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<html> +<head> +<title>Embedded Enforcement: Subsumption Algorithm - 'unsafe-inline' keyword.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/testharness-helper.sub.js"></script> +</head> +<body> + <script> + var tests = [ + { "name": "'strict-dynamic' is ineffective for `style-src`.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline' 'strict-dynamic'", + "returned_csp_1": "style-src 'unsafe-inline' http://example1.com/foo/bar.html", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' is properly subsumed in `style-src`.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' is only ineffective if the effective returned csp has nonces in `style-src`.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "style-src 'unsafe-inline' 'nonce-yay'", + "returned_csp_2": "style-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' is only ineffective if the effective returned csp has hashes in `style-src`.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "style-src 'unsafe-inline' 'sha256-abc123'", + "returned_csp_2": "style-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned csp does not have to allow 'unsafe-inline' in `style-src` to be subsumed.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "style-src 'self'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' does not matter if returned csp is effectively `none`.", + "required_csp": "style-src 'unsafe-inline'", + "returned_csp_1": "style-src ", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' is properly subsumed in `script-src`.", + "required_csp": "script-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "script-src http://example1.com/foo/ 'unsafe-inline'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Returned csp only loads 'unsafe-inline' scripts with 'nonce-abc'.", + "required_csp": "script-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "script-src 'nonce-abc'", + "returned_csp_2": "script-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' is ineffective when nonces are present.", + "required_csp": "script-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "script-src 'unsafe-inline' 'nonce-abc'", + "returned_csp_2": "script-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "'unsafe-inline' is only ineffective if the effective returned csp has hashes in `script-src`.", + "required_csp": "script-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "script-src 'unsafe-inline' 'sha256-abc123' 'nonce-abc'", + "returned_csp_2": "script-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_LOAD }, + { "name": "Required csp allows `strict-dynamic`, but retuned csp does.", + "required_csp": "script-src http://example1.com/foo/ 'unsafe-inline' 'strict-dynamic'", + "returned_csp_1": "script-src 'unsafe-inline' http://example1.com/foo/bar.html", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Required csp does not allow `unsafe-inline`, but retuned csp does.", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-inline'", + "returned_csp_2": null, + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Returned csp whitelists a nonce.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "style-src 'unsafe-inline' 'nonce-abc'", + "returned_csp_2": "style-src 'nonce-abc'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Returned csp whitelists a hash.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline'", + "returned_csp_1": "style-src 'unsafe-inline' 'sha256-abc123'", + "returned_csp_2": "style-src 'sha256-abc123'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective returned csp allows 'unsafe-inline'", + "required_csp": "style-src http://example1.com/foo/ 'self'", + "returned_csp_1": "style-src 'unsafe-inline' https://example.test/", + "returned_csp_2": "style-src 'unsafe-inline'", + "expected": IframeLoad.EXPECT_BLOCK }, + { "name": "Effective returned csp does not allow 'sha512-321cba' hash.", + "required_csp": "style-src http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321cba'", + "returned_csp_1": "style-src http://example1.com/foo/ 'unsafe-inline' 'nonce-yay'", + "returned_csp_2": "style-src http://example1.com/foo/ 'unsafe-inline' 'sha512-321cba'", + "expected": IframeLoad.EXPECT_LOAD }, + ]; + tests.forEach(test => { + async_test(t => { + var url = generateUrlWithPolicies(Host.CROSS_ORIGIN, test.returned_csp_1); + if (test.returned_csp_2) + url.searchParams.append("policy2", test.returned_csp_2); + assert_iframe_with_csp(t, url, test.required_csp, test.expected, test.name, null); + }, test.name); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py new file mode 100644 index 00000000000..fa1064adc84 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py @@ -0,0 +1,37 @@ +import json +def main(request, response): + headers = [("Content-Type", "text/html")] + if "allow_csp_from" in request.GET: + headers.append(("Allow-CSP-From", request.GET["allow_csp_from"])) + message = request.GET["id"] + return headers, ''' +<!DOCTYPE html> +<html> +<head> + <title>This page enforces embedder's policies</title> + <script nonce="123"> + document.addEventListener("securitypolicyviolation", function(e) { + var response = {}; + response["id"] = "%s"; + response["securitypolicyviolation"] = true; + response["blockedURI"] = e.blockedURI; + response["lineNumber"] = e.lineNumber; + window.top.postMessage(response, '*'); + }); + </script> +</head> +<body> + <style> + body { + background-color: maroon; + } + </style> + <script nonce="abc"> + var response = {}; + response["id"] = "%s"; + response["loaded"] = true; + window.top.postMessage(response, '*'); + </script> +</body> +</html> +''' % (message, message) diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-embedding-csp.py b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-embedding-csp.py new file mode 100644 index 00000000000..cdf02f2bb25 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-embedding-csp.py @@ -0,0 +1,15 @@ +import json +def main(request, response): + header = request.headers.get("Embedding-CSP"); + message = {} + message['embedding_csp'] = header if header else None + return [("Content-Type", "text/html"), ("Allow-CSP-From", "*")], ''' +<!DOCTYPE html> +<html> +<head> + <script> + window.parent.postMessage({0}, '*'); + </script> +</head> +</html> +'''.format(json.dumps(message)) diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-policy-multiple.py b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-policy-multiple.py new file mode 100644 index 00000000000..8100086a3d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/echo-policy-multiple.py @@ -0,0 +1,25 @@ +def main(request, response): + headers = [("Content-Type", "text/html")] + if "policy" in request.GET: + headers.append(("Content-Security-Policy", request.GET["policy"])) + if "policy2" in request.GET: + headers.append(("Content-Security-Policy", request.GET["policy2"])) + if "policy3" in request.GET: + headers.append(("Content-Security-Policy", request.GET["policy3"])) + message = request.GET["id"] + return headers, ''' +<!DOCTYPE html> +<html> +<head> + <title>This page sets given CSP upon itself.</title> +</head> +<body> + <script nonce="abc"> + var response = {}; + response["id"] = "%s"; + response["loaded"] = true; + window.top.postMessage(response, '*'); + </script> +</body> +</html> +''' % (message) diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js new file mode 100644 index 00000000000..c5f07e9bd45 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js @@ -0,0 +1,136 @@ +const Host = { + SAME_ORIGIN: "same-origin", + CROSS_ORIGIN: "cross-origin", +}; + +const PolicyHeader = { + CSP: "echo-policy.py?policy=", + CSP_MULTIPLE: "echo-policy-multiple.py", + EMBEDDING_CSP: "echo-embedding-csp.py", + ALLOW_CSP_FROM: "echo-allow-csp-from.py", +}; + +const IframeLoad = { + EXPECT_BLOCK: true, + EXPECT_LOAD: false, +}; + +function getOrigin() { + var url = new URL("http://{{host}}:{{ports[http][0]}}/"); + return url.toString(); +} + +function getCrossOrigin() { + var url = new URL("http://{{domains[天気の良い日]}}:{{ports[http][0]}}/"); + return url.toString(); +} + +function getSecureCrossOrigin() { + // Since wptserve spins up servers on non-default port, 'self' matches + // http://[host]:[specified-port] and https://[host]:[specified-port], but not + // https://[host]:[https-port]. So, we use the http port for this https origin + // in order to verify that a secure variant of a non-secure URL matches 'self'. + var url = new URL("https://{{domains[天気の良い日]}}:{{ports[http][0]}}"); + return url.toString(); +} + +function generateURL(host, path) { + var url = new URL("http://{{host}}:{{ports[http][0]}}/content-security-policy/embedded-enforcement/support/"); + url.hostname = host == Host.SAME_ORIGIN ? "{{host}}" : "{{domains[天気の良い日]}}"; + url.pathname += path; + + return url; +} + +function generateURLString(host, path) { + return generateURL(host, path).toString(); +} + +function generateRedirect(host, target) { + var url = new URL("http://{{host}}:{{ports[http][0]}}/common/redirect.py?location=" + + encodeURIComponent(target)); + url.hostname = host == Host.SAME_ORIGIN ? "{{host}}" : "{{domains[天気の良い日]}}"; + + return url.toString(); +} + +function generateUrlWithPolicies(host, policy) { + var url = generateURL(host, PolicyHeader.CSP_MULTIPLE); + if (policy != null) + url.searchParams.append("policy", policy); + return url; +} + +function generateUrlWithAllowCSPFrom(host, allowCspFrom) { + var url = generateURL(host, PolicyHeader.ALLOW_CSP_FROM); + if (allowCspFrom != null) + url.searchParams.append("allow_csp_from", allowCspFrom); + return url; +} + +function assert_embedding_csp(t, url, csp, expected) { + var i = document.createElement('iframe'); + if(csp) + i.csp = csp; + i.src = url; + + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow || !('embedding_csp' in e.data)) + return; + assert_equals(expected, e.data['embedding_csp']); + t.done(); + })); + + document.body.appendChild(i); +} + +function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI) { + var i = document.createElement('iframe'); + url.searchParams.append("id", urlId); + i.src = url.toString(); + if (csp != null) + i.csp = csp; + + var loaded = {}; + window.addEventListener("message", function (e) { + if (e.source != i.contentWindow) + return; + if (e.data["loaded"]) + loaded[e.data["id"]] = true; + }); + + if (shouldBlock) { + // Assert iframe does not load and is inaccessible. + window.onmessage = function (e) { + if (e.source != i.contentWindow) + return; + t.unreached_func('No message should be sent from the frame.'); + } + i.onload = t.step_func(function () { + // Delay the check until after the postMessage has a chance to execute. + setTimeout(t.step_func_done(function () { + assert_equals(loaded[urlId], undefined); + }), 1); + assert_throws("SecurityError", () => { + var x = i.contentWindow.location.href; + }); + }); + } else if (blockedURI) { + // Assert iframe loads with an expected violation. + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) + return; + assert_equals(e.data["blockedURI"], blockedURI); + t.done(); + })); + } else { + // Assert iframe loads. + i.onload = t.step_func(function () { + // Delay the check until after the postMessage has a chance to execute. + setTimeout(t.step_func_done(function () { + assert_true(loaded[urlId]); + }), 1); + }); + } + document.body.appendChild(i); +} diff --git a/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html b/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html index d882330cece..6c120adac20 100644 --- a/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html +++ b/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html @@ -3,26 +3,41 @@ <script src="/resources/testharnessreport.js"></script> <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'"> + <body> + <script nonce="abc"> function assert_csp_event_for_element(test, element) { + assert_equals(typeof SecurityPolicyViolationEvent, "function", "These tests require 'SecurityPolicyViolationEvent'."); document.addEventListener("securitypolicyviolation", test.step_func(e => { if (e.target != element) return; assert_equals(e.blockedURI, "inline"); assert_equals(e.effectiveDirective, "script-src"); - assert_equals(element.contentDocument.body.innerText, ""); - element.parentNode.removeChild(element); + assert_equals(element.contentDocument.body.innerText, "", "Ensure that 'Fail' doesn't appear in the child document."); + element.remove(); test.done(); })); } + function navigate_to_javascript_onload(test, iframe) { + iframe.addEventListener("load", test.step_func(e => { + assert_equals(typeof SecurityPolicyViolationEvent, "function"); + iframe.contentDocument.addEventListener( + "securitypolicyviolation", + test.unreached_func("The CSP event should be fired in the embedding document, not in the embedee.") + ); + + iframe.src = "javascript:'Fail.'"; + })); + } + async_test(t => { var i = document.createElement("iframe"); + i.src = "javascript:'Fail.'"; assert_csp_event_for_element(t, i); - i.src = "javascript:'Fail.'"; document.body.appendChild(i); }, "<iframe src='javascript:'> blocked without 'unsafe-inline'."); @@ -30,28 +45,28 @@ var i = document.createElement("iframe"); assert_csp_event_for_element(t, i); + navigate_to_javascript_onload(t, i); - i.onload = _ => { i.src = "javascript:'Fail.'"; } document.body.appendChild(i); }, "<iframe> navigated to 'javascript:' blocked without 'unsafe-inline'."); async_test(t => { var i = document.createElement("iframe"); + i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'unsafe-inline'"); assert_csp_event_for_element(t, i); + navigate_to_javascript_onload(t, i); - i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'unsafe-inline'"); - i.onload = _ => { i.src = "javascript:'Fail.'"; } document.body.appendChild(i); }, "<iframe src='...'> with 'unsafe-inline' navigated to 'javascript:' blocked in this document"); async_test(t => { var i = document.createElement("iframe"); + i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'none'"); assert_csp_event_for_element(t, i); + navigate_to_javascript_onload(t, i); - i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'none'"); - i.onload = _ => { i.src = "javascript:'Fail.'"; } document.body.appendChild(i); }, "<iframe src='...'> without 'unsafe-inline' navigated to 'javascript:' blocked in this document."); </script> diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html new file mode 100644 index 00000000000..3a6151b10f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html @@ -0,0 +1,32 @@ +<!DOCTYPE HTML> +<html> + +<head> + <title>Script injected via `javascript:` URIs are not allowed with `strict-dynamic`.</title> + <script src='/resources/testharness.js' nonce='dummy'></script> + <script src='/resources/testharnessreport.js' nonce='dummy'></script> + + <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' --> +</head> + +<body> + <h1>Script injected via `javascript:` URIs are not allowed with `strict-dynamic`.</h1> + <div id='log'></div> + <a id='javascriptUri' href='javascript:javascriptUriScriptRan = true;'></a> + + <script nonce='dummy'> + var javascriptUriScriptRan = false; + + async_test(function(t) { + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_false(javascriptUriScriptRan); + assert_equals(e.effectiveDirective, 'script-src'); + })); + + document.getElementById('javascriptUri').click(); + assert_false(javascriptUriScriptRan); + }, "Script injected via `javascript:` URIs are not allowed with `strict-dynamic`."); + </script> +</body> + +</html> diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html.headers new file mode 100644 index 00000000000..b7918c93323 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html.headers @@ -0,0 +1,5 @@ +Expires: Mon, 26 Jul 1997 05:00:00 GMT +Cache-Control: no-store, no-cache, must-revalidate +Cache-Control: post-check=0, pre-check=0, false +Pragma: no-cache +Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy' diff --git a/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html index 3ae4a9dbfe0..c530064f1e7 100644 --- a/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html +++ b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html @@ -100,6 +100,7 @@ test(function () { var svg = document.getElementById('squiggle'); + svg.scrollIntoView(); var svgRect = svg.getBoundingClientRect(); assert_equals(document.elementFromPoint(svgRect.left + Math.round(svgRect.width/2), svgRect.top + Math.round(svgRect.height/2)), @@ -109,6 +110,7 @@ test(function () { var svg = document.getElementById('svg-transform'); + svg.scrollIntoView(); var svgRect = svg.getBoundingClientRect(); assert_equals(document.elementFromPoint(svgRect.left + Math.round(svgRect.width/2), svgRect.top + Math.round(svgRect.height/2)), @@ -116,6 +118,7 @@ "Should have returned SVG with Hello WPT! that has a transform"); var pink = document.getElementById('pink'); + pink.scrollIntoView(); var pinkRect = pink.getBoundingClientRect(); assert_equals(document.elementFromPoint(pinkRect.left + Math.round(pinkRect.width/2), pinkRect.top + Math.round(pinkRect.height/2)), @@ -126,11 +129,12 @@ test(function () { var anotherteal = document.getElementById('anotherteal'); + anotherteal.scrollIntoView(); var anothertealRect = anotherteal.getBoundingClientRect(); assert_equals(document.elementFromPoint(anothertealRect.left + Math.round(anothertealRect.width/2), anothertealRect.top + Math.round(anothertealRect.height/2)), document.body, - "Should have returned the root"); + "Should have returned the root as it has pointer-events:none"); var doc = frames[2].document; doc.removeChild(doc.documentElement); @@ -145,11 +149,23 @@ }, "No viewport available"); test(function () { + // HTML says: + // Pointing device interaction with an image associated with a set of layered shapes per + // the above algorithm must result in the relevant user interaction events being first + // fired to the top-most shape covering the point that the pointing device indicated, if + // any, or to the image element itself, if there is no shape covering that point. + // https://html.spec.whatwg.org/multipage/embedded-content.html#image-map-processing-model var area = document.getElementById('rectG'); + var image = document.getElementById('dinos'); + area.scrollIntoView(); var areaRect = area.getBoundingClientRect(); assert_equals(document.elementFromPoint(areaRect.left + Math.round(areaRect.width/2), areaRect.top + Math.round(areaRect.height/2)), area, + "Should have returned the area element"); + assert_equals(document.elementFromPoint(areaRect.left + 92, + areaRect.top + 2), + image, "Should have returned the image element"); }, "Image Maps"); done(); diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollingElement.html b/tests/wpt/web-platform-tests/cssom-view/scrollingElement.html index abede49cf2c..a438541120d 100644 --- a/tests/wpt/web-platform-tests/cssom-view/scrollingElement.html +++ b/tests/wpt/web-platform-tests/cssom-view/scrollingElement.html @@ -9,7 +9,7 @@ <script> async_test(function() { var quirksFrame = document.getElementById("quirksframe"); - quirksFrame.onload = this.step_func(function() { + quirksFrame.onload = this.step_func_done(function() { var quirksDoc = quirksFrame.contentDocument; assert_equals(quirksDoc.compatMode, "BackCompat", "Should be in quirks mode."); assert_not_equals(quirksDoc.body, null, "Should have a body element"); diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html index 393bbec698b..dd98f15cd96 100644 --- a/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html +++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html @@ -53,7 +53,7 @@ customElements.define('returns-another-instance', ReturnsAnotherInstance); test(function () { var instance = document.querySelector('instantiates-itself-before-super'); - assert_equals(instance instanceof InstantiatesItselfBeforeSuper, 'HTML parser must insert the synchronously constructed custom element'); + assert_true(instance instanceof InstantiatesItselfBeforeSuper, 'HTML parser must insert the synchronously constructed custom element'); assert_equals(instance, elementCreatedBySuperCall, 'HTML parser must insert the element returned by the custom element constructor'); assert_not_equals(instance, anotherElementCreatedBeforeSuperCall, 'HTML parser must not insert another instance of the custom element created before super() call'); assert_equals(anotherElementCreatedBeforeSuperCall.parentNode, null, 'HTML parser must not insert another instance of the custom element created before super() call'); @@ -63,7 +63,7 @@ test(function () { test(function () { var instance = document.querySelector('returns-another-instance'); - assert_equals(instance instanceof ReturnsAnotherInstance, 'HTML parser must insert the synchronously constructed custom element'); + assert_true(instance instanceof ReturnsAnotherInstance, 'HTML parser must insert the synchronously constructed custom element'); assert_equals(instance, anotherInstance, 'HTML parser must insert the element returned by the custom element constructor'); assert_not_equals(instance, firstInstance, 'HTML parser must not insert the element created by super() call if the constructor returned another element'); assert_equals(firstInstance.parentNode, null, 'HTML parser must not insert the element created by super() call if the constructor returned another element'); diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars-first-char.html b/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars-first-char.html deleted file mode 100644 index b83b5fa7869..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars-first-char.html +++ /dev/null @@ -1,58 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>First char allowed for custom element type </title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="The custom element type identifies a custom element interface and is a sequence of characters that must match the NCName production"> -<meta name="timeout" content="long"> -<link rel="help" href="https://dvcs.w3.org/hg/webcomponents/raw-file/default/spec/custom/index.html#concepts"> -<link rel="help" href="http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -function composeName(charCode) { - return String.fromCharCode(charCode) + '-x' + charCode.toString(16); -} - -// NCName definition from http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName -// NCName ::= (Letter | '_') (NCNameChar)* -// NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender -// Letter ::= BaseChar | Ideographic - -test(function() { - testCharCode(getCharCode('_'), composeName, checkValidName); -}, 'Registering valid custom element name starting with \'_\' char'); - -test(function() { - baseCharsSingle.testEach(composeName, checkValidName); - baseCharsRanges.testEach(composeName, checkValidName); -}, 'Registering valid custom element name starting with base char'); - -test(function() { - ideographicCharsSingle.testEach(composeName, checkValidName); - ideographicCharsRanges.testEach(composeName, checkValidName); -}, 'Registering valid custom element name starting with ideographic char'); - -test(function() { - (new CharsArray(['.', '-', ':', '+', '='])).testEach(composeName, checkInvalidName); -}, 'Registering custom element starting with invalid character (general) should fail'); - -test(function() { - combiningChars.testEach(composeName, checkInvalidName); -}, 'Registering custom element starting with invalid character (combining char) should fail'); - -test(function() { - extenderChars.testEach(composeName, checkInvalidName); -}, 'Registering custom element starting with invalid character (extender char) should fail'); - -test(function() { - digitCharsRanges.testEach(composeName, checkInvalidName); -}, 'Registering custom element starting with invalid character (digit char) should fail'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars.html b/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars.html deleted file mode 100644 index 64252ab49d8..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars.html +++ /dev/null @@ -1,54 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Chars allowed for custom element type </title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The custom element type identifies a custom element interface and is a sequence of characters that must match the NCName production"> -<meta name="timeout" content="long"> -<link rel="help" href="https://dvcs.w3.org/hg/webcomponents/raw-file/default/spec/custom/index.html#concepts"> -<link rel="help" href="http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -function composeName(charCode) { - return 'x-' + String.fromCharCode(charCode) + '-x' + charCode.toString(16); -} - -// NCName definition from http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName -// NCName ::= (Letter | '_') (NCNameChar)* -// NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender -// Letter ::= BaseChar | Ideographic - -test(function() { - baseCharsSingle.testEach(composeName, checkValidName); - baseCharsRanges.testEach(composeName, checkValidName); -}, 'Registering valid custom element types with base char'); - -test(function() { - ideographicCharsSingle.testEach(composeName, checkValidName); - ideographicCharsRanges.testEach(composeName, checkValidName); -}, 'Registering valid custom element types with ideographic char'); - -test(function() { - digitCharsRanges.testEach(composeName, checkValidName); -}, 'Registering valid custom element types with digit chars'); - -test(function() { - (new CharsArray(['.', '-', '_'])).testEach(composeName, checkValidName) -}, 'Registering valid custom element types with characters \'.\', \'-\', \'_\''); - -test(function() { - combiningChars.testEach(composeName, checkValidName); -}, 'Registering valid custom element types with combining char'); - -test(function() { - extenderChars.testEach(composeName, checkValidName); -}, 'Registering valid custom element types with extender char'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-naming.html b/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-naming.html deleted file mode 100644 index c05f1ccdeb4..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/concepts/custom-elements-type-naming.html +++ /dev/null @@ -1,65 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>The custom element type is a sequence of characters that must match the NCName production and contain a minus character</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="The custom element type is a sequence of characters that must match the NCName production and contain a U+002D HYPHEN-MINUS character"> -<link rel="help" href="https://dvcs.w3.org/hg/webcomponents/raw-file/default/spec/custom/index.html#concepts"> -<link rel="help" href="http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var validNames = ['x-frame', 'xx-frame', 'x--frame', '_-frame', 'x-', 'x--', - 'x-1', 'x-_', '_-_', '__-', '_-1', '_-..']; - HTML5_ELEMENTS.forEach(function(value) { - validNames.push('x-' + value); - validNames.push('Y-' + value.toUpperCase()); - }); - validNames.forEach(function(value) { - try { - doc.registerElement(value); - } catch (e) { - assert_unreached('Exception should not be thrown in case of attempt ' + - 'to register a custom element with a name \'' + value + '\''); - } - }); -}, 'Registering valid custom element types'); - -test(function() { - var doc = newHTMLDocument(); - var invalidNames = ['xframe', 'x_frame', 'x.frame', 'x1frame', '-xframe', '1-frame', - '1x-frame', '.-frame', '_frame', 'x-f!rame', 'x-:frame']; - invalidNames.forEach(function(value) { - assert_throws('SyntaxError', function() { - doc.registerElement(value); - }, 'Exception should be thrown in case of attempt to register element ' + - 'with the name \'' + value + '\''); - }); -}, 'Registering invalid custom element types should fail'); - -test(function() { - var doc = newHTMLDocument(); - var forbiddenNames = ['annotation-xml', - 'color-profile', - 'font-face', - 'font-face-src', - 'font-face-uri', - 'font-face-format', - 'font-face-name', - 'missing-glyph']; - forbiddenNames.forEach(function(value) { - assert_throws('SyntaxError', function() { - doc.registerElement(value); - }, 'Exception should be thrown in case of attempt to register element ' + - 'with the name \'' + value + '\''); - }); -}, 'Registering forbidden custom element types should fail'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/new-registry-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/new-registry-test.html deleted file mode 100644 index 597f15c2154..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/new-registry-test.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>When an HTML Document is loaded in a browsing context, a new registry must be created and associated with this document</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="When an HTML Document is loaded in a browsing context, a new registry must be created and associated with this document."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#creating-and-passing-registries"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -testInIFrame('../resources/blank.html', function(doc) { - try { - doc.registerElement('x-element'); - } catch (e) { - assert_unreached('Unexpected exception, while registering a valid custom element'); - } -}, 'Document, loaded into browsing context, must have a new empty registry'); - - -testInIFrame('../resources/blank.html', function(loadedDocument) { - var createdDocument = document.implementation.createHTMLDocument('Test Document'); - // Let's check that loadedDocument and createdDocument use different registeries. - createdDocument.registerElement('x-element'); - try { - loadedDocument.registerElement('x-element'); - } catch (e) { - assert_unreached('Unexpected exception while registering a custom element ' + - 'in a document, which has it\'s own registry'); - } -}, 'Document, loaded into browsing context, must have a new empty registry, ' + - 'which is different from other documents\' registries'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/no-registry-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/no-registry-test.html deleted file mode 100644 index d936fd34f7b..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/no-registry-test.html +++ /dev/null @@ -1,48 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>New document without browsing context must not have a registry</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="In all other cases, new documents must not have a registry."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#creating-and-passing-registries"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = document.implementation.createDocument(null, 'test', null); - assert_throws( - 'NotSupportedError', - function() { doc.registerElement('x-element'); }, - 'Registering valid custom element in a document ' + - 'without registry should fail'); -}, 'Document of type other than HTML, not loaded into browsing context, must not have a registry'); - -async_test(function(t) { - var request = new XMLHttpRequest(); - request.onreadystatechange = t.step_func(function() { - if (request.readyState == 4){ - assert_equals(200, request.status, 'Test document is not loaded correctly'); - var doc = request.response; - assert_true(doc instanceof HTMLDocument, - 'XMLHttpRequest\'s asynchronous response should be HTML document'); - assert_throws( - 'NotSupportedError', - function() { doc.registerElement('x-element'); }, - 'Registering valid custom element in ' + - 'an XMLHttpRequest\'s response document should fail'); - t.done(); - } - }); - - request.open('GET', '../resources/blank.html', true); - request.responseType = 'document'; - request.send(); -}, 'XMLHttpRequest\'s asynchronous response HTML document must not have a registry'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/share-registry-create-document.html b/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/share-registry-create-document.html deleted file mode 100644 index 64244f169c8..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/share-registry-create-document.html +++ /dev/null @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document, created with createHTMLDocument or createDocument with HTML namespace, should share registry with the associated document</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="When DOMImplementation's createDocument method is invoked with namespace set to HTML Namespace or when the createHTMLDocument method is invoked, use the registry of the associated document to the new instance."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#creating-and-passing-registries"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name = 'x-frame'; - - var GeneratedConstructor = doc.registerElement(name); - var doc2 = doc.implementation.createHTMLDocument('Document 2'); - assert_throws( - 'NotSupportedError', - function() { doc2.registerElement(name); }, - 'Registering a custom element type name that is already registered in a shared ' + - 'registry should throw an exception'); - - var xframe = doc2.createElement(name); - assert_true(xframe instanceof GeneratedConstructor, - 'Created element should be x-frame instance'); -}, 'Document created by createHTMLDocument should share an existing registry'); - - -test(function() { - var doc = newHTMLDocument(); - var name = 'x-frame-1'; - - var GeneratedConstructor = doc.registerElement(name); - var doc2 = doc.implementation.createDocument(HTML_NAMESPACE, 'html', null); - assert_throws( - 'NotSupportedError', - function() { doc2.registerElement(name); }, - 'Exception should be thrown for custom element, ' + - 'which is already registered in shared registry'); - - var xframe = doc2.createElement(name); - assert_true(xframe instanceof GeneratedConstructor, - 'Created element should be x-frame instance'); -}, 'Document created by createDocument with HTML namespace should share an existing registry'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/share-registry-import-document.html b/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/share-registry-import-document.html deleted file mode 100644 index 251e4f123ee..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/creating-and-passing-registries/share-registry-import-document.html +++ /dev/null @@ -1,95 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>When creating an import, use the registry of the master document</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="When creating an import, use the registry of the master document."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#creating-and-passing-registries"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -var test1 = async_test('Registry of the imported document should be shared with master document. ' + - 'Import is asynchronous'); -test1.step(function() { - var iframe = newIFrame('../resources/import-master-async.html'); - document.body.appendChild(iframe); - iframe.onload = test1.step_func(function() { - var doc = iframe.contentDocument; - var link = doc.querySelector('link[rel=import]'); - link.onload = test1.step_func(function() { - try { - var doc2 = link.import; - var name = 'x-frame'; - doc.registerElement(name); - assert_throws( - 'NotSupportedError', - function() { doc2.registerElement(name); }, - 'Registering a custom element type name that is already registered in a shared ' + - 'registry should throw an exception'); - test1.done(); - } finally { - iframe.remove(); - } - }); - }); -}); - - -var test2 = async_test('Registry of the master document should be shared with imported document. ' + - 'Import is asynchronous'); -test2.step(function() { - var iframe = newIFrame('../resources/import-master-async.html'); - document.body.appendChild(iframe); - iframe.onload = test2.step_func(function() { - var doc = iframe.contentDocument; - var link = doc.querySelector('link[rel=import]'); - link.onload = test2.step_func(function() { - try { - var doc2 = link.import; - var name = 'x-frame'; - doc2.registerElement(name); - assert_throws( - 'NotSupportedError', - function() { doc.registerElement(name); }, - 'Registering a custom element type name that is already registered in a shared ' + - 'registry should throw an exception'); - test2.done(); - } finally { - iframe.remove(); - } - }); - }); -}); - - -testInIFrame('../resources/import-master.html', function(doc) { - var link = doc.querySelector('link[rel=import]'); - var doc2 = link.import; - var name = 'x-frame'; - doc.registerElement(name); - assert_throws( - 'NotSupportedError', - function() { doc2.registerElement(name); }, - 'Registering a custom element type name that is already registered in a shared ' + - 'registry should throw an exception'); -}, 'Registry of the imported document should be shared with master document. Import is syncronous'); - - -testInIFrame('../resources/import-master.html', function(doc) { - var link = doc.querySelector('link[rel=import]'); - var doc2 = link.import; - var name = 'x-frame'; - doc2.registerElement(name); - assert_throws( - 'NotSupportedError', - function() { doc.registerElement(name); }, - 'Registering a custom element type name that is already registered in a shared ' + - 'registry should throw an exception'); -}, 'Registry of the master document should be shared with imported document. Import is syncronous'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/enqueuing-and-invoking-callbacks/invoke-callbacks.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/enqueuing-and-invoking-callbacks/invoke-callbacks.html deleted file mode 100644 index 97fb735607c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/enqueuing-and-invoking-callbacks/invoke-callbacks.html +++ /dev/null @@ -1,60 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Invoke CALLBACK with ELEMENT as callback this value</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Invoke CALLBACK with ELEMENT as callback this value"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#enqueuing-and-invoking-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - doc.body.innerHTML = '<x-a id="x-a"></x-a>'; - assert_equals(doc.querySelector('#x-a'), proto.createdCallbackThis, - '\'this\' value of the created callback should be the custom element'); -}, 'Test \'this\' value inside created callback.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - assert_equals(doc.querySelector('#x-element'), proto.attachedCallbackThis, - '\'this\' value of the attached callback should be the custom element'); -}, 'Test \'this\' value inside attached callback.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - doc.body.removeChild(customElement); - assert_equals(customElement, proto.detachedCallbackThis, - '\'this\' value of the detached callback should be the custom element'); -}, 'Test \'this\' value inside detached callback.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-b', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - customElement.setAttribute('class', 'someClass'); - assert_equals(customElement, proto.attributeChangedCallbackThis, - '\'this\' value of the attributeChanged callback should be the custom element'); -}, 'Test \'this\' value inside attributeChanged callback.'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-move-element-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-move-element-test.html deleted file mode 100644 index df4df553525..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-move-element-test.html +++ /dev/null @@ -1,159 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Attached callback of a custom element should be called if element is moved</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="attached callback ... must be enqueued whenever custom element is inserted into a document and this document has a browsing context."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-a', {prototype: proto}); - var customElement = doc.createElement('x-a'); - - doc.body.appendChild(customElement); - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached ' + - 'should not be called in documents that do not have a browsing context'); - - var divElement = doc.createElement('div'); - doc.body.appendChild(divElement); - divElement.appendChild(customElement); - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached ' + - 'should not be called in documents that do not have a browsing context'); -}, 'Test attached callback if moving custom element inside document ' + - 'without browsing context'); - - -testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) { - var docNoBrowsingContext = newHTMLDocument(); - var proto1 = newHTMLElementPrototype(); - docNoBrowsingContext.registerElement('x-b', {prototype: proto1}); - - var customElement = docNoBrowsingContext.createElement('x-b'); - docNoBrowsingContext.body.appendChild(customElement); - assert_equals(proto1.attachedCallbackCalledCounter, 0, - 'Callback attached should not be called ' + - 'in documents that do not have a browsing context'); - - var proto2 = newHTMLElementPrototype(); - docWithBrowsingContext.registerElement('x-b', {prototype: proto2}); - docWithBrowsingContext.body.appendChild(customElement); - assert_equals(proto1.attachedCallbackCalledCounter, 1, - 'Callback attached should be called in documents with browsing context'); - assert_equals(proto2.attachedCallbackCalledCounter, 0, - 'Callback attached, defined in receiving document, should not be called'); -}, 'Test attached callback if moving custom element from ' + - 'document without browsing context to document with browsing context'); - - -testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) { - var proto1 = newHTMLElementPrototype(); - docWithBrowsingContext.registerElement('x-c', {prototype: proto1}); - - var customElement = docWithBrowsingContext.createElement('x-c'); - docWithBrowsingContext.body.appendChild(customElement); - assert_equals(proto1.attachedCallbackCalledCounter, 1, - 'Callback attached should be called in documents with browsing context'); - - var docNoBrowsingContext = newHTMLDocument(); - var proto2 = newHTMLElementPrototype(); - docNoBrowsingContext.registerElement('x-c', {prototype: proto2}); - docNoBrowsingContext.body.appendChild(customElement); - assert_equals(proto1.attachedCallbackCalledCounter, 1, 'Callback attached should not be called ' + - 'in documents that do not have a browsing context'); - assert_equals(proto2.attachedCallbackCalledCounter, 0, - 'Callback attached, defined in receiving document, should not be called'); -}, 'Test attached callback if moving custom element from ' + - 'document with browsing context to document without browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-d', {prototype: proto}); - - var customElement = doc.createElement('x-d'); - doc.body.appendChild(customElement); - assert_equals(proto.attachedCallbackCalledCounter, 1, - 'Callback attached should be called in documents with browsing context'); - - var divElement = doc.createElement('div'); - doc.body.appendChild(divElement); - divElement.appendChild(customElement); - assert_equals(proto.attachedCallbackCalledCounter, 2, - 'Callback attached should be called in documents with browsing context'); -}, 'Test attached callback if moving custom element inside document ' + - 'with browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-e', {prototype: proto}); - - var customElement = doc.createElement('x-e'); - doc.body.appendChild(customElement); - assert_equals(proto.attachedCallbackCalledCounter, 1, - 'Callback attached should be called in documents with browsing context'); - - var divElement = doc.createElement('div'); - divElement.appendChild(customElement); - assert_equals(proto.attachedCallbackCalledCounter, 1, - 'Callback attached should not be called if element is not appended to the document'); - - doc.body.appendChild(divElement); - assert_equals(proto.attachedCallbackCalledCounter, 2, - 'Callback attached should be called in documents with browsing context'); -}, 'Test attached callback if indirectly moving custom element inside document ' + - 'with browsing context'); - - -var moveTest = async_test('Test attached callback if moving custom element from ' + - 'document with browsing context to document with browsing context'); - -moveTest.step(function() { - var iframe1 = newIFrame('../../resources/blank.html'); - iframe1.onload = moveTest.step_func(function() { - var doc1 = iframe1.contentDocument; - - // register custom element type - var proto1 = newHTMLElementPrototype(); - doc1.registerElement('x-f', {prototype: proto1}); - - // create custom element - var customElement = doc1.createElement('x-f'); - doc1.body.appendChild(customElement); - assert_equals(proto1.attachedCallbackCalledCounter, 1, - 'Callback attached should be called in documents with browsing context'); - - // create second iframe - var iframe2 = newIFrame('../../resources/x-element.html'); - iframe2.onload = moveTest.step_func(function() { - var doc2 = iframe2.contentDocument; - - // register custom element type - var proto2 = newHTMLElementPrototype(); - doc2.registerElement('x-f', {prototype: proto2}); - - // move element - doc2.body.appendChild(customElement); - assert_equals(proto1.attachedCallbackCalledCounter, 2, - 'Callback attached should be called in documents with browsing context'); - assert_equals(proto2.attachedCallbackCalledCounter, 0, - 'Callback attached, defined in receiving document, should not be called'); - - // test clean up - iframe1.remove(); - iframe2.remove(); - moveTest.done(); - }); - }); -}); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-test.html deleted file mode 100644 index a4cc0b746cc..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-test.html +++ /dev/null @@ -1,117 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Attached callback of a custom element should be called </title> -<meta name="timeout" content="long"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="attached callback ... must be enqueued whenever custom element is inserted into a document and this document has a browsing context."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto}); - var customElement = new GeneratedConstructor(); - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached ' + - 'should not be called in documents that do not have a browsing context'); -}, 'Test attached callback if custom element is instantiated via constructor. ' + - 'Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-b', {prototype: proto}); - doc.body.innerHTML = '<x-b></x-b>'; - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached ' + - 'should not be called in documents that do not have a browsing context'); -}, 'Test attached callback if custom element is created via innerHTML property. ' + - 'Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-c></x-c>'; - var proto = newHTMLElementPrototype(); - doc.registerElement('x-c', {prototype: proto}); - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached ' + - 'should not be called in documents that do not have a browsing context'); -}, 'Test attached callback if custom element is created via innerHTML property before ' + - 'registration. Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-d id="x-d"></x-d>'; - var customElement = doc.querySelector('#x-d'); - - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-d', {prototype: proto}); - - customElement.constructor.prototype = proto; - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached should ' + - 'not be called for unregistered custom element in document without browsing context'); -}, 'Test attached callback if custom element is unregistered'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.attachedCallbackCalledCounter, 1, 'Callback attached should be ' + - 'called in documents with browsing context'); -}, 'Test attached callback. Document has browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var x = doc.createElement('x-element'); - assert_equals(proto.attachedCallbackCalledCounter, 0, 'Callback attached should not ' + - 'be called before element is added to document with browsing context'); - - doc.body.appendChild(x); - assert_equals(proto.attachedCallbackCalledCounter, 1, 'Callback attached should be called ' + - 'in documents with browsing context'); -}, 'Test attached callback. Registered element is created via document.createElement(). ' + - 'Document has browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var x = doc.createElement('x-element'); - doc.body.appendChild(x); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.attachedCallbackCalledCounter, 1, 'Callback attached should ' + - 'be called in documents with browsing context'); -}, 'Test attached callback. Unregistered element is created via document.createElement(). ' + - 'Document has browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - doc.body.innerHTML = '<x-element></x-element>'; - assert_equals(proto.attachedCallbackCalledCounter, 1, 'Callback attached should ' + - 'be called in documents with browsing context'); -}, 'Test attached callback. Registered element is created via innerHTML property. ' + - 'Document has browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - doc.body.innerHTML = '<x-element></x-element>'; - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.attachedCallbackCalledCounter, 1, 'Callback attached should ' + - 'be called in documents with browsing context'); -}, 'Test attached callback. Unresolved element is created via innerHTML property. ' + - 'Document has browsing context'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-change-attribute-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-change-attribute-test.html deleted file mode 100644 index cd5f3a4b8c6..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-change-attribute-test.html +++ /dev/null @@ -1,229 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Test attributeChanged callback is called if custom element attribute value is changed</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="attributeChanged callback must be enqueued whenever custom element's attribute is added, changed or removed"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - customElement.setAttribute('class', 'someClass'); - proto.attributeChangedCallbackCalledCounter = 0; - customElement.setAttribute('class', 'someClass2'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is changed by method ' + - 'setAttribute(). The custom element is created via constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-b', {prototype: proto}); - - doc.body.innerHTML = '<x-b id="x-b" class="oldValue"></x-b>'; - var customElement = doc.querySelector('#x-b'); - customElement.setAttribute('class', 'newValue'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'oldValue', 'newValue'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is changed by method ' + - 'setAttribute(). The custom element is created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-c', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - customElement.setAttribute('class', 'someClass'); - proto.attributeChangedCallbackCalledCounter = 0; - customElement.classList.add('someClass3'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is changed by method ' + - 'classList.add(). The custom element is created via constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-d', {prototype: proto}); - - doc.body.innerHTML = '<x-d id="x-d" class="oldValue"></x-d>'; - var customElement = doc.querySelector('#x-d'); - customElement.classList.add('newestValue'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'oldValue', 'oldValue newestValue'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is changed by method ' + - 'classList.add(). The custom element is created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-e', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - customElement.setAttribute('class', 'someClass'); - proto.attributeChangedCallbackCalledCounter = 0; - customElement.id = 'someId'; - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is changed as property. ' + - 'The custom element is created via constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-f', {prototype: proto}); - - doc.body.innerHTML = '<x-f id="x-f" class="oldValue"></x-f>'; - var customElement = doc.querySelector('#x-f'); - customElement.className = 'lastValue'; - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'oldValue', 'lastValue'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is changed as property. ' + - 'The custom element is created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-g', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - customElement.setAttribute('class', 'someClass someSuperClass'); - proto.attributeChangedCallbackCalledCounter = 0; - customElement.classList.toggle('someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is changed by classList.toggle(). ' + - 'The custom element is created via constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-h', {prototype: proto}); - - doc.body.innerHTML = '<x-h id="x-h" class="oldValue lastValue"></x-h>'; - var customElement = doc.querySelector('#x-h'); - customElement.classList.toggle('lastValue'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'oldValue lastValue', 'oldValue'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is changed by classList.toggle(). ' + - 'The custom element is created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-i id="x-i" class="oldValue"></x-i>'; - var customElement = doc.querySelector('#x-i'); - customElement.setAttribute('class', 'newValue'); - customElement.setAttribute('class', 'newestValue'); - - var proto = newHTMLElementPrototype(); - doc.registerElement('x-i', {prototype: proto}); - - assert_equals(proto.attributeChangedCallbackCalledCounter, 0, - 'Callback attributeChanged should not be called'); - - customElement.setAttribute('class', 'rightValue'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should not be called'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'newestValue', 'rightValue'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback is not called if custom element is not registered'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('class', 'firstValue'); - customElement.setAttribute('class', 'secondValue'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 2, 'Callback ' + - 'attributeChanged should be called after call to setAttribute()'); - - customElement.classList.add('someClass3'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 3, 'Callback ' + - 'attributeChanged should be called after call to classList.add()'); - - customElement.id = 'someId'; - assert_equals(proto.attributeChangedCallbackCalledCounter, 4, 'Callback ' + - 'attributeChanged should be called after changing attribute as property'); -}, 'Test attributeChanged callback is called if attribute value is changed. ' + - 'The document has browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - var customElement = doc.querySelector('#x-element'); - - customElement.setAttribute('class', 'firstValue'); - customElement.setAttribute('class', 'secondValue'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'firstValue', 'secondValue'], - 'Unexpected callback attributeChanged arguments after call to setAttribute()'); - - customElement.classList.add('newestValue'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'secondValue', 'secondValue newestValue'], - 'Unexpected callback attributeChanged arguments after call to classList.add()'); - - customElement.className = 'lastValue'; - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'secondValue newestValue', 'lastValue'], - 'Unexpected callback attributeChanged arguments after changing attribute as property'); -}, 'Test attributeChanged callback arguments if attribute value is changed. ' + - 'The document has browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('class', 'firstValue'); - customElement.setAttribute('class', 'secondValue'); - - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - customElement.setAttribute('class', 'thirdValue'); - - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'secondValue', 'thirdValue'], - 'Unexpected callback attributeChanged arguments after setAttribute() call'); -}, 'Test attributeChanged callback is not called if custom element is not registered. ' + - 'The document has browsing context'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-remove-attribute-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-remove-attribute-test.html deleted file mode 100644 index fb451b074cc..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-remove-attribute-test.html +++ /dev/null @@ -1,166 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Test attribute removing to check attributeChanged callback of a custom element</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="attributeChanged callback must be enqueued whenever custom element's attribute is removed"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - //attributeChangedCallback should be called the first time here - customElement.setAttribute('class', 'someClass'); - //attributeChangedCallback should be called the second time here - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 2, 'Callback attributeChanged should be called ' + - 'after setAttribute() and removeAttribute() calls'); -}, 'Test attributeChanged callback if attribute is removed. ' + - 'The custom element created via constructor'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(element) { - var obj = doc.createElement(element); - var proto = newCustomElementPrototype(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-' + element + '-' + element + '-1', { - prototype: proto, - extends: element - }); - - var customElement = new GeneratedConstructor(); - //attributeChangedCallback should be called the first time here - customElement.setAttribute('class', 'someClass'); - //attributeChangedCallback should be called the second time here - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 2, - 'Callback attributeChanged should be called ' + - 'after setAttribute() and removeAttribute() calls for "' + element + '"'); - }); -}, 'Test attributeChanged callback if attribute is removed. ' + - 'The custom element created via constructor and extends HTML element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-b', {prototype: proto}); - - doc.body.innerHTML = '<x-b id="x-b" class="theClass"></x-b>'; - var customElement = doc.querySelector('#x-b'); - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called ' + - 'after removeAttribute() call'); -}, 'Test attributeChanged callback if attribute is removed. ' + - 'The custom element created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-c', {prototype: proto}); - - doc.body.innerHTML = '<x-c id="x-c" class="theClass"></x-c>'; - var customElement = doc.querySelector('#x-c'); - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackArgs[2], null, - 'Removing an attribute should invoke ' + - 'the attributeChanged callback with a null new value'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'theClass', null], - 'Unexpected attributeChanged callback arguments'); -}, 'Test attributeChanged callback arguments if attribute is removed. ' + - 'The custom element created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.body.innerHTML = '<x-d id="x-d" class="theClass"></x-d>'; - var customElement = doc.querySelector('#x-d'); - // this should not call or enqueue attributeChangedCallback - customElement.setAttribute('class', 'someClass'); - // this one should not too - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 0, - 'Callback attributeChanged should not be called'); - - doc.registerElement('x-d', {prototype: proto}); - // this call invokes attributeChangedCallback - customElement.setAttribute('name', 'someName'); - // and this one - customElement.removeAttribute('name'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 2, - 'Callback attributeChanged should be called ' + - 'after setAttribute() and removeAttribute() calls'); -}, 'Test attributeChanged callback is not called if attribute is removed. ' + - 'The custom element created via innerHTML property and unresolved at first'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('class', 'someClass'); - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 2, - 'Callback attributeChanged should be called ' + - 'after setAttribute() and removeAttribute() calls'); -}, 'Test attributeChanged callback is called if attribute is removed. ' + - 'The custom element created via constructor and the document has browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - doc.body.innerHTML = '<x-element id="x-element" class="theClass"></x-element>'; - var customElement = doc.querySelector('#x-element'); - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackArgs[2], null, - 'Removing an attribute should invoke ' + - 'the attributeChanged callback with a null new value'); - assert_array_equals(proto.attributeChangedCallbackArgs, - ['class', 'theClass', null], - 'Unexpected attributeChanged callback arguments'); -}, 'Test attributeChanged callback arguments if attribute is removed. ' + - 'The custom element created via innerHTML property and the document has browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var customElement = doc.querySelector('#x-element'); - // this should not call or enqueue attributeChangedCallback - customElement.setAttribute('name', 'someName'); - // this one too - customElement.removeAttribute('name'); - - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.attributeChangedCallbackCalledCounter, 0, - 'Callback attributeChanged should not be called'); - // this call invokes attributeChangedCallback - customElement.setAttribute('class', 'someClass'); - // this call invokes attributeChangedCallback at second time - customElement.removeAttribute('class'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 2, - 'Callback attributeChanged should be called ' + - 'after setAttribute() and removeAttribute() calls'); -}, 'Test attributeChanged callback if attribute is removed. ' + - 'The custom element created via innerHTML property and unresolved at first. ' + - 'The document has browsing context'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-set-attribute-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-set-attribute-test.html deleted file mode 100644 index 1c4ab8618a9..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-set-attribute-test.html +++ /dev/null @@ -1,338 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Test attributeChanged callback is called if custom element attribute value is set</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="attributeChanged callback ... must be enqueued whenever custom element's attribute is added, changed or removed."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.setAttribute('class', 'someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set by method ' + - 'setAttribute(). The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-b', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.setAttribute('class', 'someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set by method ' + - 'setAttribute(). The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-c', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.classList.add('someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set by method ' + - 'classList.add(). The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-d', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.classList.add('someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set by method ' + - 'classList.add(). The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-e', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.classList.toggle('someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set by method ' + - 'classList.toggle(). The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-f', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.classList.toggle('someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set by method ' + - 'classList.toggle(). The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-g', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.className = 'someClass'; - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set as property. ' + - 'The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-h', {prototype: proto}); - - var customElement = new GeneratedConstructor(); - customElement.className = 'someClass'; - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set as property. '+ - 'The custom element is created via constructor.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-i', {prototype: proto}); - - doc.body.innerHTML = '<x-i id="x-i" class="theClass"></x-i>'; - assert_equals(proto.attributeChangedCallbackCalledCounter, 0, - 'Callback attributeChanged should not be called'); -}, 'Test attributeChanged callback is not called if attribute value is specified in HTML. '+ - 'The custom element is created via innerHTML property.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-j', {prototype: proto}); - - doc.body.innerHTML = '<x-j id="x-j" class="theClass"></x-j>'; - var customElement = doc.querySelector('#x-j'); - customElement.setAttribute('class', 'someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set by method setAttribute(). '+ - 'The custom element is created via innerHTML property.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-k', {prototype: proto}); - - doc.body.innerHTML = '<x-k id="x-k"></x-k>'; - var customElement = doc.querySelector('#x-k'); - customElement.setAttribute('class', 'someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set by method setAttribute(). '+ - 'The custom element is created via innerHTML property.'); - - -test(function() { - var doc = newHTMLDocument(); - - doc.body.innerHTML = '<x-l id="x-l"></x-l>'; - var customElement = doc.querySelector('#x-l'); - // this call shouldn't invoke or enqueue the callback - customElement.setAttribute('class', 'someClass'); - - var proto = newHTMLElementPrototype(); - doc.registerElement('x-l', {prototype: proto}); - assert_equals(proto.attributeChangedCallbackCalledCounter, 0, - 'Callback attributeChanged should not be called'); - // this one should - customElement.setAttribute('class', 'someClass2'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is not called if attribute value of unresolved element '+ - 'is set by method setAttribute().'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(element) { - var obj = doc.createElement(element); - var proto = newCustomElementPrototype(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-' + element + '-' + element + '-1', { - prototype: proto, - extends: element - }); - - var customElement = new GeneratedConstructor(); - customElement.setAttribute('class', 'someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - }); -}, 'Test attributeChanged callback of the custom element that extends some HTML element. ' + - 'Test that the callback is called'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(element) { - var obj = doc.createElement(element); - var proto = newCustomElementPrototype(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-' + element + '-' + element + '-1-1', { - prototype: proto, - extends: element - }); - - var customElement = new GeneratedConstructor(); - customElement.classList.add('someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - }); -}, 'Test attributeChanged callback is called if attribute is set by method classList.add(). '+ - 'The custom element extends some HTML element.'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(element) { - var obj = doc.createElement(element); - var proto = newCustomElementPrototype(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-' + element + '-' + element + '-2', { - prototype: proto, - extends: element - }); - - var customElement = new GeneratedConstructor(); - customElement.setAttribute('class', 'someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); - }); -}, 'Test attributeChanged callback arguments if attribute value is set by method setAttribute(). '+ - 'The custom element extends some HTML element.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('class', 'someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set by method setAttribute(). '+ - 'The document has browsing context.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('class', 'someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set by method setAttribute(). '+ - 'The document has browsing context.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - customElement.classList.add('someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is called if attribute value is set by method classList.add(). '+ - 'The document has browsing context.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - customElement.classList.add('someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); -}, 'Test attributeChanged callback arguments if attribute value is set by method classList.add(). '+ - 'The document has browsing context.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var customElement = doc.querySelector('#x-element'); - // this call shouldn't invoke or enqueue the callback - customElement.setAttribute('name', 'someName'); - - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.attributeChangedCallbackCalledCounter, 0, - 'Callback attributeChanged should not be called'); - // this one should - customElement.setAttribute('class', 'someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); -}, 'Test attributeChanged callback is not called if attribute value of unresolved element '+ - 'is set by method setAttribute(). The document has browsing context.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - HTML5_ELEMENTS.forEach(function(element) { - var obj = doc.createElement(element); - var proto = newCustomElementPrototype(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-' + element + '-' + element + '-1', { - prototype: proto, - extends: element - }); - - var customElement = new GeneratedConstructor(); - customElement.setAttribute('class', 'someClass'); - assert_equals(proto.attributeChangedCallbackCalledCounter, 1, - 'Callback attributeChanged should be called'); - }); -}, 'Test attributeChanged callback is called if attribute value is set by method setAttribute(). '+ - 'The document has browsing context. The custom element extends some HTML element.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - HTML5_ELEMENTS.forEach(function(element) { - var obj = doc.createElement(element); - var proto = newCustomElementPrototype(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-' + element + '-' + element + '-2', { - prototype: proto, - extends: element - }); - - var customElement = new GeneratedConstructor(); - customElement.setAttribute('class', 'someClass'); - assert_array_equals(proto.attributeChangedCallbackArgs, ['class', null, 'someClass'], - 'Unexpected callback attributeChanged arguments'); - }); -}, 'Test attributeChanged callback arguments if attribute value is set by method setAttribute(). '+ - 'The document has browsing context. The custom element extends some HTML element.'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-element-prototype-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-element-prototype-test.html deleted file mode 100644 index 188957c1ac0..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-element-prototype-test.html +++ /dev/null @@ -1,87 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>The custom element prototype must be set just prior to invoking created callback</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="The custom element prototype must be set just prior to invoking callback."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.body.innerHTML = '<x-a></x-a>'; - doc.registerElement('x-a', {prototype: proto}); - assert_equals(proto.createdCallbackThis.constructor.prototype, proto, - 'The custom element prototype is incorrect inside created callback'); -}, 'Test custom element prototype inside created callback when custom element is created ' + - 'in HTML before registration of a custom element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.registerElement('x-b', {prototype: proto}); - doc.body.innerHTML = '<x-b></x-b>'; - assert_equals(proto.createdCallbackThis.constructor.prototype, proto, - 'The custom element prototype is incorrect inside created callback'); -}, 'Test custom element prototype inside created callback when custom element is created ' + - 'in HTML after registration of a custom element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var customElement = doc.createElement('x-c'); - - doc.body.appendChild(customElement); - doc.registerElement('x-c', {prototype: proto}); - assert_equals(proto.createdCallbackThis.constructor.prototype, proto, - 'The custom element prototype is incorrect inside created callback'); -}, 'Test custom element prototype inside created callback when custom element is created ' + - 'via document.createElement() before registration of a custom element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-d', {prototype: proto}); - - var customElement = doc.createElement('x-d'); - doc.body.appendChild(customElement); - assert_equals(proto.createdCallbackThis.constructor.prototype, proto, - 'The custom element prototype is incorrect inside created callback'); -}, 'Test custom element prototype inside created callback when custom element is created ' + - 'via document.createElement() after registration of a custom element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-e', {prototype: proto}); - var customElement = new GeneratedConstructor(); - - assert_equals(proto.createdCallbackThis.constructor.prototype, proto, - 'The custom element prototype is incorrect inside created callback'); -}, 'Test custom element prototype inside created callback when custom element is created ' + - 'via constructor returned by method registerElement'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.createdCallbackThis.constructor.prototype, proto, - 'The custom element prototype is incorrect inside created callback'); -}, 'Test custom element prototype inside created callback when custom element is created ' + - 'by UA parser before registration of a custom element'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-order-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-order-test.html deleted file mode 100644 index b0f2d5ee8bf..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-order-test.html +++ /dev/null @@ -1,242 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>All other callbacks must not be enqueued until after the created callback's invocation had started</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="All other callbacks must not be enqueued until after the created callback's invocation had started."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -function newPrototypeWithCallbackLog() { - var proto = Object.create(HTMLElement.prototype); - proto.callbackLog = []; - proto.createdCallback = function() { - proto.callbackLog.push('created'); - }; - proto.attachedCallback = function() { - proto.callbackLog.push('attached'); - }; - proto.attributeChangedCallback = function() { - proto.callbackLog.push('attributeChanged'); - }; - proto.detachedCallback = function() { - proto.callbackLog.push('detached'); - }; - return proto; -} - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newPrototypeWithCallbackLog(); - doc.registerElement('x-a', {prototype: proto}); - doc.body.innerHTML = '<x-a></x-a>'; - - assert_equals(proto.callbackLog[0], 'created', 'The callback ' + - proto.callbackLog[0] + ' should be enqueued after created callback'); - assert_in_array('attached', proto.callbackLog, 'The callback ' + - 'attached should be called'); -}, 'Test attached callback is enqueued after created callback'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newPrototypeWithCallbackLog(); - doc.registerElement('x-b', {prototype: proto}); - doc.body.innerHTML = '<x-b id="x-b"></x-b>'; - var customElement = doc.querySelector('#x-b'); - customElement.setAttribute('key', 'value'); - - assert_equals(proto.callbackLog[0], 'created', 'The callback ' + - proto.callbackLog[0] + ' should not be enqueued before created callback'); - assert_in_array('attributeChanged', proto.callbackLog, - 'The callback attributeChanged should be called'); -}, 'Test attributeChanged callback is enqueued after created callback. ' + - 'Document has browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newPrototypeWithCallbackLog(); - doc.registerElement('x-c', {prototype: proto}); - doc.body.innerHTML = '<x-c id="x-c"></x-c>'; - var customElement = doc.querySelector('#x-c'); - customElement.setAttribute('key', 'value'); - assert_equals(proto.callbackLog[0], 'created', 'The callback ' + - proto.callbackLog[0] + ' should not be enqueued before created callback'); - assert_in_array('attributeChanged', proto.callbackLog, - 'The callback attributeChanged should be called'); -}, 'Test attributeChanged callback is enqueued after created callback. ' + - 'Document has no browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newPrototypeWithCallbackLog(); - doc.registerElement('x-element', {prototype: proto}); - var customElement = doc.querySelector('#x-element'); - doc.body.removeChild(customElement); - - assert_equals(proto.callbackLog[0], 'created', 'The callback ' + - proto.callbackLog[0] + ' should not be enqueued before created callback'); - assert_in_array('detached', proto.callbackLog, - 'The callback detached should be called'); -}, 'Test detached callback is enqueued after created callback.'); - - -test(function() { - var doc = newHTMLDocument(); - var proto1 = newPrototypeWithCallbackLog(); - proto1.createdCallback = function() { - proto1.callbackLog.push('created'); - var xe = doc.querySelector('#x-e'); - xe.setAttribute('key', 'value'); - }; - var proto2 = newPrototypeWithCallbackLog(); - - doc.registerElement('x-d', {prototype: proto1}); - doc.registerElement('x-e', {prototype: proto2}); - doc.body.innerHTML = '<x-d><x-e id="x-e"></x-e></x-d>'; - - assert_array_equals(proto2.callbackLog, ['created'], - 'attributeChanged callback should not be enqueued before created callback'); -}, 'Test attributeChanged callback is not enqueued before created callback started. ' + - 'Document has no browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto1 = newPrototypeWithCallbackLog(); - proto1.createdCallback = function() { - proto1.callbackLog.push('created'); - var xe = doc.querySelector('#x-g'); - xe.setAttribute('key', 'value'); - }; - var proto2 = newPrototypeWithCallbackLog(); - - doc.registerElement('x-f', {prototype: proto1}); - doc.registerElement('x-g', {prototype: proto2}); - doc.body.innerHTML = '<x-f><x-g id="x-g"></x-g></x-f>'; - - assert_array_equals(proto2.callbackLog, ['created', 'attached'], - 'attributeChanged callback should not be called before created callback started'); -}, 'Test attributeChanged callback is not enqueued before created callback started. ' + - 'Document has browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newPrototypeWithCallbackLog(); - proto.createdCallback = function() { - proto.callbackLog.push('created'); - this.setAttribute('key', 'value'); - }; - doc.registerElement('x-h', {prototype: proto}); - doc.body.innerHTML = '<x-h></x-h>'; - - assert_array_equals(proto.callbackLog, ['created', 'attributeChanged'], - 'attributeChanged callback should be enqueued after created callback'); -}, 'Test attributeChanged callback is enqueued after created callback started. ' + - 'Document has no browsing context'); - - -testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) { - var docNoBrowsingContext = newHTMLDocument(); - - var proto1 = newPrototypeWithCallbackLog(); - var proto2 = newPrototypeWithCallbackLog(); - proto1.createdCallback = function() { - proto1.callbackLog.push('created'); - var xk = docNoBrowsingContext.querySelector('#x-k'); - assert_equals(proto2.callbackLog.length, 0, 'Created callback for x-k ' + - 'should not be called before created callback for x-i'); - docWithBrowsingContext.body.appendChild(xk); - }; - - docNoBrowsingContext.registerElement('x-i', {prototype: proto1}); - docNoBrowsingContext.registerElement('x-k', {prototype: proto2}); - docNoBrowsingContext.body.innerHTML = '<x-i><x-k id="x-k"></x-k></x-i>'; - - // Though at the moment of inserting <x-k> into docWithBrowsingContext - // created callback is not called for <x-k> yet, attached calback is enqueued - // anyway. Because specification for setting custom element prototype algorithm reads: - // .... - // 3. If ELEMENT is in a document and this document has a browsing context: - // 1. Enqueue attached callback for ELEMENT - // - // Changes in the specification will follow, to reflect this exceptional case. - assert_array_equals(proto2.callbackLog, ['created', 'attached'], - 'attached callback should be enqueued when custom element prototype is set'); -}, 'Test attached callback is enqueued after created callback, but before created callback had started'); - - -testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) { - var docNoBrowsingContext = newHTMLDocument(); - - var proto = newPrototypeWithCallbackLog(); - proto.createdCallback = function() { - proto.callbackLog.push('created'); - docWithBrowsingContext.body.appendChild(this); - }; - - docNoBrowsingContext.registerElement('x-l', {prototype: proto}); - docNoBrowsingContext.body.innerHTML = '<x-l></x-l>'; - assert_array_equals(proto.callbackLog, ['created', 'attached'], - 'attached callback should be enqueued after created callback had started'); -}, 'Test attached callback is enqueued after created callback had started'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto1 = newPrototypeWithCallbackLog(); - var proto2 = newPrototypeWithCallbackLog(); - proto1.createdCallback = function() { - proto1.callbackLog.push('created'); - var xn = doc.querySelector('#x-n'); - assert_equals(proto2.callbackLog.length, 0, 'Created callback for x-n ' + - 'should not be called before created callback for x-m'); - this.removeChild(xn); - }; - - doc.registerElement('x-m', {prototype: proto1}); - doc.registerElement('x-n', {prototype: proto2}); - doc.body.innerHTML = '<x-m><x-n id="x-n"></x-n></x-m>'; - assert_array_equals(proto2.callbackLog, ['created'], - 'detached callback should not be enqueued before created callback had started'); -}, 'Test detached callback is not enqueued before created callback had started'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newPrototypeWithCallbackLog(); - proto.createdCallback = function() { - proto.callbackLog.push('created'); - this.remove(); - }; - - doc.registerElement('x-o', {prototype: proto}); - doc.body.innerHTML = '<x-o></x-o>'; - - assert_array_equals(proto.callbackLog, ['created', 'attached', 'detached'], - 'detached callback should be enqueued after created callback had started'); -}, 'Test detached callback is enqueued after created callback had started'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newPrototypeWithCallbackLog(); - doc.registerElement('x-element', {prototype: proto}); - - // Though at the moment of inserting <x-element> into the document - // created callback is not called for <x-element> yet, attached calback is enqueued - // anyway. Because specification for setting custom element prototype algorithm reads: - // .... - // 3. If ELEMENT is in a document and this document has a browsing context: - // 1. Enqueue attached callback for ELEMENT - // - // Changes in the specification will follow, to reflect this exceptional case. - assert_array_equals(proto.callbackLog, ['created', 'attached'], - 'attached callback should be enqueued when custom element prototype is set'); -}, 'Test attached callback is enqueued after created callback after registration ' + - 'of custom element type'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-test.html deleted file mode 100644 index 63814a80f50..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-test.html +++ /dev/null @@ -1,167 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Created callback of a custom element should be invoked after custom element instance is created and its definition is registered</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="CREATED callback is invoked after custom element instance is created and its definition is registered"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Callback created should not be called before element instance was created'); - var customElement = new GeneratedConstructor(); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after element instance was created'); -}, 'Test created callback when custom element is created by constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-b', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Callback created should not be called before element instance was created'); - doc.body.innerHTML = '<x-b></x-b>'; - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after element instance was created'); -}, 'Test created callback when custom element is created in HTML'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-c', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Callback created should not be called before element instance was created'); - doc.body.innerHTML = '<div><x-c></x-c></div>'; - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after element instance was created'); -}, 'Test created callback when custom element is created in HTML as descendant of ' + - 'another element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-d', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Callback created should not be called before element instance was created'); - var customElement = doc.createElement('x-d'); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after element instance was created'); -}, 'Test created callback when custom element is created by createElement'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.body.innerHTML = '<x-e></x-e>'; - doc.registerElement('x-e', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after element instance was created'); -}, 'Test created callback when custom element is created in HTML before ' + - 'registration of a custom element'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-f', {prototype: proto}); - doc.body.innerHTML = '<x-f-unresolved id="x-f-unresolved"></x-f-unresolved>'; - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Callback created should not be called if custom element is unresolved'); - - var customElement = doc.querySelector('#x-f-unresolved'); - customElement.constructor.prototype = proto; - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Created callback should not be called if custom element is unresolved'); -}, 'Test created callback if custom element is unresolved.'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 1, 'Callback created should be called'); -}, 'Test created callback is called after custom element is created and registered. ' + - 'Document has browsing context'); - - -testInIFrame('../../resources/register-and-create-custom-element.html', function(doc) { - assert_equals(doc.querySelector('#log').textContent, 'Created callback was called', - 'Callback created should be called'); -}, 'Test created callback is called after custom element is registered and created. ' + - 'Document has browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var customElement = doc.createElement('x-g'); - - doc.registerElement('x-g', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after registration of custom element'); -}, 'Test created callback when custom element is created by createElement '+ - 'before registration of a custom element'); - - -test(function(){ - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var GeneratedConstructor = doc.registerElement('x-h', {prototype: proto}); - - var customElement1 = new GeneratedConstructor(); - assert_equals(proto.createdCallbackCalledCounter, 1, 'Callback created should be called'); - - var customElement2 = doc.createElement('x-h'); - assert_equals(proto.createdCallbackCalledCounter, 2, - 'Callback created should be called after element instance was created'); - - doc.body.innerHTML = '<x-h></x-h>'; - assert_equals(proto.createdCallbackCalledCounter, 3, - 'Callback created should be called after element instance was created'); - - doc.body.innerHTML = '<div><x-h></x-h></div>'; - assert_equals(proto.createdCallbackCalledCounter, 4, - 'Callback created should be called after element instance was created'); -}, 'Test created callback. Create several custom elements using different ways'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - - var GeneratedConstructor = doc.registerElement('x-element', {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called for custom element in loaded document'); - - var customElement2 = new GeneratedConstructor(); - assert_equals(proto.createdCallbackCalledCounter, 2, - 'Callback created should be called after element instance was created'); - - var customElement3 = doc.createElement('x-element'); - assert_equals(proto.createdCallbackCalledCounter, 3, - 'Callback created should be called after element instance was created'); - - doc.body.innerHTML = '<x-element></x-element>'; - assert_equals(proto.createdCallbackCalledCounter, 4, - 'Callback created should be called after element instance was created'); - - doc.body.innerHTML = '<div><x-element></x-element></div>'; - assert_equals(proto.createdCallbackCalledCounter, 5, - 'Callback created should be called after element instance was created'); -}, 'Test created callback. Create several custom elements using different ways. ' + - 'Document has browsing context'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-move-element-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-move-element-test.html deleted file mode 100644 index d69eb54dbb4..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-move-element-test.html +++ /dev/null @@ -1,130 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Test detached callback of a custom element when moving custom element between different documents</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="detached callback ... must be enqueued whenever custom element is removed from the document and this document has a browsing context."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-a', {prototype: proto}); - - var customElement = doc.createElement('x-a'); - doc.body.appendChild(customElement); - - var divElement = doc.createElement('div'); - doc.body.appendChild(divElement); - divElement.appendChild(customElement); - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called in document without a browsing context'); -}, 'Test detached callback is not called if moving custom element inside document ' + - 'without browsing context'); - - -testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) { - var docNoBrowsingContext = newHTMLDocument(); - var proto1 = newHTMLElementPrototype(); - docNoBrowsingContext.registerElement('x-b', {prototype: proto1}); - - var customElement = docNoBrowsingContext.createElement('x-b'); - docNoBrowsingContext.body.appendChild(customElement); - var proto2 = newHTMLElementPrototype(); - docWithBrowsingContext.registerElement('x-b', {prototype: proto2}); - docWithBrowsingContext.body.appendChild(customElement); - - assert_equals(proto1.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called in document without browsing context'); - assert_equals(proto2.detachedCallbackCalledCounter, 0, - 'Callback detached, defined in receiving document, should not be called'); -}, 'Test detached callback is not called if moving custom element from ' + - 'document without browsing context to document with browsing context'); - - -testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) { - var proto1 = newHTMLElementPrototype(); - docWithBrowsingContext.registerElement('x-c', {prototype: proto1}); - - var customElement = docWithBrowsingContext.createElement('x-c'); - docWithBrowsingContext.body.appendChild(customElement); - - var docNoBrowsingContext = newHTMLDocument(); - var proto2 = newHTMLElementPrototype(); - docNoBrowsingContext.registerElement('x-c', {prototype: proto2}); - docNoBrowsingContext.body.appendChild(customElement); - assert_equals(proto1.detachedCallbackCalledCounter, 1, - 'Callback detached should be called in documents with browsing context'); - assert_equals(proto2.detachedCallbackCalledCounter, 0, - 'Callback detached, defined in receiving document, should not be called'); -}, 'Test detached callback if moving custom element from ' + - 'document with browsing context to document without browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-d', {prototype: proto}); - - var customElement = doc.createElement('x-d'); - doc.body.appendChild(customElement); - var divElement = doc.createElement('div'); - doc.body.appendChild(divElement); - divElement.appendChild(customElement); - assert_equals(proto.detachedCallbackCalledCounter, 1, - 'Callback detached should be called in documents with browsing context'); -}, 'Test detached callback if moving custom element inside document ' + - 'with browsing context'); - - -var moveTest = async_test('Test detached callback if moving custom element from ' + - 'document with browsing context to document with browsing context'); - -moveTest.step(function() { - var iframe1 = newIFrame('../../resources/blank.html'); - iframe1.onload = moveTest.step_func(function() { - var doc1 = iframe1.contentDocument; - - // register custom element type - var proto1 = newHTMLElementPrototype(); - doc1.registerElement('x-e', {prototype: proto1}); - - // create custom element - var customElement = doc1.createElement('x-e'); - doc1.body.appendChild(customElement); - assert_equals(proto1.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called when element is created'); - - // create second iframe - var iframe2 = newIFrame('../../resources/x-element.html'); - iframe2.onload = moveTest.step_func(function() { - var doc2 = iframe2.contentDocument; - - // register custom element type - var proto2 = newHTMLElementPrototype(); - doc2.registerElement('x-e', {prototype: proto2}); - - // move element - doc2.body.appendChild(customElement); - assert_equals(proto1.detachedCallbackCalledCounter, 1, - 'Callback detached should be called in documents with browsing context'); - assert_equals(proto2.detachedCallbackCalledCounter, 0, - 'Callback detached, defined in receiving document, should not be called'); - - // test clean up - iframe1.remove(); - iframe2.remove(); - moveTest.done(); - }); - - }); -}); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-no-browsing-context-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-no-browsing-context-test.html deleted file mode 100644 index 2b420d11c2c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-no-browsing-context-test.html +++ /dev/null @@ -1,147 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Detached callback of a custom element should not be called if document has no browsing context</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="detached callback ... must be enqueued whenever custom element is removed from the document and this document has a browsing context."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.registerElement('x-a', {prototype: proto}); - doc.body.innerHTML = '<x-a id="x-a"></x-a>'; - var customElement = doc.querySelector('#x-a'); - doc.body.removeChild(customElement); - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); -}, 'Test detached callback if custom element is created via innerHTML property. ' + - 'Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - doc.body.innerHTML = '<x-b id="x-b"></x-b>'; - doc.registerElement('x-b', {prototype: proto}); - var customElement = doc.querySelector('#x-b'); - doc.body.removeChild(customElement); - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); -}, 'Test detached callback if custom element is via innerHTML property before ' + - 'registration of a custom element. Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-c id="x-c"></x-c>'; - var customElement = doc.querySelector('#x-c'); - - var proto = newHTMLElementPrototype(); - customElement.constructor.prototype = proto; - doc.body.removeChild(customElement); - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); -}, 'Test detached callback if custom element is unregistered. ' + - 'Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.registerElement('x-d', {prototype: proto}); - doc.body.innerHTML = '<x-d id="x-d"></x-d>'; - doc.body.innerHTML = ''; - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); -}, 'Test detached callback if removing custom element via innerHTML property. ' + - 'Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.registerElement('x-e', {prototype: proto}); - doc.body.innerHTML = '<div id="customParent"><x-e id="x-e"></x-e></div>'; - var parent = doc.querySelector('#customParent'); - doc.body.removeChild(parent); - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); -}, 'Test detached callback if removing perent of custom element. ' + - 'Document has no browsing context'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - - doc.registerElement('x-f', {prototype: proto}); - doc.body.innerHTML = '<div><x-f id="x-f"></x-f></div>'; - doc.body.innerHTML = ''; - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); -}, 'Test detached callback if removing perent of custom element via innerHTML property. ' + - 'Document has no browsing context'); - - -var loseBrowsingContextTest = async_test('Test detached callback is not called ' + - 'if document lose browsing context and custom element is removed'); - -loseBrowsingContextTest.step(function() { - var iframe = newIFrame('../../resources/x-element.html'); - iframe.onload = loseBrowsingContextTest.step_func(function(){ - var doc = iframe.contentDocument; - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - - var customElement = doc.querySelector('#x-element'); - iframe.remove(); - customElement.remove(); - - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called if the document has no browsing context'); - loseBrowsingContextTest.done(); - }); -}); - - -var navigateTest = async_test('Test detached callback is not called, ' + - 'if document\'s window is navigated to another document and custom element is removed'); - -navigateTest.step(function() { - var iframe = newIFrame('../../resources/x-element.html'); - iframe.onload = navigateTest.step_func(function() { - var doc = iframe.contentDocument; - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - customElement = doc.querySelector('#x-element'); - - iframe.onload = navigateTest.step_func(function() { - customElement.remove(); - assert_equals(proto.detachedCallbackCalledCounter, 0, - 'Callback detached should not be called ' + - 'if the document has no browsing context'); - navigateTest.done(); - iframe.remove(); - }); - iframe.src = '../../resources/blank.html'; - }); -}); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-with-browsing-context-test.html b/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-with-browsing-context-test.html deleted file mode 100644 index 31b06a9079c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-with-browsing-context-test.html +++ /dev/null @@ -1,85 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Detached callback of a custom element should be called if document has browsing context</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="detached callback ... must be enqueued whenever custom element is removed from the document and this document has a browsing context."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - var customElement = doc.querySelector('#x-element'); - doc.body.removeChild(customElement); - assert_equals(proto.detachedCallbackCalledCounter, 1, 'Callback detached should be ' + - 'called if custom element is removed from the document with browsing context'); -}, 'Test detached callback is called if custom element is removed by method removeChild() ' + - 'from document with browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - doc.body.innerHTML = '<div id="x-a-parent"><x-a id="x-a"></x-a></div>'; - var proto = newHTMLElementPrototype(); - doc.registerElement('x-a', {prototype: proto}); - var div = doc.querySelector('#x-a-parent'); - doc.body.removeChild(div); - assert_equals(proto.detachedCallbackCalledCounter, 1, 'Callback detached should be ' + - 'called if custom element is removed from the document with browsing context'); -}, 'Test detached callback is called if ancestor node of custom element ' + - 'is removed by method removeChild() from document with browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - var customElement = doc.querySelector('#x-element'); - var div = doc.createElement('div'); - doc.body.replaceChild(div, customElement); - assert_equals(proto.detachedCallbackCalledCounter, 1, 'Callback detached should be ' + - 'called if custom element is removed from the document with browsing context'); -}, 'Test detached callback is called if custom element is removed by method replaceChild() ' + - 'from document with browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-b', {prototype: proto}); - doc.body.innerHTML = '<div id="x-b-parent"><x-b id="x-b"></x-b></div>'; - var parent = doc.querySelector('#x-b-parent'); - var replacement = doc.createElement('div'); - doc.body.replaceChild(replacement, parent); - assert_equals(proto.detachedCallbackCalledCounter, 1, 'Callback detached should be ' + - 'called if custom element is removed from the document with browsing context'); -}, 'Test detached callback is called if ancestor node of custom element ' + - 'is removed by method replaceChild() from document with browsing context'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var proto = newHTMLElementPrototype(); - doc.registerElement('x-element', {prototype: proto}); - doc.body.innerHTML = ''; - assert_equals(proto.detachedCallbackCalledCounter, 1, 'Callback detached should be ' + - 'called if custom element is removed from the document with browsing context'); -}, 'Test detached callback is called after changing custom element direct parent ' + - 'innerHTML property in the document with browsing context'); - - -testInIFrame('../../resources/blank.html', function(doc) { - doc.body.innerHTML = '<div><x-c></x-c></div>'; - var proto = newHTMLElementPrototype(); - doc.registerElement('x-c', {prototype: proto}); - doc.body.innerHTML = ''; - assert_equals(proto.detachedCallbackCalledCounter, 1, 'Callback detached should be ' + - 'called if custom element is removed from the document with browsing context'); -}, 'Test detached callback is called after changing custom element ancestor ' + - 'innerHTML property in the document with browsing context'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/changing-is-attribute.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/changing-is-attribute.html deleted file mode 100644 index fb4338840a8..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/changing-is-attribute.html +++ /dev/null @@ -1,158 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Changing IS attribute of the custom element must not affect this element's custom element type, after element is instantiated</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="After a custom element is instantiated, changing the value of the IS attribute must not affect this element's custom element type"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - var customElement = new GeneratedConstructor(); - doc.registerElement('x-b'); - customElement.setAttribute('is', 'x-b'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-a'); -}, 'Test custom element type, after assigning IS attribute value. ' + - 'Element is created by constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-c'); - doc.registerElement('x-d'); - doc.body.innerHTML = '<x-c id="x-c"></x-c>'; - var customElement = doc.querySelector('#x-c'); - customElement.setAttribute('is', 'x-d'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-c'); -}, 'Test custom element type, after assigning IS attribute value. ' + - 'Element is created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-e id="x-e"></x-e>'; - var customElement = doc.querySelector('#x-e'); - customElement.setAttribute('is', 'x-f'); - var GeneratedConstructor = doc.registerElement('x-e'); - doc.registerElement('x-f'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-e'); -}, 'Test custom element type, after assigning IS attribute value to unresolved element. ' + - 'Element is created via innerHTML property'); - - -testInIFrame('../resources/x-element.html', function(doc) { - var GeneratedConstructor = doc.registerElement('x-element'); - doc.registerElement('y-element'); - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('is', 'y-element'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-element'); -}, 'Test custom element type, after assigning IS attribute value. ' + - 'Element is defined in loaded HTML document'); - - -testInIFrame('../resources/x-element.html', function(doc) { - var customElement = doc.querySelector('#x-element'); - customElement.setAttribute('is', 'y-element'); - var GeneratedConstructor = doc.registerElement('x-element'); - doc.registerElement('y-element'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-element'); -}, 'Test custom element type, after assigning IS attribute value to unresolved element. ' + - 'Element is defined in loaded HTML document'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) !== -1) { - return; - } - var name = 'y-' + tagName; - var obj = doc.createElement(tagName); - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - if (HTML5_TABLE_ELEMENTS.indexOf(tagName) !== -1) { - doc.body.innerHTML = - '<table>' + - '<' + tagName + ' id="custom-element" is="' + name + '"></' + tagName + '>' + - '</table>'; - } else { - doc.body.innerHTML = - '<' + tagName + ' id="custom-element" is="' + name + '"></' + tagName + '>'; - } - var customElement = doc.querySelector('#custom-element'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be '+ name); - - var name2 = 'y-a-' + tagName; - doc.registerElement(name2); - customElement.setAttribute('is', name2); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be ' + name); - }); -}, 'Test custom element type after changing IS attribute value. ' + - 'Element is HTML5 element with IS attribute referring to custom element type'); - - -test(function() { - var doc = newHTMLDocument(); - var localName = 'z-a'; - var obj = doc.createElement('a'); - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(localName, {prototype: proto, extends: 'a'}); - doc.body.innerHTML = '<a id="custom-element" is="' + localName + '"></a>'; - var customElement = doc.querySelector('#custom-element'); - - HTML5_ELEMENTS.forEach(function(tagName) { - var name = 'z-a-' + tagName; - var htmlElement = doc.createElement(tagName); - var htmlElementProto = Object.create(htmlElement.constructor.prototype); - doc.registerElement(name, {prototype: htmlElementProto, extends: tagName}); - customElement.setAttribute('is', name); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be ' + localName); - }); -}, 'Test custom element type after changing IS attribute value several times. ' + - 'Element is HTML5 element with IS attribute referring to custom element type'); - - -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-g'); - doc.registerElement('x-h'); - doc.body.innerHTML = '<x-g id="x-g" is="x-h"></x-g>'; - var customElement = doc.querySelector('#x-g'); - customElement.removeAttribute('is'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-g'); -}, 'Test custom element type, after removing IS attribute value. ' + - 'Element is created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var obj = doc.createElement('a'); - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement('x-i', {prototype: proto, extends: 'a'}); - doc.body.innerHTML = '<a id="x-i" is="x-i"></a>'; - var customElement = doc.querySelector('#x-i'); - customElement.removeAttribute('is'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be x-i'); -}, 'Test custom element type, after removing IS attribute value. ' + - 'Element is HTML5 element with IS attribute referring to custom element type'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-is-attribute.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-is-attribute.html deleted file mode 100644 index 0e18bf65105..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-is-attribute.html +++ /dev/null @@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element constructor sets value of IS attribute to custom element type, if it is not equal to name</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If TYPE is not the same as NAME, set the value of ELEMENT's IS attribute to TYPE"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) !== -1) { - return; - } - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.getAttribute('is'), name, - 'Value of the IS attribute should be set to type'); - }); -}, 'Test that the constructor of a type extension sets the IS attribute value to the type'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) !== -1) { - return; - } - var name = 'x-b-' + tagName; - var GeneratedConstructor = doc.registerElement(name); - var customElement = new GeneratedConstructor(); - - assert_false(customElement.hasAttribute('is'), - 'IS attribute should not present if local name is the same as type'); - }); -}, 'Test that the constructor of a custom element does not set the IS attribute if local name is the same as type'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-local-name.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-local-name.html deleted file mode 100644 index 28f6ca33ff2..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-local-name.html +++ /dev/null @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element constructor sets local name to the name from custom element definition</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="Set ELEMENT's local name to NAME"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - var customElement = new GeneratedConstructor(); - assert_equals(customElement.localName, 'x-a', - 'Custom element local name should be equal to the name in custom element definition'); -}, 'Custom element constructor sets local name to the name from custom element definition'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, tagName, - 'Custom element local name should be equal to the name in custom element definition'); - }); -}, 'Custom element constructor sets local name to the name from custom element definition. ' + - 'Test constructor of extended HTML element'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-namespace.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-namespace.html deleted file mode 100644 index 7278086ac87..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-namespace.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element constructor sets local namespace to the namespace from custom element definition</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Custom element constructor sets custom element namespace to the namespace in custom element definition"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - var customElement = new GeneratedConstructor(); - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace should be equal to namespace in custom element definition'); -}, 'Custom element constructor sets namespace to the namespace from custom element definition'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace should be equal to namespace in custom element definition'); - }); -}, 'Custom element constructor sets namespace to the namespace from custom element definition. ' + - 'Test constructor of extended HTML element'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-node-document.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-node-document.html deleted file mode 100644 index 3112b36da3e..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-node-document.html +++ /dev/null @@ -1,100 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element constructor sets owner document to the document, where custom element type is registered</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Custom element constructor sets custom element node document to the document, where custom element type is registered"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - var customElement = new GeneratedConstructor(); - assert_equals(customElement.ownerDocument, doc, - 'Custom element owner document should be the document, where custom element ' + - 'type is registered'); -}, 'Custom element constructor sets owner document to the document, where custom element ' + - 'type is registered'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.ownerDocument, doc, - 'Custom element owner document should be the document, where custom element ' + - 'type is registered'); - }); -}, 'Custom element constructor sets owner document to the document, where custom element ' + - 'type is registered. Test constructor of extended HTML element'); - - -test(function() { - var doc = newHTMLDocument(); - var sharedRegistryDocument = doc.implementation.createHTMLDocument('Document 2'); - - var name = 'x-c'; - var GeneratedConstructor = doc.registerElement(name); - var customElement = new GeneratedConstructor(); - assert_equals(customElement.ownerDocument, doc, - 'Custom element owner document should be the document, where custom element ' + - 'type is registered'); - - var name2 = 'x-d'; - var GeneratedConstructor2 = sharedRegistryDocument.registerElement(name2); - var customElement2 = new GeneratedConstructor2(); - assert_equals(customElement2.ownerDocument, sharedRegistryDocument, - 'Custom element owner document should be the document, where custom element ' + - 'type is registered'); -}, 'Custom element constructor sets owner document to the document, where custom element ' + - 'type is registered. Test different documents with shared registry'); - - -test(function() { - var doc = newHTMLDocument(); - var sharedRegistryDocument = doc.implementation.createHTMLDocument('Document 2'); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-e-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName - }); - var customElement = new GeneratedConstructor(); - assert_equals(customElement.ownerDocument, doc, - 'Custom element owner document should be the document, where custom element ' + - 'type is registered'); - - var obj2 = sharedRegistryDocument.createElement(tagName); - var name2 = 'x-f-' + tagName; - var proto2 = Object.create(obj2.constructor.prototype); - var GeneratedConstructor2 = sharedRegistryDocument.registerElement(name2, { - prototype: proto2, - extends: tagName - }); - var customElement2 = new GeneratedConstructor2(); - assert_equals(customElement2.ownerDocument, sharedRegistryDocument, - 'Custom element owner document should be the document, where custom element ' + - 'type is registered'); - }); -}, 'Custom element constructor sets owner document to the document, where custom element ' + - 'type is registered. Test constructor of extended HTML element for different documents ' + - 'with shared registry'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-prototype.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-prototype.html deleted file mode 100644 index 0158af511d1..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-constructor-prototype.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element constructor prototype is the prototype object specified in element definition</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Custom element constructor prototype is the prototype object specified in element definition"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(SVGElement.prototype); - var GeneratedConstructor = doc.registerElement('x-a', { - prototype: proto, - extends: 'p' - }); - assert_true(GeneratedConstructor.prototype === proto, - 'Custom element constructor must have the prototype specified in registerElement()'); -}, 'If custom element type is registered with prototype, the custom element ' + - 'constructor should have the prototype specified in registerElement() call'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-prototype.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-prototype.html deleted file mode 100644 index 2b298ea7439..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-prototype.html +++ /dev/null @@ -1,30 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element prototype is the prototype object specified in element definition</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Custom element prototype is the prototype object specified in element definition"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(SVGElement.prototype); - var GeneratedConstructor = doc.registerElement('x-a', { - prototype: proto, - extends: 'p' - }); - var customElement = new GeneratedConstructor(); - - assert_true(Object.getPrototypeOf(customElement) === proto, - 'Custom element instance must have the prototype specified in registerElement()'); -}, 'If custom element type is registered with prototype, the custom element ' + - 'instance should have the prototype specified in registerElement() call'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-is-attribute.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-is-attribute.html deleted file mode 100644 index c18290d0e14..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-is-attribute.html +++ /dev/null @@ -1,73 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Instantiation of custom element: custom element type is given as the value of the IS attribute</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The custom element type is given to a custom element at the time of its instantation in one of the two ways: ... 2. As the value of the IS attribute of the custom element."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) !== -1) { - return; - } - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - - if (HTML5_TABLE_ELEMENTS.indexOf(tagName) !== -1) { - doc.body.innerHTML = - '<table>' + - '<' + tagName + ' id="custom-element" is="' + name + '"></' + tagName + '>' + - '</table>'; - } else { - doc.body.innerHTML = - '<' + tagName + ' id="custom-element" is="' + name + '"></' + tagName + '>'; - } - var customElement = doc.querySelector('#custom-element'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified as value of IS attribute'); - }); -}, 'Instantiation of custom element: custom element type is given as the value of ' + - 'the IS attribute'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) !== -1) { - return; - } - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - if (HTML5_TABLE_ELEMENTS.indexOf(tagName) !== -1) { - doc.body.innerHTML = - '<table>' + - '<' + tagName + ' id="custom-element" is="' + name + '"></' + tagName + '>' + - '</table>'; - } else { - doc.body.innerHTML = - '<' + tagName + ' id="custom-element" is="' + name + '"></' + tagName + '>'; - } - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - - var customElement = doc.querySelector('#custom-element'); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified as value of IS attribute'); - }); -}, 'Instantiation of custom element: custom element type is given as the value ' + - 'of the IS attribute. Custom element is unresolved at first'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-local-name-and-is-attribute.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-local-name-and-is-attribute.html deleted file mode 100644 index c55e2cc25f6..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-local-name-and-is-attribute.html +++ /dev/null @@ -1,101 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Instantiation of custom element: the custom tag must win over the type extension</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="If both types of custom element types are provided at the time of element's instantiation, the custom tag must win over the type extension"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - doc.registerElement('x-b'); - doc.body.innerHTML = '<x-a id="x-a" is="x-b"></x-a>'; - var customElement = doc.querySelector('#x-a'); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified in the local name of the element'); -}, 'Custom element type must be taken from the local name of the element even ' + - 'if IS attribute provided.'); - - -test(function() { - var doc = newHTMLDocument(); - doc.registerElement('x-d'); - doc.body.innerHTML = '<x-c id="x-c" is="x-d"></x-c>'; - var customElement = doc.querySelector('#x-c'); - - var GeneratedConstructor = doc.registerElement('x-c'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified in the local name of the element'); -}, 'Custom element type must be taken from the local name of the element even ' + - 'if IS attribute provided. Custom element is unresolved at first'); - - -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-f'); - doc.body.innerHTML = '<x-f id="x-f" is="x-e"></x-f>'; - var customElement = doc.querySelector('#x-f'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified in local name of the element'); - - doc.registerElement('x-e'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified in local name of the element'); -}, 'Custom element type must be taken from the local name of the element even if IS ' + - 'attribute provided. There\'s no definition for the value of IS attribute at first'); - - -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-element'); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-d-' + tagName; - doc.registerElement(name, { - prototype: Object.create(obj.constructor.prototype), - extends: tagName - }); - doc.body.innerHTML = '<x-element id="x-element" is="' + name + '"></x-element>'; - var customElement = doc.querySelector('#x-element'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the local name of the custom element'); - }); -}, 'Custom element type must be taken from the local name of the element even ' + - 'if IS attribute provided. IS attribute refers to another custom element type, ' + - 'which extends HTML5 elements'); - - -test(function() { - var doc = newHTMLDocument(); - doc.registerElement('y-element'); - - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-e-' + tagName; - var id = 'x-e-' + tagName; - doc.registerElement(name, { - prototype: Object.create(obj.constructor.prototype), - extends: tagName - }); - doc.body.innerHTML = '<' + name + ' id="' + id + '" is="y-element"></' + name + '>'; - var customElement = doc.querySelector('#' + id); - // We have <x-e-a is='y-element'>. Custom element type for this will be - // HTMLElement, not x-e-a (for x-e-a there should be <a is='x-e-a'>...) - assert_class_string(customElement, 'HTMLElement', - 'Custom element type should be HTMLElement'); - }); -}, 'Custom element type must be taken from the local name of the custom element even ' + - 'if IS attribute provided. The element extends HTML5 elements, IS attribute refers ' + - 'to another custom element type.'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-local-name.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-local-name.html deleted file mode 100644 index 0f0d46f0a39..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/custom-element-type-local-name.html +++ /dev/null @@ -1,38 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Instantiation of custom element: custom element type is given via the local name of the custom element</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The custom element type is given to a custom element at the time of its instantation in one of the two ways: 1. As the local name of the custom element."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - doc.body.innerHTML = '<x-a id="x-a"></x-a>'; - var customElement = doc.querySelector('#x-a'); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified by the local name of ' + - 'the custom element'); -}, 'Test custom element type, which is given via the local name of the custom element. ' + - 'Custom element created via innerHTML property'); - - -testInIFrame('../resources/x-element.html', function(doc) { - var GeneratedConstructor = doc.registerElement('x-element'); - var xelement = doc.querySelector('#x-element'); - assert_equals(Object.getPrototypeOf(xelement), GeneratedConstructor.prototype, - 'Custom element type should be the type, specified by the local name of ' + - 'the custom element'); -}, 'Test custom element type, which is given via the local name of the custom element. ' + - 'Custom element is defined in loaded HTML document'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-local-name.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-local-name.html deleted file mode 100644 index f59d6dcb82f..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-local-name.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() and Document.createElementNS() create custom element of type, specified by localName argument</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If an element definition with matching localName, namespace, and TYPE is not registered with token's document, set TYPE to localName"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name1 = 'x-a'; - var name2 = 'x-b'; - var GeneratedConstructor = doc.registerElement(name1); - var customElement = doc.createElement(name1, name2); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the local name of the custom element'); -}, 'Test Document.createElement() creates custom element of type, ' + - 'specified by localName argument, if an element definition with matching localName, ' + - 'namespace, and type is not registered'); - - -test(function() { - var doc = newHTMLDocument(); - var name1 = 'x-c'; - var name2 = 'x-d'; - var GeneratedConstructor = doc.registerElement(name1); - var customElement = doc.createElementNS(HTML_NAMESPACE, name1, name2); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the local name of the custom element'); -}, 'Test Document.createElementNS() creates custom element of type, ' + - 'specified by localName argument, if an element definition with matching ' + - 'localName, namespace, and type is not registered'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-type-extension.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-type-extension.html deleted file mode 100644 index 3df04267627..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-type-extension.html +++ /dev/null @@ -1,69 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() and Document.createElementNS() create custom element of type, specified by typeExtension argument</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If an element definition with matching localName, namespace, and TYPE is registered then typeExtension is a TYPE"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name1 = 'x-a'; - var GeneratedConstructor1 = doc.registerElement(name1); - var name2 = 'x-b'; - var GeneratedConstructor2 = doc.registerElement(name2); - var customElement = doc.createElement(name1, name2); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype, - 'Custom element type should be the type extension of the custom element'); -}, 'Test Document.createElement() creates custom element of type, ' + - 'specified by typeExtension argument'); - - -test(function() { - var doc = newHTMLDocument(); - var name1 = 'x-c'; - var GeneratedConstructor1 = doc.registerElement(name1); - var name2 = 'x-d'; - var GeneratedConstructor2 = doc.registerElement(name2); - var customElement = doc.createElementNS(HTML_NAMESPACE, name1, name2); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype, - 'Custom element type should be the type extension of the custom element'); -}, 'Test Document.createElementNS() creates custom element of type, ' + - 'specified by typeExtension argument'); - - -test(function() { - var doc = newHTMLDocument(); - var name1 = 'x-e'; - var name2 = 'x-f'; - var GeneratedConstructor2 = doc.registerElement(name2); - var customElement = doc.createElement(name1, name2); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype, - 'Custom element type should be the type extension of the custom element'); -}, 'Test Document.createElement() creates custom element of type, ' + - 'specified by typeExtension argument. Definition for localName is absent'); - - -test(function() { - var doc = newHTMLDocument(); - var name1 = 'x-g'; - var name2 = 'x-h'; - var GeneratedConstructor2 = doc.registerElement(name2); - var customElement = doc.createElementNS(HTML_NAMESPACE, name1, name2); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype, - 'Custom element type should be the type extension of the custom element'); -}, 'Test Document.createElementNS() creates custom element of type, ' + - 'specified by typeExtension argument. Definition for localName is absent'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-is-attribute.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-is-attribute.html deleted file mode 100644 index 374ec5922a8..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-is-attribute.html +++ /dev/null @@ -1,71 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() and Document.createElementNS() set IS attribute to type</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If TYPE is not the same as localName, set the value of ELEMENT's IS attribute to TYPE"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = doc.createElement(tagName, name); - assert_equals(customElement.getAttribute('is'), name, - 'Value of the IS attribute should be set to type by Document.createElement()'); - }); -}, 'Test Document.createElement() sets the element\'s IS attribute value to type, ' + - 'if type is not the same as localName'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var name = 'x-b-' + tagName; - var customElement = doc.createElement(tagName, name); - assert_equals(customElement.getAttribute('is'), name, - 'Value of the IS attribute should be set to type by Document.createElement()'); - }); -}, 'Test Document.createElement() sets the element\'s IS attribute value to type, ' + - 'if type is not the same as localName and an element definition with matching ' + - 'localName, namespace, and type is not registered'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-c-' + tagName; - var proto = Object.create(obj.constructor.prototype); - doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name); - assert_equals(customElement.getAttribute('is'), name, - 'Value of the IS attribute should be set to type by Document.createElementNS()'); - }); -}, 'Test Document.createElementNS() sets the element\'s IS attribute value to type, ' + - 'if type is not the same as localName'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var name = 'x-d-' + tagName; - var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name); - assert_equals(customElement.getAttribute('is'), name, - 'Value of the IS attribute should be set to type by Document.createElementNS()'); - }); -}, 'Test Document.createElementNS() sets the element\'s IS attribute value to type, ' + - 'if type is not the same as localNameand and an element definition with matching ' + - 'localName, namespace, and type is not registered '); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-namespace.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-namespace.html deleted file mode 100644 index 60d50121923..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-namespace.html +++ /dev/null @@ -1,68 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() sets custom element namespace to HTML Namespace</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Namespace for createElement is HTML Namespace"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name = 'x-a'; - doc.registerElement(name); - var customElement = doc.createElement(name); - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace should be HTML Namespace'); -}, 'Test Document.createElement() sets custom element namespace to HTML Namespace'); - - -test(function() { - var doc = newHTMLDocument(); - var name = 'x-b'; - var customElement = doc.createElement(name); - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace should be HTML Namespace'); -}, 'Test Document.createElement() sets custom element namespace to HTML Namespace ' + - 'and an element definition with matching localName, namespace, and type is not registered'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-c-' + tagName; - var proto = Object.create(obj.constructor.prototype); - doc.registerElement(name, { - prototype: Object.create(proto), - extends: tagName - }); - var customElement = doc.createElement(tagName, name); - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace for the element extending ' + tagName + - ' should be HTML Namespace'); - }); -}, 'Document.createElement() sets custom element namespace to HTML Namespace. ' + - 'Custom element is extending standard HTML tag'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var name = 'x-d-' + tagName; - var customElement = doc.createElement(tagName, name); - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace for the element with tag name ' + tagName + - ' and type name ' + name + ' should be HTML Namespace'); - }); -}, 'Document.createElement() sets custom element namespace to HTML Namespace. ' + - 'Document.createElement() is called with standard HTML tag name and ' + - 'type without registered custom element of such type'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-is-a-type.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-is-a-type.html deleted file mode 100644 index ce7c933e21a..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-is-a-type.html +++ /dev/null @@ -1,47 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() and Document.createElementNS() create custom element of type, specified by typeExtension argument</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Let TYPE be typeExtension, or localName if typeExtension is not present"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = doc.createElement(tagName, name); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be ' + name); - }); -}, 'Test Document.createElement() creates custom element of type, ' + - 'specified by typeExtension argument'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be ' + name); - }); -}, 'Test Document.createElementNS() creates custom element of type, ' + - 'specified by typeExtension argument'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-unresolved.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-unresolved.html deleted file mode 100644 index 3eaadf31251..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-unresolved.html +++ /dev/null @@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() and Document.createElementNS() create custom element of type, specified by localName argument</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If an element definition with matching localName, namespace, and TYPE is not registered with token's document, set TYPE to localName"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test (function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var customElement = doc.createElement(tagName, name); - assert_equals(Object.getPrototypeOf(customElement), Object.getPrototypeOf(obj), - 'Unregistered custom element type should be a local name'); - - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Registered custom element type should be the type extension'); - }); -}, 'If typeExtension is unresolved when createElement called then local name is a type'); - - -test (function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name); - assert_equals(Object.getPrototypeOf(customElement), Object.getPrototypeOf(obj), - 'Custom element type should be a local name'); - - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: tagName}); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the type extension'); - }); -}, 'If typeExtension is unresolved when createElementNS called then local name is a type'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-is-a-local-name.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-is-a-local-name.html deleted file mode 100644 index 487b14b9dcc..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-is-a-local-name.html +++ /dev/null @@ -1,38 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() and Document.createElementNS() create custom element of type, specified by single localName argument</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Let TYPE be typeExtension, or localName if typeExtension is not present"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name = 'x-a'; - var GeneratedConstructor = doc.registerElement(name); - var customElement = doc.createElement(name); - - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the local name of the custom element'); -}, 'Test Document.createElement() creates custom element of type, ' + - 'specified by single localName argument'); - - -test(function() { - var doc = newHTMLDocument(); - var name = 'x-b'; - var GeneratedConstructor = doc.registerElement(name); - var customElement = doc.createElementNS(HTML_NAMESPACE, name); - assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor.prototype, - 'Custom element type should be the local name of the custom element'); -}, 'Test Document.createElementNS() creates custom element of type, ' + - 'specified by localName argument. Argument typeExtension is not passed'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element-ns.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element-ns.html deleted file mode 100644 index 7bf09601cb8..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element-ns.html +++ /dev/null @@ -1,72 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElementNS() must enqueue created callback for registered custom element type</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Document.createElementNS() must enqueue created callback for registered custom element type"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var name = 'x-a'; - - doc.registerElement(name, {prototype: proto}); - var customElement = doc.createElementNS(HTML_NAMESPACE, name); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be enqueued by Document.createElementNS()'); -}, 'Test Document.createElementNS() without typeExtension argument enqueues created callback'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var name = 'x-b'; - - doc.registerElement(name, {prototype: proto}); - var customElement = doc.createElementNS(HTML_NAMESPACE, name, name); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be enqueued by Document.createElementNS()'); -}, 'Test Document.createElementNS() with typeExtension argument enqueues created callback'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var name = 'x-c'; - var customElement = doc.createElementNS(HTML_NAMESPACE, name); - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Document.createElementNS() should not enqueue created callback ' + - 'for unresolved custom element'); - - doc.registerElement(name, {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after custom element is registered'); -}, 'Document.createElementNS() should not enqueue created callback ' + - 'for unresolved custom element'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-d-' + tagName; - var proto = newCustomElementPrototype(Object.create(obj.constructor.prototype)); - doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name); - - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be enqueued by Document.createElementNS()'); - }); -}, 'Test Document.createElementNS() enqueues created callback for custom elements ' + - 'that are extensions of HTML5 elements'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element.html deleted file mode 100644 index dc05e01e17c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element.html +++ /dev/null @@ -1,72 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Document.createElement() must enqueue created callback for registered custom element type</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Document.createElement() must enqueue created callback for registered custom element type"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-callbacks"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var name = 'x-a'; - - doc.registerElement(name, {prototype: proto}); - var customElement = doc.createElement(name); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be enqueued by Document.createElement()'); -}, 'Test Document.createElement() without typeExtension argument enqueues created callback'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var name = 'x-b'; - - doc.registerElement(name, {prototype: proto}); - var customElement = doc.createElement(name, name); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be enqueued by Document.createElement()'); -}, 'Test Document.createElement() with typeExtension argument enqueues created callback'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = newHTMLElementPrototype(); - var name = 'x-c'; - var customElement = doc.createElement(name); - assert_equals(proto.createdCallbackCalledCounter, 0, - 'Document.createElement() should not enqueue created callback ' + - 'for unresolved custom element'); - - doc.registerElement(name, {prototype: proto}); - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be called after custom element is registered'); -}, 'Document.createElement() should not enqueue created callback ' + - 'for unresolved custom element'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-d-' + tagName; - var proto = newCustomElementPrototype(Object.create(obj.constructor.prototype)); - doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement = doc.createElement(tagName, name); - - assert_equals(proto.createdCallbackCalledCounter, 1, - 'Callback created should be enqueued by Document.createElement()'); - }); -}, 'Test Document.createElement() enqueues created callback for custom elements ' + - 'that are extensions of HTML5 elements'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/non-configurable-constructor-property.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/non-configurable-constructor-property.html deleted file mode 100644 index ddb1ff9de97..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/non-configurable-constructor-property.html +++ /dev/null @@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If prototype has a non-configurable property named constructor, Document.registerElement() throws NotSupportedError</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If PROTOTYPE has a non-configurable property named constructor, throw a NotSupportedError and stop"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(HTMLElement.prototype); - Object.defineProperty(proto, 'constructor', {configurable: false}); - assert_throws('NotSupportedError', function() { - doc.registerElement('x-a', {prototype: proto}); - }, 'Exception should be thrown in case of attempt to register element ' + - 'with a non-configurable property named constructor'); -}, 'Test Document.registerElement() throws NotSupportedError ' + - 'if prototype has a non-configurable property named constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(HTMLElement.prototype); - Object.defineProperty(proto, 'constructor', {configurable: true}); - try { - doc.registerElement('x-b', {prototype: proto}); - } catch (e) { - assert_unreached('Exception should not be thrown in case of attempt to register ' + - 'element with a configurable property named constructor'); - } -}, 'Test Document.registerElement() accepts prototype with a configurable ' + - 'property named constructor without throwing errors'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/prototype-is-interface-prototype-object.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/prototype-is-interface-prototype-object.html deleted file mode 100644 index ad7f454f50c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/prototype-is-interface-prototype-object.html +++ /dev/null @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If prototype is already an interface prototype object, Document.registerElement() throws a NotSupportedError</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If PROTOTYPE is already an interface prototype object for any interface object, throw a NotSupportedError and stop"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - assert_throws('NotSupportedError', function() { - doc.registerElement(name, {prototype: obj.constructor.prototype}); - }, 'Exception should be thrown in case of attempt to register element ' + - 'if prototype is already an interface prototype object (' + name + ')'); - }); -}, 'Test Document.registerElement() throws NotSupportedError ' + - 'if prototype is already an interface prototype object'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(HTMLElement.prototype); - doc.registerElement('x-b', { - prototype: proto - }); - assert_throws('NotSupportedError', function() { - doc.registerElement('x-b', { - prototype: proto - }); - }, 'Exception should be thrown if registring custom element type with already used prototype'); -}, 'Test Document.registerElement() throws NotSupportedError ' + - 'if prototype is already used for another custom element type'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/unchanged-attribute.html b/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/unchanged-attribute.html deleted file mode 100644 index 3baa174cb5f..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/instantiating/unchanged-attribute.html +++ /dev/null @@ -1,29 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<title>Custom element's type is immutable.</title> -<meta name="author" title="Bon-Yong Lee" href="mailto:bylee78@gmail.com"> -<meta name="assert" content="After a custom element is instantiated, changing the value of the is attribute must not affect this element's custom element type."> -<link rel="help" href="http://w3c.github.io/webcomponents/spec/custom/#instantiating-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<div id="log"></div> -<script type="text/javascript"> -test(function() { - var CustomButton = document.registerElement('custom-button', { - prototype: Object.create(HTMLButtonElement.prototype), - extends: 'button' - }); - var customButton = document.createElement('button', 'custom-button'); - - assert_true(customButton instanceof CustomButton, - 'A custom element is of the custom element type after ' + - 'instantiation'); - customButton.setAttribute('is', 'dirty'); - assert_equals('dirty', customButton.getAttribute('is'), - 'An attribute must be changed by method "setAttribute"'); - - assert_true(customButton instanceof CustomButton, - 'A custom element is of the original custom element type even ' + - 'after changing the \'is\' attribute'); -}, 'After a custom element is instantiated, changing the value of the is attribute must not affect this element\'s custom element type.'); -</script> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-default-namespace.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-default-namespace.html deleted file mode 100644 index 6a1f532c785..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-default-namespace.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Default namespace is HTML namespace</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Default namespace is HTML namespace"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace should be HTML namespace'); -}, 'Default namespace is HTML namespace'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-b-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.namespaceURI, HTML_NAMESPACE, - 'Custom element namespace should be HTML namespace'); - }); -}, 'Default namespace is HTML namespace. Test constructor of extended HTML element'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-duplicate-definition.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-duplicate-definition.html deleted file mode 100644 index b3f661c4fde..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-duplicate-definition.html +++ /dev/null @@ -1,56 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Check duplicate definition</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If there already exists a definition with the same TYPE, set ERROR to DuplicateDefinition and stop"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name = 'x-a'; - doc.registerElement(name); - assert_throws('NotSupportedError', function() { - doc.registerElement(name); - }, 'Exception should be thrown if definition with the same type already exists'); -}, 'Check duplicate definition'); - - -test(function() { - var doc = newHTMLDocument(); - var name = 'x-b'; - doc.registerElement(name); - HTML5_ELEMENTS.forEach(function(tagName) { - assert_throws('NotSupportedError', function() { - doc.registerElement(name, { - extends: tagName - }); - }, 'Exception should be thrown if definition with the same type already exists'); - }); -}, 'Check duplicate definition. Specify constructor'); - - -test(function() { - var doc = newHTMLDocument(); - var name = 'x-c'; - doc.registerElement(name, { - prototype: Object.create(HTMLAnchorElement.prototype), - extends: 'a' - }); - HTML5_ELEMENTS.forEach(function(tagName) { - assert_throws('NotSupportedError', function() { - doc.registerElement(name, { - extends: tagName - }); - }, 'Exception should be thrown if definition with the same type already exists'); - }); -}, 'Check duplicate definition. Test different prototypes and extends'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-invalid-type.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-invalid-type.html deleted file mode 100644 index 5f2c09b4bbd..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-invalid-type.html +++ /dev/null @@ -1,22 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If TYPE is an invalid custom element type, throw SyntaxError</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="If TYPE is an invalid custom element type, set ERROR to InvalidType and stop."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - assert_throws('SyntaxError', function() { doc.registerElement('1xa2'); }, - 'Registering invalid custom element type should throw SyntaxError'); -}, 'Registering invalid custom element type should throw SyntaxError'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-local-name-lowercased.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-local-name-lowercased.html deleted file mode 100644 index 7725e2efa54..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-local-name-lowercased.html +++ /dev/null @@ -1,32 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element local name should be converted to lower case if document is an HTML document</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If DOCUMENT is an HTML document, convert NAME to lowercase"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName.toUpperCase() - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, tagName, 'Local name should be lowercased'); - }); -}, 'Custom element local name should be lowercased if document is an HTML document'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-name-is-null.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-name-is-null.html deleted file mode 100644 index 2b76818d6e6..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-name-is-null.html +++ /dev/null @@ -1,40 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If NAME is null then localName must be set to TYPE</title> -<meta name="author" title="Vasiliy Degtyarev" href="mailto:vasya@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If NAME is null then localName must be set to TYPE"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var name = 'x-a'; - var proto = Object.create(HTMLElement.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto}); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, name, 'LocalName should be a type in case of ' + - 'attempt to register a custom element and local name is not provided'); -}, 'If NAME is not specified then localName must be set to TYPE'); - - -test(function() { - var doc = newHTMLDocument(); - var name = 'x-b'; - var proto = Object.create(HTMLElement.prototype); - var GeneratedConstructor = doc.registerElement(name, {prototype: proto, extends: null}); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, name, 'LocalName should be a type in case of ' + - 'attempt to register a custom element and name is null'); -}, 'If NAME is null then localName must be set to TYPE'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-no-interface-for-name.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-no-interface-for-name.html deleted file mode 100644 index 6d72d60df9a..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-no-interface-for-name.html +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If element interface for name doesn't exists then error must be thrown</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If NAME was provided and is not null and if element interface for the name and namespace does not exist or is an interface for a custom element, set ERROR to InvalidName and stop"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - doc.registerElement('x-a'); - assert_throws('NotSupportedError', function() { - doc.registerElement('x-b', {extends: 'x-a'}); - }, 'Exception should be thrown in case of attempt to register ' + - 'a custom element which extends another custom element'); -}, 'Exception should be thrown in case of attempt to register ' + - 'a custom element which extends another custom element'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace-name-is-null.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace-name-is-null.html deleted file mode 100644 index dd6b61059b0..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace-name-is-null.html +++ /dev/null @@ -1,36 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If namespace is SVG namespace and name is null then error must be thrown</title> -<meta name="author" title="Vasiliy Degtyarev" href="mailto:vasya@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If namespace is SVG namespace and name is null then error must be thrown"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(SVGElement.prototype); - assert_throws('NotSupportedError', function() { - doc.registerElement('x-svg-a', {prototype: proto}); - }, 'Exception should be thrown in case of attempt to register ' + - 'a custom element with SVG namespace and name is not specified'); -}, 'Error should be thrown if namespace is SVG and local name is not specified'); - - -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(SVGElement.prototype); - assert_throws('NotSupportedError', function() { - doc.registerElement('x-svg-b', {prototype: proto, extends: null}); - }, 'Exception should be thrown in case of attempt to register ' + - 'a custom element with SVG namespace and name is null'); -}, 'Error should be thrown if namespace is SVG and local name is null'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace.html deleted file mode 100644 index 497de2919fc..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace.html +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>For SVG prototype namespace is SVG namespace</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If PROTOTYPE's interface inherits from SVGElement, set NAMESPACE to SVG Namespace"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var proto = Object.create(SVGElement.prototype); - var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto, extends: 'a'}); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.namespaceURI, SVG_NAMESPACE, - 'Custom element namespace should be SVG namespace'); -}, 'For SVG prototype namespace is SVG namespace'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-type-name-lowercased.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-type-name-lowercased.html deleted file mode 100644 index 38dce801c00..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/definition-construction-algorithm-type-name-lowercased.html +++ /dev/null @@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element type should be converted to lower case</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Custom element type should be lowercased"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('X-A'); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, 'x-a', 'Custom element type should be lowercased'); -}, 'Custom element type should be lowercased. Test constructor'); - - -test(function() { - var doc = newHTMLDocument(); - HTML5_ELEMENTS.forEach(function(tagName) { - var obj = doc.createElement(tagName); - var name = 'x-a-' + tagName; - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName.toUpperCase() - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, tagName, 'Local name should be lowercased'); - }); -}, 'Custom element type should be lowercased. Test constructor of extended HTML element'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/element-registration-algorithm-no-registry.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/element-registration-algorithm-no-registry.html deleted file mode 100644 index 6e9c20be30c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/element-registration-algorithm-no-registry.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>If document has no registry NotSupportedError is thrown</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="If REGISTRY does not exist, set ERROR to NoRegistry and stop."> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#dfn-element-registration-algorithm"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = document.implementation.createDocument(null, 'test', null); - assert_throws('NotSupportedError', function(){ - doc.registerElement('x-a'); - }, 'Registering valid custom element in document ' + - 'without registry should throw NotSupportedError'); - -}, 'Registering valid custom element without options in document ' + - 'without registry should throw NotSupportedError'); - - -test(function() { - var doc = document.implementation.createDocument(null, 'test', null); - var proto = Object.create(HTMLElement.prototype); - - assert_throws('NotSupportedError', function(){ - doc.registerElement('x-b', { prototype: proto, extends: 'a'}); - }, 'Registering valid custom element in document ' + - 'without registry should throw NotSupportedError'); - -}, 'Registering valid custom element with options in document ' + - 'without registry should throw NotSupportedError'); -</script> -</body> -</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-name.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-name.html deleted file mode 100644 index e276e834a4a..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-name.html +++ /dev/null @@ -1,36 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Custom element local name is the lowercased value of the EXTENDS property, supplied to Document.registerElement()</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="Custom element local name is the lowercased value of the EXTENDS property"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-register"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - - HTML5_ELEMENTS.forEach(function(tagName) { - var name = 'x-' + tagName; - var obj = doc.createElement(tagName); - var proto = Object.create(obj.constructor.prototype); - var GeneratedConstructor = doc.registerElement(name, { - prototype: proto, - extends: tagName - }); - var customElement = new GeneratedConstructor(); - - assert_equals(customElement.localName, tagName.toLowerCase(), - 'Custom element local name should be a lowercased value of the EXTENDS property, ' + - 'supplied to Document.registerElement()'); - }); -}, 'Custom element local name is the lowercased value of the EXTENDS property, ' + - 'supplied to Document.registerElement()'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-prototype.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-prototype.html deleted file mode 100644 index de397aacd8d..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-prototype.html +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Test prototype object of a custom element</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="If PROTOTYPE is null, let PROTOTYPE be the result of invoking Object.create with HTMLElement's interface prototype object as only argument"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-register"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var GeneratedConstructor = doc.registerElement('x-a'); - var customElement = new GeneratedConstructor(); - - assert_class_string(customElement, 'HTMLElement', - 'Custom element should be a HTMLElement, ' + - 'if its type is registered without prototype'); -}, 'Custom element should have HTMLElement prototype, ' + - 'if its type is registered without prototype'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag-ref.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag-ref.html deleted file mode 100644 index 33c36463ceb..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag-ref.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass reference file</title> -<link rel="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<style> - body { - background-color: white; - } -</style> -<body> - <p>Test passes if x-element background below is red</p> - <x-element style="background-color: red;"> - x-element - </x-element> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html deleted file mode 100644 index 290e5b15cfc..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html +++ /dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass matching custom tag</title> -<link rel="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="The :unresolved pseudoclass must match all custom elements whose created callback has not yet been invoked"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#unresolved-element-pseudoclass"> -<link rel="match" href="unresolved-element-pseudoclass-css-test-custom-tag-ref.html"> -<style> - :unresolved { - background-color: red; - } - body { - background-color: white; - } -</style> -<body> - <p>Test passes if x-element background below is red</p> - <x-element> - x-element - </x-element> -</body> -</html> - diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html deleted file mode 100644 index d49f3d768fd..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass reference file</title> -<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<style> - body { - background-color: white; - } -</style> -<body> - <p>Test passes if x-element background below is yellow</p> - <x-element style="background-color: yellow;"> - x-element - </x-element> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html deleted file mode 100644 index 3cd7b41d6e7..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass matching custom tag</title> -<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The :unresolved pseudoclass must match all custom elements whose created callback has not yet been invoked"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#unresolved-element-pseudoclass"> -<link rel="match" href="unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html"> -<style> - :unresolved { - background-color: red; - } - x-element { - background-color: yellow; - } - body { - background-color: white; - } -</style> -<body onload="document.registerElement('x-element');"> - <p>Test passes if x-element background below is yellow</p> - <x-element> - x-element - </x-element> -</body> -</html> - diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html deleted file mode 100644 index 90baf95544c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass reference file</title> -<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<style> - body { - background-color: white; - } -</style> -<body> - <p>Test passes if x-element background below is yellow</p> - <a is="x-element" style="background-color: yellow;"> - x-element - </a> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html deleted file mode 100644 index 65921bd4147..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass matching type extension</title> -<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The :unresolved pseudoclass must match all custom elements whose created callback has not yet been invoked"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#unresolved-element-pseudoclass"> -<link rel="match" href="unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html"> -<style> - :unresolved { - background-color: red; - } - a { - background-color: yellow; - } - body { - background-color: white; - } -</style> -<script> -function registerXElement() { - var obj = document.createElement('a'); - var proto = Object.create(obj.constructor.prototype); - document.registerElement('x-element', { prototype: proto, extends: 'a'}); -} -</script> -<body onload="registerXElement();"> - <p>Test passes if x-element background below is yellow</p> - <a is="x-element"> - x-element - </a> -</body> -</html> - diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension-ref.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension-ref.html deleted file mode 100644 index 9865f2e3926..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension-ref.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass reference file</title> -<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<style> - body { - background-color: white; - } -</style> -<body> - <p>Test passes if x-element background below is red</p> - <a is="x-element" style="background-color: red;"> - x-element - </a> -</body> -</html> - diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html deleted file mode 100644 index 60f39125a0b..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html +++ /dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html> -<title>The :unresolved pseudoclass matching type extension</title> -<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The :unresolved pseudoclass must match all custom elements whose created callback has not yet been invoked"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#unresolved-element-pseudoclass"> -<link rel="match" href="unresolved-element-pseudoclass-css-test-type-extension-ref.html"> -<style> - :unresolved { - background-color: red; - } - body { - background-color: white; - } -</style> -<body> - <p>Test passes if x-element background below is red</p> - <a is="x-element"> - x-element - </a> -</body> -</html> - diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector-all.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector-all.html deleted file mode 100644 index 2ddc2afc291..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector-all.html +++ /dev/null @@ -1,190 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>The :unresolved pseudoclass matching with Document.querySelectorAll()</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="assert" content="The :unresolved pseudoclass must match all custom elements whose created callback has not yet been invoked"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#unresolved-element-pseudoclass"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-a></x-a>'; - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 1, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-a', - 'Document.querySelectorAll(\':unresolved\') should return x-a element'); -}, 'Test that single unresolved custom element is accessible ' + - 'by Document.querySelectorAll(\':unresolved\')'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-b></x-b>'; - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 1, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-b', - 'Document.querySelectorAll(\':unresolved\') should return x-b element'); - - doc.registerElement('x-b'); - queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 0, - 'Registered custom element should not be accessible by :unresolved pseudoclass'); -}, 'Test that single registered custom element is not accessible by :unresolved'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-c></x-c><x-d></x-d>'; - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 2, - 'All unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-c', - 'First custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-c'); - assert_equals(queryResult.item(1).localName, 'x-d', - 'Second custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-d'); - - doc.registerElement('x-c'); - queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 1, - 'Only unresolved custom elements should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-d', - 'Custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-d'); -}, 'If there are more than one unresolved custom element then all of them accessible ' + - 'by Document.querySelectorAll(\':unresolved\')'); - - -test(function() { - var doc = newHTMLDocument(); - var customElement = doc.createElement('x-e'); - doc.body.appendChild(customElement); - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 1, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-e', - 'Custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-e'); -}, 'Unresolved custom element, created via Document.createElement(), should be ' + - 'accessible by Document.querySelectorAll(\':unresolved\')'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-f><x-g></x-g></x-f>'; - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 2, - 'All unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-f', - 'First custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-f'); - assert_equals(queryResult.item(1).localName, 'x-g', - 'Second custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-g'); - - doc.registerElement('x-g'); - queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 1, - 'Only unresolved custom elements should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).localName, 'x-f', - 'Custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-f'); -}, 'All unresolved custom element including nested ones are accessible ' + - 'by Document.querySelectorAll(\':unresolved\')'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 1, - 'Unresolved custom element should be accessible by ' + - 'Document.querySelectorAll(\':unresolved\')'); - assert_equals(queryResult.item(0).localName, 'x-element', - 'Custom element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be x-element'); -}, 'Unresolved custom element should be accessible by ' + - 'Document.querySelectorAll(\':unresolved\') in a loaded document'); - - -test(function() { - var doc = newHTMLDocument(); - - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) === -1) { - var obj = doc.createElement(tagName); - var name = 'x-h-' + tagName; - var id = 'x-h-' + tagName + '-id'; - if (HTML5_TABLE_ELEMENTS.indexOf(tagName) !== -1) { - doc.body.innerHTML = - '<table>' + - '<' + tagName + ' id="' + id + '" is="' + name + '"></' + tagName + '>' + - '</table>'; - } else { - doc.body.innerHTML = - '<' + tagName + ' id="' + id + '" is="' + name + '"></' + tagName + '>'; - } - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_not_equals(queryResult, null, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(queryResult.item(0).id, id, - 'ID of element returned by Document.querySelectorAll(\':unresolved\') ' + - 'should be ' + id); - - var proto = Object.create(obj.constructor.prototype); - doc.registerElement(name, {prototype: proto, extends: tagName}); - var queryResult2 = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult2.length, 0, - 'Registered custom element should not be accessible by :unresolved pseudoclass'); - } - }); -}, 'Test that Document.querySelectorAll(\':unresolved\') returns unresolved custom elements, ' + - 'extending HTML elements by IS attribute'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-i><a is="x-j"></a></x-i><x-k></x-k><b is="x-l"/>'; - var queryResult = doc.querySelectorAll(':unresolved'); - - assert_equals(queryResult.length, 4, - 'All unresolved custom element should be accessible by :unresolved pseudoclass'); - - var elementNames = [ - queryResult.item(0).localName, - queryResult.item(1).localName, - queryResult.item(2).localName, - queryResult.item(3).localName]; - assert_array_equals(elementNames, ['x-i', 'a', 'x-k', 'b'], - 'Document.querySelectorAll(\':unresolved\') return unexpected result'); - - var isAttributes = [ - queryResult.item(0).getAttribute('is'), - queryResult.item(1).getAttribute('is'), - queryResult.item(2).getAttribute('is'), - queryResult.item(3).getAttribute('is')]; - assert_array_equals(isAttributes, [null, 'x-j', null, 'x-l'], - 'Document.querySelectorAll(\':unresolved\') return unexpected result'); -}, 'Test Document.querySelectorAll(\':unresolved\') returns mix of custom elements of different types'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector.html deleted file mode 100644 index 47b7e5c4718..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector.html +++ /dev/null @@ -1,161 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>The :unresolved pseudoclass matching with Document.querySelector()</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="The :unresolved pseudoclass must match all custom elements whose created callback has not yet been invoked"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#unresolved-element-pseudoclass"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-a></x-a>'; - var customElement = doc.querySelector(':unresolved'); - - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved'); - assert_equals(customElement.localName, 'x-a', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-a'); -}, 'Test that unresolved custom element is accessible by Document.querySelector(\':unresolved\')'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-b></x-b>'; - var customElement = doc.querySelector(':unresolved'); - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved'); - assert_equals(customElement.localName, 'x-b', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-b'); - - doc.registerElement('x-b'); - customElement = doc.querySelector(':unresolved'); - assert_equals(customElement, null, - 'Registered custom element should not be accessible by :unresolved pseudoclass'); -}, 'Test that registered custom element are not accessible by :unresolved'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-c></x-c><x-d></x-d>'; - var customElement = doc.querySelector(':unresolved'); - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(customElement.localName, 'x-c', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-c'); - - doc.registerElement('x-c'); - customElement = doc.querySelector(':unresolved'); - assert_not_equals(customElement, null, - 'Unresolved custom elements should be accessible by :unresolved pseudoclass'); - assert_equals(customElement.localName, 'x-d', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-d'); -}, 'If there are more than one unresolved custom element, all of them should be ' + - 'accessible by :unresolved pseudoclass'); - - -test(function() { - var doc = newHTMLDocument(); - var customElement = doc.createElement('x-e'); - doc.body.appendChild(customElement); - var queryResult = doc.querySelector(':unresolved'); - - assert_not_equals(queryResult, null, - 'Unresolved custom element should be accessible by :unresolved'); - assert_equals(queryResult.localName, 'x-e', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-e'); -}, 'Unresolved custom element, created via Document.createElement(), should be ' + - 'accessible by Document.querySelector(\':unresolved\')'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<div><x-f></x-f><div>'; - var customElement = doc.querySelector(':unresolved'); - - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved'); - assert_equals(customElement.localName, 'x-f', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-f'); -}, 'Unresolved custom element inside div element should be accessible by ' + - ':unresolved pseudoclass'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-h><x-g></x-g></x-h>'; - var customElement = doc.querySelector(':unresolved'); - - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(customElement.localName, 'x-h', - 'Custom element returned by Document.querySelector(\':unresolved\') ' + - 'should be x-h'); - - doc.registerElement('x-h'); - customElement = doc.querySelector(':unresolved'); - - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(customElement.localName, 'x-g', - 'Custom element returned by Document.querySelector(\':unresolved\') ' + - 'should be x-g'); -}, 'All unresolved custom element including nested ones should be accessible ' + - 'by Document.querySelector(\':unresolved\')'); - - -testInIFrame('../../resources/x-element.html', function(doc) { - var customElement = doc.querySelector(':unresolved'); - - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved'); - assert_equals(customElement.localName, 'x-element', - 'Custom element returned by Document.querySelector(\':unresolved\') should be x-element'); -}, 'Document.querySelector(): Unresolved custom element should be accessible by :unresolved ' + - 'in loaded document'); - - -test(function() { - var doc = newHTMLDocument(); - - HTML5_ELEMENTS.forEach(function(tagName) { - if (HTML5_DOCUMENT_ELEMENTS.indexOf(tagName) === -1) { - var obj = doc.createElement(tagName); - var name = 'x-i-' + tagName; - var id = 'x-i-' + tagName + '-id'; - if (HTML5_TABLE_ELEMENTS.indexOf(tagName) !== -1) { - doc.body.innerHTML = - '<table>' + - '<' + tagName + ' id="' + id + '" is="' + name + '"></' + tagName + '>' + - '</table>'; - } else { - doc.body.innerHTML = - '<' + tagName + ' id="' + id + '" is="' + name + '"></' + tagName + '>'; - } - var customElement = doc.querySelector(':unresolved'); - - assert_not_equals(customElement, null, - 'Unresolved custom element should be accessible by :unresolved pseudoclass'); - assert_equals(customElement.id, id, - 'ID of element returned by Document.querySelector(\':unresolved\') ' + - 'should be ' + id); - - var proto = Object.create(obj.constructor.prototype); - doc.registerElement(name, {prototype: proto, extends: tagName}); - var customElement2 = doc.querySelector(':unresolved'); - - assert_equals(customElement2, null, - 'Registered custom element should not be accessible by :unresolved pseudoclass'); - } - }); -}, 'Test that Document.querySelector(\':unresolved\') returns custom element, ' + - 'extending HTML elements by IS attribute'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-html-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-html-element.html deleted file mode 100644 index 492c75b7290..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-html-element.html +++ /dev/null @@ -1,56 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Unresolved element interface must be HTMLElement, if the namespace is HTML Namespace</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="When an unresolved element is created, it's element interface must be HTMLElement, if the namespace is HTML Namespace"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = '<x-a id="x-a"></x-a>'; - var customElement = doc.querySelector('#x-a'); - - assert_not_equals(customElement, null, 'Unregistered custom element should not be null'); - - assert_class_string(customElement, 'HTMLElement', - 'Unresolved custom element must be a HTML element'); -}, 'Test interface of unresolved element, created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var customElement = doc.createElement('x-b'); - - assert_class_string(customElement, 'HTMLElement', - 'Unresolved custom element must be a HTML element'); -}, 'Test interface of unresolved element, created by Document.createElement'); - - -test(function() { - var doc = newHTMLDocument(); - var customElement = doc.createElementNS(HTML_NAMESPACE, 'x-c'); - - assert_class_string(customElement, 'HTMLElement', - 'Unresolved custom element must be a HTML element'); -}, 'Test interface of unresolved element, created by Document.createElementNS'); - - -testInIFrame('../resources/x-element.html', function(doc) { - var customElement = doc.getElementById('x-element'); - - assert_not_equals(customElement, null, 'Unregistered custom element should not be null'); - - assert_class_string(customElement, 'HTMLElement', - 'Unresolved custom element must be a HTML element'); -}, 'Test unresolved element interface in loaded HTML document'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-html-unknown-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-html-unknown-element.html deleted file mode 100644 index 70c23d3c987..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-html-unknown-element.html +++ /dev/null @@ -1,53 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Unresolved element interface must be HTMLUnknownElement, if the namespace is neither HTML Namespace nor SVG Namespace</title> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="When an unresolved element is created, it's element interface must be HTMLUnknownElement, if the namespace is neither HTML Namespace nor SVG Namespace"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = - '<math xmlns="' + MATHML_NAMESPACE + '">' + - '<x-a id="x-a"></x-a>' + - '</math>'; - var xa = doc.querySelector('#x-a'); - - assert_not_equals(xa, null, 'Unregistered custom element should not be null'); - - // According https://code.google.com/p/chromium/issues/detail?id=336377 - // expected class string is Element - assert_class_string(xa, 'Element', 'Unresolved custom element must be an Element'); -}, 'Test interface of unresolved element with MathML namespace, created via innerHTML property'); - - -test(function() { - var doc = newHTMLDocument(); - var xa = doc.createElementNS(MATHML_NAMESPACE, 'x-b'); - - assert_class_string(xa, 'Element', - 'Unresolved custom element must be a HTMLUnknownElement'); -}, 'Test interface of unresolved element with MathML namespace, ' + - 'created by Document.createElementNS'); - - -testInIFrame('../resources/x-mathml-element.html', function(doc) { - var customElement = doc.getElementById('x-math-element'); - - assert_not_equals(customElement, null, 'Unregistered custom element should not be null'); - - assert_class_string(customElement, 'Element', - 'Unresolved custom element must be a Element'); -}, 'Test interface of unresolved element in loaded HTML document with embedded MathML elements'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-svg-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-svg-element.html deleted file mode 100644 index 4164b62dc9c..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/registering/unresolved-elements-interface-svg-element.html +++ /dev/null @@ -1,47 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Unresolved element interface must be SVGElement, if the namespace is SVG Namespace</title> -<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -<meta name="author" title="Vasiliy Degtyarev" href="mailto:vasya@unipro.ru"> -<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -<meta name="assert" content="When an unresolved element is created, it's element interface must be SVGElement if the namespace is SVG Namespace"> -<link rel="help" href="http://www.w3.org/TR/custom-elements/#registering-custom-elements"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="../testcommon.js"></script> -</head> -<body> -<div id="log"></div> -<script> -test(function() { - var doc = newHTMLDocument(); - var xsvg = doc.createElementNS(SVG_NAMESPACE, 'x-svg'); - - assert_class_string(xsvg, 'SVGElement', 'Unresolved custom element must be a SVG element'); -}, 'Test interface of unresolved element with valid name, created by Document.createElementNS()'); - - -test(function() { - var doc = newHTMLDocument(); - doc.body.innerHTML = - '<svg xmlns=' + SVG_NAMESPACE + ' version="1.1">' + - '<x-svg-a id="x-svg"></x-svg-a>' + - '</svg>'; - var xsvg = doc.querySelector('#x-svg'); - - assert_class_string(xsvg, 'SVGElement', 'Unresolved custom element must be a SVG element'); -}, 'Test interface of unresolved element with valid name, created via innerHTML property'); - - -testInIFrame('../resources/x-svg-element.html', function(doc) { - var xsvg = doc.getElementById('x-svg-element'); - - assert_not_equals(xsvg, null, 'Unresolved custom element should not be null'); - - assert_class_string(xsvg, 'SVGElement', - 'Unresolved custom element must be a SVG element'); -}, 'Test interface of unresolved element in loaded HTML document with embedded SVG elements'); -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/blank.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/blank.html deleted file mode 100644 index 2e5697ba1fd..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/blank.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>Blank document</title> - <link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -</head> -<body> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/import-master-async.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/import-master-async.html deleted file mode 100644 index 0ecaafb29b7..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/import-master-async.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Import Master Document (asynchronous)</title> - <link rel="import" href="import.html" async> - </head> - <body> - <p>Master document body</p> - </body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/import-master.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/import-master.html deleted file mode 100644 index d91bcb9cdb6..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/import-master.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Import Master Document</title> - <link rel="import" href="import.html"> - </head> - <body> - <p>Master document body</p> - </body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/import.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/import.html deleted file mode 100644 index dddc4670181..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/import.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Import Document</title> - </head> - <body> - <p>Import Document body</p> - </body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/register-and-create-custom-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/register-and-create-custom-element.html deleted file mode 100644 index 3aabff24485..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/register-and-create-custom-element.html +++ /dev/null @@ -1,19 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>Register and create custom element</title> - <link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> - <link rel="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -</head> -<body> - <div id="log"></div> - <script> - var proto = Object.create(HTMLElement.prototype); - proto.createdCallback = function() { - document.querySelector('#log').textContent = 'Created callback was called'; - }; - document.registerElement('x-element', {prototype: proto}); - </script> - <x-element id="x-element"></x-element> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-element.html deleted file mode 100644 index 0c0d2daad6a..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-element.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>x-element custom element</title> - <link rel="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru"> -</head> -<body> - <x-element id="x-element"></x-element> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-mathml-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-mathml-element.html deleted file mode 100644 index 3efdc2d0088..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-mathml-element.html +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>Custom element in MathML namespace</title> - <link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -</head> -<body> - <math xmlns="http://www.w3.org/1998/Math/MathML"> - <x-math-element id="x-math-element"></x-math-element> - </math> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-svg-element.html b/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-svg-element.html deleted file mode 100644 index 6cea8575882..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/resources/x-svg-element.html +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>SVG custom element</title> - <link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru"> -</head> -<body> - <svg height="100" width="100"> - <x-svg-element id="x-svg-element"></x-element> - </svg> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/custom-elements/v0/testcommon.js b/tests/wpt/web-platform-tests/custom-elements/v0/testcommon.js deleted file mode 100644 index 5cddbe8bc72..00000000000 --- a/tests/wpt/web-platform-tests/custom-elements/v0/testcommon.js +++ /dev/null @@ -1,286 +0,0 @@ -/* -Distributed under both the W3C Test Suite License [1] and the W3C -3-clause BSD License [2]. To contribute to a W3C Test Suite, see the -policies and contribution forms [3]. - -[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license -[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license -[3] http://www.w3.org/2004/10/27-testcases - */ - -"use strict"; - -var HTML5_ELEMENTS = [ 'a', 'abbr', 'address', 'area', 'article', 'aside', - 'audio', 'b', 'base', 'bdi', 'bdo', 'blockquote', 'body', 'br', - 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', - 'command', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', - 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', - 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', - 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', - 'keygen', 'label', 'legend', 'li', 'link', 'map', 'mark', 'menu', - 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', - 'option', 'output', 'p', 'param', 'pre', 'progress', 'q', 'rp', 'rt', - 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', - 'span', 'strong', 'style', 'sub', 'table', 'tbody', 'td', 'textarea', - 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', - 'var', 'video', 'wbr' ]; - -var HTML5_DOCUMENT_ELEMENTS = [ 'html', 'head', 'body' ]; - -var HTML5_TABLE_ELEMENTS = [ 'caption', 'col', 'colgroup', 'tbody', 'td', - 'tfoot', 'th', 'thead', 'tr' ]; - -var EXTENDER_CHARS = [ 0x00B7, 0x02D0, 0x02D1, 0x0387, 0x0640, 0x0E46, 0x0EC6, - 0x3005, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x309D, 0x309E, 0x30FC, - 0x30FD, 0x30FE ]; - -var COMBINING_CHARS = [ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, - 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, - 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, - 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, 0x0320, 0x0321, - 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032A, - 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, 0x0330, 0x0331, 0x0332, 0x0333, - 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, - 0x033D, 0x033E, 0x033F, 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, - 0x0360, 0x0361, 0x0483, 0x0484, 0x0485, 0x0486, 0x0591, 0x0592, 0x0593, - 0x0594, 0x0595, 0x0596, 0x0597, 0x0598, 0x0599, 0x05A0, 0x05A1, 0x05A3, - 0x05A4, 0x05A5, 0x05A6, 0x05A7, 0x05A8, 0x05A9, 0x05AA, 0x05AB, 0x05AC, - 0x05AD, 0x05AE, 0x05AF, 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, - 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BB, 0x05BC, 0x05BD, 0x05BF, 0x05C1, - 0x05C2, 0x05C4, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, - 0x0652, 0x0670, 0x06D6, 0x06D7, 0x06D8, 0x06D9, 0x06DA, 0x06DB, 0x06DC, - 0x06DD, 0x06DE, 0x06DF, 0x06E0, 0x06E1, 0x06E2, 0x06E3, 0x06E4, 0x06E7, - 0x06E8, 0x06EA, 0x06EB, 0x06EC, 0x06ED, 0x0901, 0x0902, 0x0903, 0x093C, - 0x093E, 0x093F, 0x0940, 0x0941, 0x0942, 0x0943, 0x0944, 0x0945, 0x0946, - 0x0947, 0x0948, 0x0949, 0x094A, 0x094B, 0x094C, 0x094D, 0x0951, 0x0952, - 0x0953, 0x0954, 0x0962, 0x0963, 0x0981, 0x0982, 0x0983, 0x09BC, 0x09BE, - 0x09BF, 0x09C0, 0x09C1, 0x09C2, 0x09C3, 0x09C4, 0x09C7, 0x09C8, 0x09CB, - 0x09CC, 0x09CD, 0x09D7, 0x09E2, 0x09E3, 0x0A02, 0x0A3C, 0x0A3E, 0x0A3F, - 0x0A40, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4C, 0x0A4D, 0x0A70, - 0x0A71, 0x0A81, 0x0A82, 0x0A83, 0x0ABC, 0x0ABE, 0x0ABF, 0x0AC0, 0x0AC1, - 0x0AC2, 0x0AC3, 0x0AC4, 0x0AC5, 0x0AC7, 0x0AC8, 0x0AC9, 0x0ACB, 0x0ACC, - 0x0ACD, 0x0B01, 0x0B02, 0x0B03, 0x0B3C, 0x0B3E, 0x0B3F, 0x0B40, 0x0B41, - 0x0B42, 0x0B43, 0x0B47, 0x0B48, 0x0B4B, 0x0B4C, 0x0B4D, 0x0B56, 0x0B57, - 0x0B82, 0x0B83, 0x0BBE, 0x0BBF, 0x0BC0, 0x0BC1, 0x0BC2, 0x0BC6, 0x0BC7, - 0x0BC8, 0x0BCA, 0x0BCB, 0x0BCC, 0x0BCD, 0x0BD7, 0x0C01, 0x0C02, 0x0C03, - 0x0C3E, 0x0C3F, 0x0C40, 0x0C41, 0x0C42, 0x0C43, 0x0C44, 0x0C46, 0x0C47, - 0x0C48, 0x0C4A, 0x0C4B, 0x0C4C, 0x0C4D, 0x0C55, 0x0C56, 0x0C82, 0x0C83, - 0x0CBE, 0x0CBF, 0x0CC0, 0x0CC1, 0x0CC2, 0x0CC3, 0x0CC4, 0x0CC6, 0x0CC7, - 0x0CC8, 0x0CCA, 0x0CCB, 0x0CCC, 0x0CCD, 0x0CD5, 0x0CD6, 0x0D02, 0x0D03, - 0x0D3E, 0x0D3F, 0x0D40, 0x0D41, 0x0D42, 0x0D43, 0x0D46, 0x0D47, 0x0D48, - 0x0D4A, 0x0D4B, 0x0D4C, 0x0D4D, 0x0D57, 0x0E31, 0x0E34, 0x0E35, 0x0E36, - 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, - 0x0E4C, 0x0E4D, 0x0E4E, 0x0EB1, 0x0EB4, 0x0EB5, 0x0EB6, 0x0EB7, 0x0EB8, - 0x0EB9, 0x0EBB, 0x0EBC, 0x0EC8, 0x0EC9, 0x0ECA, 0x0ECB, 0x0ECC, 0x0ECD, - 0x0F18, 0x0F19, 0x0F35, 0x0F37, 0x0F39, 0x0F3E, 0x0F3F, 0x0F71, 0x0F72, - 0x0F73, 0x0F74, 0x0F75, 0x0F76, 0x0F77, 0x0F78, 0x0F79, 0x0F7A, 0x0F7B, - 0x0F7C, 0x0F7D, 0x0F7E, 0x0F7F, 0x0F80, 0x0F81, 0x0F82, 0x0F83, 0x0F84, - 0x0F86, 0x0F87, 0x0F88, 0x0F89, 0x0F8A, 0x0F8B, 0x0F90, 0x0F91, 0x0F92, - 0x0F93, 0x0F94, 0x0F95, 0x0F97, 0x0F99, 0x0F9A, 0x0F9B, 0x0F9C, 0x0F9D, - 0x0F9E, 0x0F9F, 0x0FA0, 0x0FA1, 0x0FA2, 0x0FA3, 0x0FA4, 0x0FA5, 0x0FA6, - 0x0FA7, 0x0FA8, 0x0FA9, 0x0FAA, 0x0FAB, 0x0FAC, 0x0FAD, 0x0FB1, 0x0FB2, - 0x0FB3, 0x0FB4, 0x0FB5, 0x0FB6, 0x0FB7, 0x0FB9, 0x20D0, 0x20D1, 0x20D2, - 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20D8, 0x20D9, 0x20DA, 0x20DB, - 0x20DC, 0x20E1, 0x302A, 0x302B, 0x302C, 0x302D, 0x302E, 0x302F, 0x3099, - 0x309A ]; - -var BASE_CHARS_SINGLE = [ 0x0386, 0x038C, 0x03DA, 0x03DC, 0x03DE, 0x03E0, - 0x0559, 0x06D5, 0x093D, 0x09B2, 0x0A5E, 0x0A8D, 0x0ABD, 0x0AE0, 0x0B3D, - 0x0B9C, 0x0CDE, 0x0E30, 0x0E84, 0x0E8A, 0x0E8D, 0x0EA5, 0x0EA7, 0x0EB0, - 0x0EBD, 0x1100, 0x1109, 0x113C, 0x113E, 0x1140, 0x114C, 0x114E, 0x1150, - 0x1159, 0x1163, 0x1165, 0x1167, 0x1169, 0x1175, 0x119E, 0x11A8, 0x11AB, - 0x11BA, 0x11EB, 0x11F0, 0x11F9, 0x1F59, 0x1F5B, 0x1F5D, 0x1FBE, 0x2126, - 0x212E ]; - -var BASE_CHARS_RANGES = [ 0x0041, 0x005A, 0x0061, 0x007A, 0x00C0, 0x00D6, - 0x00D8, 0x00F6, 0x00F8, 0x00FF, 0x0100, 0x0131, 0x0134, 0x013E, 0x0141, - 0x0148, 0x014A, 0x017E, 0x0180, 0x01C3, 0x01CD, 0x01F0, 0x01F4, 0x01F5, - 0x01FA, 0x0217, 0x0250, 0x02A8, 0x02BB, 0x02C1, 0x0388, 0x038A, 0x038E, - 0x03A1, 0x03A3, 0x03CE, 0x03D0, 0x03D6, 0x03E2, 0x03F3, 0x0401, 0x040C, - 0x040E, 0x044F, 0x0451, 0x045C, 0x045E, 0x0481, 0x0490, 0x04C4, 0x04C7, - 0x04C8, 0x04CB, 0x04CC, 0x04D0, 0x04EB, 0x04EE, 0x04F5, 0x04F8, 0x04F9, - 0x0531, 0x0556, 0x0561, 0x0586, 0x05D0, 0x05EA, 0x05F0, 0x05F2, 0x0621, - 0x063A, 0x0641, 0x064A, 0x0671, 0x06B7, 0x06BA, 0x06BE, 0x06C0, 0x06CE, - 0x06D0, 0x06D3, 0x06E5, 0x06E6, 0x0905, 0x0939, 0x0958, 0x0961, 0x0985, - 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B6, 0x09B9, - 0x09DC, 0x09DD, 0x09DF, 0x09E1, 0x09F0, 0x09F1, 0x0A05, 0x0A0A, 0x0A0F, - 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, - 0x0A38, 0x0A39, 0x0A59, 0x0A5C, 0x0A72, 0x0A74, 0x0A85, 0x0A8B, 0x0A8F, - 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, - 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, - 0x0B33, 0x0B36, 0x0B39, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B85, 0x0B8A, - 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9E, 0x0B9F, 0x0BA3, - 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB5, 0x0BB7, 0x0BB9, 0x0C05, 0x0C0C, - 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C33, 0x0C35, 0x0C39, 0x0C60, - 0x0C61, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, - 0x0CB5, 0x0CB9, 0x0CE0, 0x0CE1, 0x0D05, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, - 0x0D28, 0x0D2A, 0x0D39, 0x0D60, 0x0D61, 0x0E01, 0x0E2E, 0x0E32, 0x0E33, - 0x0E40, 0x0E45, 0x0E81, 0x0E82, 0x0E87, 0x0E88, 0x0E94, 0x0E97, 0x0E99, - 0x0E9F, 0x0EA1, 0x0EA3, 0x0EAA, 0x0EAB, 0x0EAD, 0x0EAE, 0x0EB2, 0x0EB3, - 0x0EC0, 0x0EC4, 0x0F40, 0x0F47, 0x0F49, 0x0F69, 0x10A0, 0x10C5, 0x10D0, - 0x10F6, 0x1102, 0x1103, 0x1105, 0x1107, 0x110B, 0x110C, 0x110E, 0x1112, - 0x1154, 0x1155, 0x115F, 0x1161, 0x116D, 0x116E, 0x1172, 0x1173, 0x11AE, - 0x11AF, 0x11B7, 0x11B8, 0x11BC, 0x11C2, 0x1E00, 0x1E9B, 0x1EA0, 0x1EF9, - 0x1F00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, - 0x1F57, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, 0x1FC2, 0x1FC4, - 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, - 0x1FF4, 0x1FF6, 0x1FFC, 0x212A, 0x212B, 0x2180, 0x2182, 0x3041, 0x3094, - 0x30A1, 0x30FA, 0x3105, 0x312C, 0xAC00, 0xD7A3 ]; - -var IDEOGRAPHIC_CHARS_SINGLE = [ 0x3007 ]; - -var IDEOGRAPHIC_CHARS_RANGES = [ 0x3021, 0x3029, 0x4E00, 0x9FA5 ]; - -var DIGIT_CHARS_RANGES = [ 0x0030, 0x0039, 0x0660, 0x0669, 0x06F0, 0x06F9, - 0x0966, 0x096F, 0x09E6, 0x09EF, 0x0A66, 0x0A6F, 0x0AE6, 0x0AEF, 0x0B66, - 0x0B6F, 0x0BE7, 0x0BEF, 0x0C66, 0x0C6F, 0x0CE6, 0x0CEF, 0x0D66, 0x0D6F, - 0x0E50, 0x0E59, 0x0ED0, 0x0ED9, 0x0F20, 0x0F29 ]; - -function CharsArray(array) { - this.array = array; -} - -CharsArray.prototype.testEach = function(namingFunction, checkFunction) { - if (this.array != null) { - this.array.forEach(function(value) { - checkFunction(namingFunction(getCharCode(value))); - }); - } -}; - -function CharRangesArray(array) { - this.array = array; -} - -CharRangesArray.prototype.testEach = function(namingFunction, checkFunction) { - if (this.array != null) { - for (var i = 0; i < this.array.length; i += 2) { - var rangeStart = getCharCode(this.array[i]); - var rangeEnd = getCharCode(this.array[i+1]); - for (var c = rangeStart; c <= rangeEnd; c++) { - checkFunction(namingFunction(c)); - } - } - } -}; - -function testCharCode(charCode, namingFunction, checkFunction) { - checkFunction(namingFunction(charCode)); -} - -var extenderChars = new CharsArray(EXTENDER_CHARS); -var combiningChars = new CharsArray(COMBINING_CHARS); -var baseCharsSingle = new CharsArray(BASE_CHARS_SINGLE); -var baseCharsRanges = new CharRangesArray(BASE_CHARS_RANGES); -var ideographicCharsSingle = new CharsArray(IDEOGRAPHIC_CHARS_SINGLE); -var ideographicCharsRanges = new CharRangesArray(IDEOGRAPHIC_CHARS_RANGES); -var digitCharsRanges = new CharRangesArray(DIGIT_CHARS_RANGES); - -// Helper function, which verifies that given custom element name is valid -function checkValidName(name) { - var doc = newHTMLDocument(); - try { - doc.registerElement(name); - } catch (e) { - assert_unreached('The custom element name \'' + name + - '\' should be registered without errors'); - } -} - -// Helper function, which verifies that given custom element name is invalid -function checkInvalidName(name) { - var doc = newHTMLDocument(); - assert_throws('SyntaxError', function() { - doc.registerElement(name); - }, 'Registering invalid custom element name \'' + name + '\' should fail'); -} - -// Helper function to extract character code from given object -// expected input: either charater code or one character long string. -function getCharCode(c) { - if (typeof(c) === 'string') { - assert_equals(1, c.length, 'Error in test: input string should be one character long'); - c = c.charCodeAt(0); - } - assert_equals('number', typeof(c), 'Error in test: unexpected type for charater code'); - return c; -} - -var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; -var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; - -function newHTMLDocument() { - return document.implementation.createHTMLDocument('Test Document'); -} - -// Creates new iframe and loads given url into it. -// Returns reference to created iframe. -function newIFrame(url) { - assert_not_equals(url, null, 'argument url should not be null'); - var iframe = document.createElement('iframe'); - iframe.src = url; - document.body.appendChild(iframe); - return iframe; -} - -// Creates new iframe and loads given url into it. -// Function f is bound to the iframe's onload event. -// Function f receives iframe's contentDocument as argument. -// The iframe is disposed after function f is executed. -function testInIFrame(url, f, testName, testProps) { - var t = async_test(testName, testProps); - t.step(function() { - var iframe = newIFrame(url); - iframe.onload = t.step_func(function() { - try { - f(iframe.contentDocument); - t.done(); - } finally { - iframe.remove(); - } - }); - }); -} - -// Helper function to create a prototype for custom element -// with predefined callbacks -function newHTMLElementPrototype() { - return newCustomElementPrototype(HTMLElement.prototype); -} - -// Helper function to create a prototype for custom element -// with predefined callbacks -function newCustomElementPrototype(parent) { - var proto = Object.create(parent); - proto.createdCallbackThis = null; - proto.createdCallbackCalledCounter = 0; - - proto.attachedCallbackThis = null; - proto.attachedCallbackCalledCounter = 0; - - proto.detachedCallbackThis = null; - proto.detachedCallbackCalledCounter = 0; - - proto.attributeChangedCallbackThis = null; - proto.attributeChangedCallbackCalledCounter = 0; - proto.attributeChangedCallbackArgs = null; - - proto.createdCallback = function() { - proto.createdCallbackThis = this; - proto.createdCallbackCalledCounter++; - }; - proto.attachedCallback = function() { - proto.attachedCallbackThis = this; - proto.attachedCallbackCalledCounter++; - }; - proto.detachedCallback = function() { - proto.detachedCallbackThis = this; - proto.detachedCallbackCalledCounter++; - }; - proto.attributeChangedCallback = function(arg1, arg2, arg3) { - proto.attributeChangedCallbackThis = this; - proto.attributeChangedCallbackCalledCounter++; - proto.attributeChangedCallbackArgs = [arg1, arg2, arg3]; - }; - return proto; -} diff --git a/tests/wpt/web-platform-tests/dom/OWNERS b/tests/wpt/web-platform-tests/dom/OWNERS index fad498154e4..0d508945827 100644 --- a/tests/wpt/web-platform-tests/dom/OWNERS +++ b/tests/wpt/web-platform-tests/dom/OWNERS @@ -1,6 +1,5 @@ @ayg @jdm @Ms2ger -@plehegar @zcorpan @zqzhang diff --git a/tests/wpt/web-platform-tests/dom/events/Event-cancelBubble.html b/tests/wpt/web-platform-tests/dom/events/Event-cancelBubble.html new file mode 100644 index 00000000000..d8d2d7239d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/dom/events/Event-cancelBubble.html @@ -0,0 +1,132 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Event.cancelBubble</title> + <link rel="author" title="Chris Rebert" href="http://chrisrebert.com"> + <link rel="help" href="https://dom.spec.whatwg.org/#dom-event-cancelbubble"> + <meta name="flags" content="dom"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> + <div id="outer"> + <div id="middle"> + <div id="inner"></div> + </div> + </div> + <script> +test(function () { + // See https://dom.spec.whatwg.org/#stop-propagation-flag + var e = document.createEvent('Event'); + assert_false(e.cancelBubble, "cancelBubble must be false after event creation."); +}, "cancelBubble must be false when an event is initially created."); + +test(function () { + // See https://dom.spec.whatwg.org/#concept-event-initialize + + // Event which bubbles. + var one = document.createEvent('Event'); + one.cancelBubble = true; + one.initEvent('foo', true/*bubbles*/, false/*cancelable*/); + assert_false(one.cancelBubble, "initEvent() must set cancelBubble to false. [bubbles=true]"); + // Re-initialization. + one.cancelBubble = true; + one.initEvent('foo', true/*bubbles*/, false/*cancelable*/); + assert_false(one.cancelBubble, "2nd initEvent() call must set cancelBubble to false. [bubbles=true]"); + + // Event which doesn't bubble. + var two = document.createEvent('Event'); + two.cancelBubble = true; + two.initEvent('foo', false/*bubbles*/, false/*cancelable*/); + assert_false(two.cancelBubble, "initEvent() must set cancelBubble to false. [bubbles=false]"); + // Re-initialization. + two.cancelBubble = true; + two.initEvent('foo', false/*bubbles*/, false/*cancelable*/); + assert_false(two.cancelBubble, "2nd initEvent() call must set cancelBubble to false. [bubbles=false]"); +}, "Initializing an event must set cancelBubble to false."); + +test(function () { + // See https://dom.spec.whatwg.org/#dom-event-stoppropagation + var e = document.createEvent('Event'); + e.stopPropagation(); + assert_true(e.cancelBubble, "stopPropagation() must set cancelBubble to true."); +}, "stopPropagation() must set cancelBubble to true."); + +test(function () { + // See https://dom.spec.whatwg.org/#dom-event-stopimmediatepropagation + var e = document.createEvent('Event'); + e.stopImmediatePropagation(); + assert_true(e.cancelBubble, "stopImmediatePropagation() must set cancelBubble to true."); +}, "stopImmediatePropagation() must set cancelBubble to true."); + +test(function () { + var one = document.createEvent('Event'); + one.stopPropagation(); + one.cancelBubble = false; + assert_true(one.cancelBubble, "cancelBubble must still be true after attempting to set it to false."); +}, "Event.cancelBubble=false must have no effect."); + +test(function (t) { + var outer = document.getElementById('outer'); + var middle = document.getElementById('middle'); + var inner = document.getElementById('inner'); + + outer.addEventListener('barbaz', t.step_func(function () { + assert_unreached("Setting Event.cancelBubble=false after setting Event.cancelBubble=true should have no effect."); + }), false/*useCapture*/); + + middle.addEventListener('barbaz', function (e) { + e.cancelBubble = true;// Stop propagation. + e.cancelBubble = false;// Should be a no-op. + }, false/*useCapture*/); + + var barbazEvent = document.createEvent('Event'); + barbazEvent.initEvent('barbaz', true/*bubbles*/, false/*cancelable*/); + inner.dispatchEvent(barbazEvent); +}, "Event.cancelBubble=false must have no effect during event propagation."); + +test(function () { + // See https://dom.spec.whatwg.org/#concept-event-dispatch + // "14. Unset event’s [...] stop propagation flag," + var e = document.createEvent('Event'); + e.initEvent('foobar', true/*bubbles*/, true/*cancelable*/); + document.body.addEventListener('foobar', function listener(e) { + e.stopPropagation(); + }); + document.body.dispatchEvent(e); + assert_false(e.cancelBubble, "cancelBubble must be false after an event has been dispatched."); +}, "cancelBubble must be false after an event has been dispatched."); + +test(function (t) { + var outer = document.getElementById('outer'); + var middle = document.getElementById('middle'); + var inner = document.getElementById('inner'); + + var propagationStopper = function (e) { + e.cancelBubble = true; + }; + + // Bubble phase + middle.addEventListener('bar', propagationStopper, false/*useCapture*/); + outer.addEventListener('bar', t.step_func(function listenerOne() { + assert_unreached("Setting cancelBubble=true should stop the event from bubbling further."); + }), false/*useCapture*/); + + var barEvent = document.createEvent('Event'); + barEvent.initEvent('bar', true/*bubbles*/, false/*cancelable*/); + inner.dispatchEvent(barEvent); + + // Capture phase + outer.addEventListener('qux', propagationStopper, true/*useCapture*/); + middle.addEventListener('qux', t.step_func(function listenerTwo() { + assert_unreached("Setting cancelBubble=true should stop the event from propagating further, including during the Capture Phase."); + }), true/*useCapture*/); + + var quxEvent = document.createEvent('Event'); + quxEvent.initEvent('qux', false/*bubbles*/, false/*cancelable*/); + inner.dispatchEvent(quxEvent); +}, "Event.cancelBubble=true must set the stop propagation flag."); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubble-canceled.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubble-canceled.html new file mode 100644 index 00000000000..20f398f66f9 --- /dev/null +++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-bubble-canceled.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html> +<head> +<title>Setting cancelBubble=true prior to dispatchEvent()</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<div id="log"></div> + +<table id="table" border="1" style="display: none"> + <tbody id="table-body"> + <tr id="table-row"> + <td id="table-cell">Shady Grove</td> + <td>Aeolian</td> + </tr> + <tr id="parent"> + <td id="target">Over the river, Charlie</td> + <td>Dorian</td> + </tr> + </tbody> +</table> + +<script> +test(function() { + var event = "foo"; + var target = document.getElementById("target"); + var parent = document.getElementById("parent"); + var tbody = document.getElementById("table-body"); + var table = document.getElementById("table"); + var body = document.body; + var html = document.documentElement; + var current_targets = [window, document, html, body, table, tbody, parent, target]; + var expected_targets = []; + var actual_targets = []; + var expected_phases = []; + var actual_phases = []; + + var test_event = function(evt) { + actual_targets.push(evt.currentTarget); + actual_phases.push(evt.eventPhase); + }; + + for (var i = 0; i < current_targets.length; ++i) { + current_targets[i].addEventListener(event, test_event, true); + current_targets[i].addEventListener(event, test_event, false); + } + + var evt = document.createEvent("Event"); + evt.initEvent(event, true, true); + evt.cancelBubble = true; + target.dispatchEvent(evt); + + assert_array_equals(actual_targets, expected_targets, "actual_targets"); + assert_array_equals(actual_phases, expected_phases, "actual_phases"); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-multiple-cancelBubble.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-multiple-cancelBubble.html new file mode 100644 index 00000000000..2873fd7794b --- /dev/null +++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-multiple-cancelBubble.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> +<head> +<title>Multiple dispatchEvent() and cancelBubble</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<div id=log></div> + +<div id="parent" style="display: none"> + <input id="target" type="hidden" value=""/> +</div> + +<script> +test(function() { + var event_type = "foo"; + var target = document.getElementById("target"); + var parent = document.getElementById("parent"); + var actual_result; + var test_event = function(evt) { + actual_result.push(evt.currentTarget); + + if (parent == evt.currentTarget) { + evt.cancelBubble = true; + } + }; + + var evt = document.createEvent("Event"); + evt.initEvent(event_type, true, true); + + target.addEventListener(event_type, test_event, false); + parent.addEventListener(event_type, test_event, false); + document.addEventListener(event_type, test_event, false); + window.addEventListener(event_type, test_event, false); + + actual_result = []; + target.dispatchEvent(evt); + assert_array_equals(actual_result, [target, parent]); + + actual_result = []; + parent.dispatchEvent(evt); + assert_array_equals(actual_result, [parent]); + + actual_result = []; + document.dispatchEvent(evt); + assert_array_equals(actual_result, [document, window]); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/dom/events/Event-initEvent.html b/tests/wpt/web-platform-tests/dom/events/Event-initEvent.html index 85abdff2fe7..568232a53c1 100644 --- a/tests/wpt/web-platform-tests/dom/events/Event-initEvent.html +++ b/tests/wpt/web-platform-tests/dom/events/Event-initEvent.html @@ -85,6 +85,7 @@ test(function() { var target = document.createElement("div") var called = false target.addEventListener("type", function() { called = true }, false) + assert_false(e.cancelBubble, "cancelBubble must be false") assert_true(target.dispatchEvent(e), "dispatchEvent must return true") assert_true(called, "Listener must be called") }, "Calling initEvent must unset the stop propagation flag.") diff --git a/tests/wpt/web-platform-tests/dom/events/Event-propagation.html b/tests/wpt/web-platform-tests/dom/events/Event-propagation.html index 459d45c1886..33989eb4bf9 100644 --- a/tests/wpt/web-platform-tests/dom/events/Event-propagation.html +++ b/tests/wpt/web-platform-tests/dom/events/Event-propagation.html @@ -38,4 +38,11 @@ ev.stopImmediatePropagation(); testPropagationFlag(ev, false, "After stopImmediatePropagation()"); ev.initEvent("foo", true, false); testPropagationFlag(ev, true, "Reinitialized after stopImmediatePropagation()"); + +var ev = document.createEvent("Event"); +ev.initEvent("foo", true, false); +ev.cancelBubble = true; +testPropagationFlag(ev, false, "After cancelBubble=true"); +ev.initEvent("foo", true, false); +testPropagationFlag(ev, true, "Reinitialized after cancelBubble=true"); </script> diff --git a/tests/wpt/web-platform-tests/dom/historical.html b/tests/wpt/web-platform-tests/dom/historical.html index cec30930864..e0612be814e 100644 --- a/tests/wpt/web-platform-tests/dom/historical.html +++ b/tests/wpt/web-platform-tests/dom/historical.html @@ -71,6 +71,18 @@ var elementNuked = [ ] elementNuked.forEach(isNukedFromElement) +function isNukedFromAttr(name) { + test(function() { + var attr = document.createAttribute("test") + assert_equals(attr[name], undefined) + }, "Attr member must be nuked: " + name) +} +var attrNuked = [ + "schemaTypeInfo", + "isId" +] +attrNuked.forEach(isNukedFromAttr) + function isNukedFromDoctype(name) { test(function() { var doctype = document.implementation.createDocumentType("test", "", "") @@ -129,4 +141,29 @@ var windowNuked = [ "attachEvent" ] windowNuked.forEach(isNukedFromWindow) + +function isRemovedFromEvent(name) { + test(() => { + assert_equals(Event[name], undefined) + }, "Event should not have this constant: " + name) +} +var EventRemoved = [ + "MOUSEDOWN", + "MOUSEUP", + "MOUSEOVER", + "MOUSEOUT", + "MOUSEMOVE", + "MOUSEDRAG", + "CLICK", + "DBLCLICK", + "KEYDOWN", + "KEYUP", + "KEYPRESS", + "DRAGDROP", + "FOCUS", + "BLUR", + "SELECT", + "CHANGE" +] +EventRemoved.forEach(isRemovedFromEvent) </script> diff --git a/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html b/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html index 9fb939f7e65..9f4f8fc74c5 100644 --- a/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html +++ b/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html @@ -34,139 +34,138 @@ function check_copy(orig, copy, type) { assert_true(copy instanceof type, "Should be type"); } -function create_element_and_check(localName, type) { +function create_element_and_check(localName, typeName) { test(function() { + assert_true(typeName in window, typeName + " is not supported"); var element = document.createElement(localName); var copy = element.cloneNode(); - check_copy(element, copy, type); + check_copy(element, copy, window[typeName]); }, "createElement(" + localName + ")"); } // test1: createElement -test(function() { - create_element_and_check("a", HTMLAnchorElement); - create_element_and_check("abbr", HTMLElement); - create_element_and_check("acronym", HTMLElement); - create_element_and_check("address", HTMLElement); - create_element_and_check("applet", HTMLAppletElement); - create_element_and_check("area", HTMLAreaElement); - create_element_and_check("article", HTMLElement); - create_element_and_check("aside", HTMLElement); - create_element_and_check("audio", HTMLAudioElement); - create_element_and_check("b", HTMLElement); - create_element_and_check("base", HTMLBaseElement); - create_element_and_check("bdi", HTMLElement); - create_element_and_check("bdo", HTMLElement); - create_element_and_check("bgsound", HTMLElement); - create_element_and_check("big", HTMLElement); - create_element_and_check("blockquote",HTMLElement); - create_element_and_check("body", HTMLBodyElement); - create_element_and_check("br", HTMLBRElement); - create_element_and_check("button", HTMLButtonElement); - create_element_and_check("canvas", HTMLCanvasElement); - create_element_and_check("caption", HTMLTableCaptionElement); - create_element_and_check("center", HTMLElement); - create_element_and_check("cite", HTMLElement); - create_element_and_check("code", HTMLElement); - create_element_and_check("col", HTMLTableColElement); - create_element_and_check("colgroup", HTMLTableColElement); - create_element_and_check("data", HTMLDataElement); - create_element_and_check("datalist", HTMLDataListElement); - create_element_and_check("dialog", HTMLDialogElement); - create_element_and_check("dd", HTMLElement); - create_element_and_check("del", HTMLModElement); - create_element_and_check("details", HTMLElement); - create_element_and_check("dfn", HTMLElement); - create_element_and_check("dir", HTMLDirectoryElement); - create_element_and_check("div", HTMLDivElement); - create_element_and_check("dl", HTMLDListElement); - create_element_and_check("dt", HTMLElement); - create_element_and_check("embed", HTMLEmbedElement); - create_element_and_check("fieldset", HTMLFieldSetElement); - create_element_and_check("figcaption",HTMLElement); - create_element_and_check("figure", HTMLElement); - create_element_and_check("font", HTMLFontElement); - create_element_and_check("footer", HTMLElement); - create_element_and_check("form", HTMLFormElement); - create_element_and_check("frame", HTMLFrameElement); - create_element_and_check("frameset", HTMLFrameSetElement); - create_element_and_check("h1", HTMLHeadingElement); - create_element_and_check("h2", HTMLHeadingElement); - create_element_and_check("h3", HTMLHeadingElement); - create_element_and_check("h4", HTMLHeadingElement); - create_element_and_check("h5", HTMLHeadingElement); - create_element_and_check("h6", HTMLHeadingElement); - create_element_and_check("head", HTMLHeadElement); - create_element_and_check("header", HTMLElement); - create_element_and_check("hgroup", HTMLElement); - create_element_and_check("hr", HTMLHRElement); - create_element_and_check("html", HTMLHtmlElement); - create_element_and_check("i", HTMLElement); - create_element_and_check("iframe", HTMLIFrameElement); - create_element_and_check("img", HTMLImageElement); - create_element_and_check("input", HTMLInputElement); - create_element_and_check("ins", HTMLModElement); - create_element_and_check("isindex", HTMLElement); - create_element_and_check("kbd", HTMLElement); - create_element_and_check("label", HTMLLabelElement); - create_element_and_check("legend", HTMLLegendElement); - create_element_and_check("li", HTMLLIElement); - create_element_and_check("link", HTMLLinkElement); - create_element_and_check("main", HTMLElement); - create_element_and_check("map", HTMLMapElement); - create_element_and_check("mark", HTMLElement); - create_element_and_check("marquee", HTMLElement); - create_element_and_check("meta", HTMLMetaElement); - create_element_and_check("meter", HTMLMeterElement); - create_element_and_check("nav", HTMLElement); - create_element_and_check("nobr", HTMLElement); - create_element_and_check("noframes", HTMLElement); - create_element_and_check("noscript", HTMLElement); - create_element_and_check("object", HTMLObjectElement); - create_element_and_check("ol", HTMLOListElement); - create_element_and_check("optgroup", HTMLOptGroupElement); - create_element_and_check("option", HTMLOptionElement); - create_element_and_check("output", HTMLOutputElement); - create_element_and_check("p", HTMLParagraphElement); - create_element_and_check("param", HTMLParamElement); - create_element_and_check("pre", HTMLPreElement); - create_element_and_check("progress", HTMLProgressElement); - create_element_and_check("q", HTMLQuoteElement); - create_element_and_check("rp", HTMLElement); - create_element_and_check("rt", HTMLElement); - create_element_and_check("ruby", HTMLElement); - create_element_and_check("s", HTMLElement); - create_element_and_check("samp", HTMLElement); - create_element_and_check("script", HTMLScriptElement); - create_element_and_check("section", HTMLElement); - create_element_and_check("select", HTMLSelectElement); - create_element_and_check("small", HTMLElement); - create_element_and_check("source", HTMLSourceElement); - create_element_and_check("spacer", HTMLElement); - create_element_and_check("span", HTMLSpanElement); - create_element_and_check("strike", HTMLElement); - create_element_and_check("style", HTMLStyleElement); - create_element_and_check("sub", HTMLElement); - create_element_and_check("summary", HTMLElement); - create_element_and_check("sup", HTMLElement); - create_element_and_check("table", HTMLTableElement); - create_element_and_check("tbody", HTMLTableSectionElement); - create_element_and_check("td", HTMLTableCellElement); - create_element_and_check("template", HTMLTemplateElement); - create_element_and_check("textarea", HTMLTextAreaElement); - create_element_and_check("th", HTMLTableCellElement); - create_element_and_check("time", HTMLTimeElement); - create_element_and_check("title", HTMLTitleElement); - create_element_and_check("tr", HTMLTableRowElement); - create_element_and_check("tt", HTMLElement); - create_element_and_check("track", HTMLTrackElement); - create_element_and_check("u", HTMLElement); - create_element_and_check("ul", HTMLUListElement); - create_element_and_check("var", HTMLElement); - create_element_and_check("video", HTMLVideoElement); - create_element_and_check("unknown", HTMLUnknownElement); - create_element_and_check("wbr", HTMLElement); -}, ""); +create_element_and_check("a", "HTMLAnchorElement"); +create_element_and_check("abbr", "HTMLElement"); +create_element_and_check("acronym", "HTMLElement"); +create_element_and_check("address", "HTMLElement"); +create_element_and_check("applet", "HTMLAppletElement"); +create_element_and_check("area", "HTMLAreaElement"); +create_element_and_check("article", "HTMLElement"); +create_element_and_check("aside", "HTMLElement"); +create_element_and_check("audio", "HTMLAudioElement"); +create_element_and_check("b", "HTMLElement"); +create_element_and_check("base", "HTMLBaseElement"); +create_element_and_check("bdi", "HTMLElement"); +create_element_and_check("bdo", "HTMLElement"); +create_element_and_check("bgsound", "HTMLElement"); +create_element_and_check("big", "HTMLElement"); +create_element_and_check("blockquote","HTMLElement"); +create_element_and_check("body", "HTMLBodyElement"); +create_element_and_check("br", "HTMLBRElement"); +create_element_and_check("button", "HTMLButtonElement"); +create_element_and_check("canvas", "HTMLCanvasElement"); +create_element_and_check("caption", "HTMLTableCaptionElement"); +create_element_and_check("center", "HTMLElement"); +create_element_and_check("cite", "HTMLElement"); +create_element_and_check("code", "HTMLElement"); +create_element_and_check("col", "HTMLTableColElement"); +create_element_and_check("colgroup", "HTMLTableColElement"); +create_element_and_check("data", "HTMLDataElement"); +create_element_and_check("datalist", "HTMLDataListElement"); +create_element_and_check("dialog", "HTMLDialogElement"); +create_element_and_check("dd", "HTMLElement"); +create_element_and_check("del", "HTMLModElement"); +create_element_and_check("details", "HTMLElement"); +create_element_and_check("dfn", "HTMLElement"); +create_element_and_check("dir", "HTMLDirectoryElement"); +create_element_and_check("div", "HTMLDivElement"); +create_element_and_check("dl", "HTMLDListElement"); +create_element_and_check("dt", "HTMLElement"); +create_element_and_check("embed", "HTMLEmbedElement"); +create_element_and_check("fieldset", "HTMLFieldSetElement"); +create_element_and_check("figcaption","HTMLElement"); +create_element_and_check("figure", "HTMLElement"); +create_element_and_check("font", "HTMLFontElement"); +create_element_and_check("footer", "HTMLElement"); +create_element_and_check("form", "HTMLFormElement"); +create_element_and_check("frame", "HTMLFrameElement"); +create_element_and_check("frameset", "HTMLFrameSetElement"); +create_element_and_check("h1", "HTMLHeadingElement"); +create_element_and_check("h2", "HTMLHeadingElement"); +create_element_and_check("h3", "HTMLHeadingElement"); +create_element_and_check("h4", "HTMLHeadingElement"); +create_element_and_check("h5", "HTMLHeadingElement"); +create_element_and_check("h6", "HTMLHeadingElement"); +create_element_and_check("head", "HTMLHeadElement"); +create_element_and_check("header", "HTMLElement"); +create_element_and_check("hgroup", "HTMLElement"); +create_element_and_check("hr", "HTMLHRElement"); +create_element_and_check("html", "HTMLHtmlElement"); +create_element_and_check("i", "HTMLElement"); +create_element_and_check("iframe", "HTMLIFrameElement"); +create_element_and_check("img", "HTMLImageElement"); +create_element_and_check("input", "HTMLInputElement"); +create_element_and_check("ins", "HTMLModElement"); +create_element_and_check("isindex", "HTMLElement"); +create_element_and_check("kbd", "HTMLElement"); +create_element_and_check("label", "HTMLLabelElement"); +create_element_and_check("legend", "HTMLLegendElement"); +create_element_and_check("li", "HTMLLIElement"); +create_element_and_check("link", "HTMLLinkElement"); +create_element_and_check("main", "HTMLElement"); +create_element_and_check("map", "HTMLMapElement"); +create_element_and_check("mark", "HTMLElement"); +create_element_and_check("marquee", "HTMLElement"); +create_element_and_check("meta", "HTMLMetaElement"); +create_element_and_check("meter", "HTMLMeterElement"); +create_element_and_check("nav", "HTMLElement"); +create_element_and_check("nobr", "HTMLElement"); +create_element_and_check("noframes", "HTMLElement"); +create_element_and_check("noscript", "HTMLElement"); +create_element_and_check("object", "HTMLObjectElement"); +create_element_and_check("ol", "HTMLOListElement"); +create_element_and_check("optgroup", "HTMLOptGroupElement"); +create_element_and_check("option", "HTMLOptionElement"); +create_element_and_check("output", "HTMLOutputElement"); +create_element_and_check("p", "HTMLParagraphElement"); +create_element_and_check("param", "HTMLParamElement"); +create_element_and_check("pre", "HTMLPreElement"); +create_element_and_check("progress", "HTMLProgressElement"); +create_element_and_check("q", "HTMLQuoteElement"); +create_element_and_check("rp", "HTMLElement"); +create_element_and_check("rt", "HTMLElement"); +create_element_and_check("ruby", "HTMLElement"); +create_element_and_check("s", "HTMLElement"); +create_element_and_check("samp", "HTMLElement"); +create_element_and_check("script", "HTMLScriptElement"); +create_element_and_check("section", "HTMLElement"); +create_element_and_check("select", "HTMLSelectElement"); +create_element_and_check("small", "HTMLElement"); +create_element_and_check("source", "HTMLSourceElement"); +create_element_and_check("spacer", "HTMLElement"); +create_element_and_check("span", "HTMLSpanElement"); +create_element_and_check("strike", "HTMLElement"); +create_element_and_check("style", "HTMLStyleElement"); +create_element_and_check("sub", "HTMLElement"); +create_element_and_check("summary", "HTMLElement"); +create_element_and_check("sup", "HTMLElement"); +create_element_and_check("table", "HTMLTableElement"); +create_element_and_check("tbody", "HTMLTableSectionElement"); +create_element_and_check("td", "HTMLTableCellElement"); +create_element_and_check("template", "HTMLTemplateElement"); +create_element_and_check("textarea", "HTMLTextAreaElement"); +create_element_and_check("th", "HTMLTableCellElement"); +create_element_and_check("time", "HTMLTimeElement"); +create_element_and_check("title", "HTMLTitleElement"); +create_element_and_check("tr", "HTMLTableRowElement"); +create_element_and_check("tt", "HTMLElement"); +create_element_and_check("track", "HTMLTrackElement"); +create_element_and_check("u", "HTMLElement"); +create_element_and_check("ul", "HTMLUListElement"); +create_element_and_check("var", "HTMLElement"); +create_element_and_check("video", "HTMLVideoElement"); +create_element_and_check("unknown", "HTMLUnknownElement"); +create_element_and_check("wbr", "HTMLElement"); test(function() { var fragment = document.createDocumentFragment(); @@ -230,7 +229,16 @@ test(function() { var doc = document.implementation.createDocument(null, null); var copy = doc.cloneNode(); check_copy(doc, copy, Document); + assert_equals(doc.charset, "UTF-8"); + assert_equals(doc.charset, copy.charset); + assert_equals(doc.contentType, "application/xml"); assert_equals(doc.contentType, copy.contentType); + assert_equals(doc.URL, "about:blank") + assert_equals(doc.URL, copy.URL); + assert_equals(doc.origin, "null") + assert_equals(doc.origin, copy.origin); + assert_equals(doc.compatMode, "CSS1Compat"); + assert_equals(doc.compatMode, copy.compatMode); }, "implementation.createDocument"); test(function() { diff --git a/tests/wpt/web-platform-tests/domxpath/xml_xpath_runner.html b/tests/wpt/web-platform-tests/domxpath/xml_xpath_runner.html index a9bbb158807..42404562a3c 100644 --- a/tests/wpt/web-platform-tests/domxpath/xml_xpath_runner.html +++ b/tests/wpt/web-platform-tests/domxpath/xml_xpath_runner.html @@ -17,6 +17,10 @@ function xpath_test(test_el) { /* note this func adopts the tree! */ var new_doc = document.implementation.createDocument("", ""); var xpath = find_child_element(test_el, "xpath"); + var result = find_child_element(test_el, "result"); + var namespace = find_child_element(result, "namespace"); + var localname = find_child_element(result, "localname"); + var nth = find_child_element(result, "nth"); var tree = find_child_element(test_el, "tree"); var actual_tree = new_doc.adoptNode(tree.firstElementChild); new_doc.appendChild(actual_tree); @@ -32,6 +36,9 @@ function xpath_test(test_el) { matched.push(cur); } assert_equals(matched.length, 1, "Should match one node"); + var similar = new_doc.getElementsByTagNameNS(namespace.textContent, + localname.textContent); + assert_equals(matched[0], similar[nth.textContent]); }); } diff --git a/tests/wpt/web-platform-tests/domxpath/xml_xpath_tests.xml b/tests/wpt/web-platform-tests/domxpath/xml_xpath_tests.xml index e40bb5b6d35..91d6428f48a 100644 --- a/tests/wpt/web-platform-tests/domxpath/xml_xpath_tests.xml +++ b/tests/wpt/web-platform-tests/domxpath/xml_xpath_tests.xml @@ -6,6 +6,11 @@ <tests> <test> <xpath>//mu[@xml:id="id1"]//rho[@title][@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::rho[@object="this.nodeValue"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@object][@xml:lang="no-nb"][not(child::node())][following-sibling::alpha[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[starts-with(concat(@content,"-"),"_blank-")][not(following-sibling::*)]/iota[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::zeta[@insert][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/lambda[@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::delta[contains(concat(@object,"$"),"se$")][preceding-sibling::*[position() = 1]]//mu[@attrib][@xml:lang="en-GB"]/omicron[contains(concat(@false,"$"),"lse$")][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:id="id9"][not(following-sibling::*)]/rho[contains(concat(@attr,"$"),"100%$")][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::*[@xml:lang="en-US"][@xml:id="id10"][not(child::node())][following-sibling::alpha[contains(concat(@att,"$"),"rue$")][following-sibling::omicron[@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//omicron[contains(concat(@abort,"$"),"tt-value$")][@xml:lang="en"]/upsilon[starts-with(concat(@string,"-"),"100%-")][@xml:lang="no-nb"][@xml:id="id12"]]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <rho title="123456789" xml:lang="en-GB"/> @@ -43,6 +48,11 @@ </test> <test> <xpath>//pi[@xml:lang="no"][@xml:id="id1"]//iota[@attribute][@xml:id="id2"][not(following-sibling::*)]/phi[@object][@xml:id="id3"][not(following-sibling::*)]//pi[starts-with(concat(@number,"-"),"another attribute value-")][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:id="id4"][not(preceding-sibling::*)]/xi[@xml:id="id5"]/eta[@insert][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::nu[following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@desciption][@xml:id="id8"]/kappa[not(preceding-sibling::*)]/beta[starts-with(concat(@insert,"-"),"100%-")][not(child::node())][following-sibling::eta[starts-with(concat(@token,"-"),"content-")][not(following-sibling::*)]//pi[@and="_blank"][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:id="id10"]/psi[starts-with(@and,"another attribut")][@xml:lang="en"][@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@title="attribute"][following-sibling::eta[@or="solid 1px green"][@xml:id="id12"][following-sibling::lambda[@xml:lang="no"][@xml:id="id13"][following-sibling::theta[@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/epsilon[@object][@xml:id="id14"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="no" xml:id="id1"> <iota attribute="this-is-att-value" xml:id="id2"> @@ -82,6 +92,11 @@ </test> <test> <xpath>//pi[starts-with(@attribute,"attribute val")][@xml:lang="en-US"][@xml:id="id1"]/upsilon[starts-with(concat(@attribute,"-"),"this.nodeValue-")][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]/epsilon[following-sibling::epsilon[contains(@attrib,"10")][preceding-sibling::*[position() = 1]][following-sibling::xi[preceding-sibling::*[position() = 2]]//lambda[@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::eta[@insert][preceding-sibling::*[position() = 1]][following-sibling::omega[@token][@xml:lang="nb"][not(child::node())][following-sibling::kappa[starts-with(concat(@object,"-"),"this.nodeValue-")][@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::xi[contains(@true,"e")][@xml:id="id5"][not(child::node())][following-sibling::phi[@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::nu[following-sibling::*[position()=1]][following-sibling::zeta[starts-with(concat(@object,"-"),"attribute-")]//kappa[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::chi[@xml:lang="nb"][following-sibling::theta[@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::xi[contains(concat(@name,"$"),"789$")][@xml:lang="no"]/tau[@xml:lang="en"][not(preceding-sibling::*)]/beta[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <pi attribute="attribute value" xml:lang="en-US" xml:id="id1"> <upsilon attribute="this.nodeValue"> @@ -116,6 +131,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]/xi[@src][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]//eta[not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:id="id3"][not(child::node())][following-sibling::omega[starts-with(@name,"this.nodeVal")]//rho[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[contains(@attrib," gree")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[starts-with(concat(@insert,"-"),"100%-")][@xml:lang="no"][not(following-sibling::*)]/gamma[starts-with(@attrib,"attribu")][@xml:lang="en-GB"][not(child::node())][following-sibling::delta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::sigma[starts-with(concat(@number,"-"),"_blank-")][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::omega[starts-with(concat(@false,"-"),"this-")][not(following-sibling::*)]/epsilon[starts-with(concat(@true,"-"),"attribute-")]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <rho xml:id="id1"> <xi src="_blank" xml:lang="nb" xml:id="id2"> @@ -143,6 +163,11 @@ </test> <test> <xpath>//rho[@xml:lang="no-nb"]//tau[@attr][not(preceding-sibling::*)]/alpha[@xml:lang="en-GB"][following-sibling::*[position()=6]][not(child::node())][following-sibling::phi[starts-with(@number,"attribute val")][preceding-sibling::*[position() = 1]][following-sibling::psi[preceding-sibling::*[position() = 2]][following-sibling::phi[not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id1"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::zeta[@number][@xml:id="id2"][preceding-sibling::*[position() = 5]][following-sibling::psi[@attrib][@xml:id="id3"][preceding-sibling::*[position() = 6]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="no-nb"> <tau attr="attribute value"> @@ -161,6 +186,11 @@ </test> <test> <xpath>//sigma[@and][@xml:id="id1"]/beta[@name][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@xml:id="id3"][not(following-sibling::*)]//beta[following-sibling::*[position()=3]][not(child::node())][following-sibling::theta[not(child::node())][following-sibling::eta[contains(concat(@object,"$"),"rue$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[contains(concat(@data,"$"),"ttribute-value$")][@xml:id="id4"][not(following-sibling::omicron)]/alpha[@xml:lang="no"][@xml:id="id5"][following-sibling::kappa[@token="content"][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>1</nth> + </result> <tree> <sigma and="_blank" xml:id="id1"> <beta name="content" xml:lang="en" xml:id="id2"> @@ -181,6 +211,11 @@ </test> <test> <xpath>//lambda/kappa[contains(@false,"attribut")][@xml:id="id1"]/rho[starts-with(concat(@object,"-"),"false-")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::chi[@content][not(following-sibling::*)]/beta[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)]/psi[contains(concat(@and,"$"),"bute value$")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::alpha[starts-with(concat(@insert,"-"),"attribute-")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//kappa[@title][@xml:id="id6"][not(following-sibling::*)]//epsilon[contains(concat(@attrib,"$"),"e$")][@xml:id="id7"][not(child::node())][following-sibling::xi[@number][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omicron[@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//theta[@xml:lang="no-nb"][@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:id="id11"][not(following-sibling::*)]/rho[starts-with(@delete,"c")][@xml:id="id12"][following-sibling::alpha[@name][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::phi[@abort][@xml:lang="nb"][@xml:id="id13"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <lambda> <kappa false="attribute" xml:id="id1"> @@ -213,6 +248,11 @@ </test> <test> <xpath>//phi[@attr="100%"]//beta[contains(concat(@delete,"$"),"k$")][@xml:lang="en"][not(preceding-sibling::*)]/phi[not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:lang="en-GB"][not(following-sibling::*)]//kappa[following-sibling::nu[@name][following-sibling::*[position()=3]][following-sibling::*[@name][not(child::node())][following-sibling::sigma[starts-with(concat(@token,"-"),"another attribute value-")][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::lambda[@xml:id="id1"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/rho[contains(concat(@class,"$"),"123456789$")][not(preceding-sibling::*)][following-sibling::epsilon[@xml:lang="nb"][@xml:id="id2"]/xi//beta[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[starts-with(@abort,"fa")][@xml:id="id4"][following-sibling::phi[@true][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::nu[@string="another attribute value"][@xml:lang="no"][@xml:id="id6"][not(following-sibling::*)]/phi[contains(concat(@token,"$"),"1px green$")][not(preceding-sibling::*)]/theta[@xml:lang="no-nb"][not(following-sibling::*)]//lambda[@attr][not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::lambda)]/*[following-sibling::*[position()=1]][following-sibling::psi[contains(concat(@desciption,"$"),"n$")][@xml:id="id7"][preceding-sibling::*[position() = 1]]//theta[contains(@src,"ue")][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi attr="100%"> <beta delete="_blank" xml:lang="en"> @@ -254,6 +294,11 @@ </test> <test> <xpath>//gamma[starts-with(@data,"tr")][@xml:lang="no"][@xml:id="id1"]//omicron[starts-with(concat(@class,"-"),"attribute value-")]/rho[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@xml:lang="no"][@xml:id="id2"]//omega[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[starts-with(@object,"conten")][preceding-sibling::*[position() = 2]][following-sibling::zeta[preceding-sibling::*[position() = 3]][following-sibling::omicron[@object][@xml:lang="en-GB"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::mu[contains(@delete,"_b")][@xml:lang="no"][@xml:id="id4"][following-sibling::pi[@xml:lang="no"][not(following-sibling::*)]/alpha[@desciption][@xml:lang="en-US"][not(child::node())][following-sibling::upsilon[contains(concat(@attribute,"$"),"eValue$")][@xml:lang="en-GB"][not(following-sibling::*)]/phi[starts-with(@title,"solid 1p")][@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)][not(preceding-sibling::phi)]/epsilon[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::alpha[@token][@xml:lang="en-US"][@xml:id="id6"][following-sibling::rho[@xml:id="id7"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <gamma data="true" xml:lang="no" xml:id="id1"> <omicron class="attribute value"> @@ -285,6 +330,11 @@ </test> <test> <xpath>//mu/iota[starts-with(concat(@desciption,"-"),"attribute-")][not(child::node())][following-sibling::lambda[contains(concat(@or,"$"),"tribute-value$")][@xml:id="id1"][preceding-sibling::*[position() = 1]]//pi[starts-with(concat(@name,"-"),"false-")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::sigma[@name][not(child::node())][following-sibling::mu[following-sibling::zeta[@true][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][following-sibling::tau[starts-with(@abort,"_bl")][@xml:id="id4"][not(child::node())][following-sibling::delta[contains(@token,"soli")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 5]]//mu[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::nu[@att="attribute value"][@xml:id="id6"][preceding-sibling::*[position() = 1]]][position() = 1]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <mu> <iota desciption="attribute-value"/> @@ -306,6 +356,11 @@ </test> <test> <xpath>//*[starts-with(concat(@attribute,"-"),"attribute-")][@xml:lang="nb"]/theta[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[not(following-sibling::*)]/phi[@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]//pi[contains(concat(@attribute,"$"),"another attribute value$")][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]//eta[starts-with(@desciption,"another attribu")][@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <any attribute="attribute" xml:lang="nb"> <theta xml:lang="no" xml:id="id1"> @@ -324,6 +379,11 @@ </test> <test> <xpath>//omicron[starts-with(concat(@object,"-"),"100%-")][@xml:lang="en-GB"]//alpha[following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@content][@xml:id="id1"][preceding-sibling::*[position() = 1]]//upsilon[following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[@class][not(child::node())][following-sibling::epsilon[@desciption][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//iota[@name="attribute-value"][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[contains(concat(@object,"$"),"nodeValue$")][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <omicron object="100%" xml:lang="en-GB"> <alpha/> @@ -346,6 +406,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]//kappa[@xml:id="id2"][following-sibling::alpha[@xml:id="id3"]/nu[contains(@content,"%")][@xml:lang="en-GB"][following-sibling::*[position()=3]][not(child::node())][following-sibling::alpha[@object][@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:id="id5"][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 3]]//omicron[starts-with(concat(@desciption,"-"),"solid 1px green-")][@xml:lang="en-GB"][@xml:id="id6"]/epsilon[contains(@class,"ank")][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="nb"][following-sibling::kappa[@xml:lang="en-GB"][following-sibling::chi[starts-with(@att,"a")][@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::tau[starts-with(concat(@data,"-"),"content-")][preceding-sibling::*[position() = 4]]/delta[contains(concat(@attr,"$"),"89$")][not(child::node())][following-sibling::rho[@xml:id="id9"][following-sibling::alpha[not(following-sibling::*)]//iota[not(following-sibling::*)]//eta/lambda[@xml:lang="en"][not(child::node())][following-sibling::epsilon[starts-with(@object,"t")][@xml:lang="no"][@xml:id="id10"][following-sibling::gamma[@or][@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 2]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <kappa xml:id="id2"/> @@ -382,6 +447,11 @@ </test> <test> <xpath>//omega[starts-with(concat(@desciption,"-"),"attribute-")][@xml:lang="en"][@xml:id="id1"]/upsilon[@xml:id="id2"][not(preceding-sibling::*)]//kappa[@abort="this.nodeValue"][@xml:id="id3"][not(preceding-sibling::*)]//chi[@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]//phi[@xml:id="id5"][not(following-sibling::*)]/omega[contains(concat(@false,"$"),"te$")][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <omega desciption="attribute-value" xml:lang="en" xml:id="id1"> <upsilon xml:id="id2"> @@ -402,6 +472,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]//chi[starts-with(concat(@true,"-"),"content-")][following-sibling::upsilon[contains(@abort,"6789")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]//pi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:id="id3"][preceding-sibling::*[position() = 1]]/gamma[not(preceding-sibling::*)][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <chi true="content"/> @@ -420,6 +495,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]//theta[contains(concat(@number,"$"),"bute value$")][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[@xml:id="id2"][not(preceding-sibling::*)]/theta[starts-with(concat(@abort,"-"),"solid 1px green-")][@xml:lang="en-US"][following-sibling::upsilon[starts-with(@number,"c")][@xml:lang="no-nb"][@xml:id="id3"]//zeta[starts-with(@attrib,"100")][@xml:lang="en-US"][not(child::node())][following-sibling::chi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::eta[@xml:id="id4"]//theta[starts-with(concat(@name,"-"),"123456789-")][not(following-sibling::*)]/zeta[@xml:id="id5"]//rho[@xml:lang="no-nb"][@xml:id="id6"][not(child::node())][following-sibling::mu[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi//iota[@xml:lang="no"][@xml:id="id8"]/zeta[@xml:id="id9"][following-sibling::delta[@desciption][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::theta[starts-with(concat(@insert,"-"),"_blank-")][@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 2]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>1</nth> + </result> <tree> <psi xml:id="id1"> <theta number="attribute value"> @@ -453,6 +533,11 @@ </test> <test> <xpath>//zeta[starts-with(concat(@att,"-"),"solid 1px green-")][@xml:id="id1"]//lambda[@attribute][@xml:id="id2"][not(following-sibling::*)]//omicron[contains(concat(@abort,"$"),"e$")][not(child::node())][following-sibling::zeta[@xml:lang="nb"][preceding-sibling::*[position() = 1]]//sigma[starts-with(concat(@token,"-"),"this.nodeValue-")][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]/phi[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@false="attribute value"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::eta[starts-with(@token,"123456789")][@xml:lang="no"][@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <zeta att="solid 1px green" xml:id="id1"> <lambda attribute="another attribute value" xml:id="id2"> @@ -474,6 +559,11 @@ </test> <test> <xpath>//delta//alpha[@xml:lang="no-nb"][not(preceding-sibling::*)]//tau[@object][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[contains(concat(@and,"$"),"00%$")][@xml:lang="nb"]//rho[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::eta[@xml:id="id2"]/rho[starts-with(@abort,"this-is-")][@xml:id="id3"][not(preceding-sibling::*)]/rho[not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:lang="no"][not(following-sibling::*)]//gamma[not(child::node())][following-sibling::omega[@attribute][@xml:lang="no-nb"][@xml:id="id4"]/kappa[@attrib][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en"][@xml:id="id5"][not(child::node())][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::pi[@xml:lang="en"][@xml:id="id7"]//sigma[starts-with(@att,"123")][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=5]][following-sibling::kappa[contains(@attr,"bute value")][@xml:lang="no-nb"][@xml:id="id9"][not(child::node())][following-sibling::alpha[@and="attribute value"][@xml:id="id10"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::lambda[preceding-sibling::*[position() = 3]][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id11"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::omicron[@xml:lang="no-nb"][@xml:id="id12"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <delta> <alpha xml:lang="no-nb"> @@ -511,6 +601,11 @@ </test> <test> <xpath>//mu[@xml:lang="no"]/tau[contains(@data,"value")][@xml:lang="no"][not(child::node())][following-sibling::kappa[@att][not(following-sibling::*)]//delta[starts-with(@attrib,"100")][@xml:lang="en"][@xml:id="id1"]//omega[@xml:lang="en-GB"][@xml:id="id2"]/epsilon[@delete][following-sibling::sigma[@xml:id="id3"]/nu[starts-with(@token,"a")][not(preceding-sibling::*)]/rho[contains(concat(@delete,"$"),"00%$")][@xml:lang="no"][@xml:id="id4"]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <mu xml:lang="no"> <tau data="attribute-value" xml:lang="no"/> @@ -533,6 +628,11 @@ </test> <test> <xpath>//zeta[starts-with(concat(@object,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id1"]//pi[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)]/eta[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::eta)]/rho[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::pi[@desciption]/epsilon[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@att="true"][following-sibling::psi[starts-with(@abort,"attribute")][@xml:id="id6"][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <zeta object="this.nodeValue" xml:lang="nb" xml:id="id1"> <pi xml:lang="en-US" xml:id="id2"> @@ -554,6 +654,11 @@ </test> <test> <xpath>//upsilon[starts-with(concat(@src,"-"),"this-")][@xml:id="id1"]/chi[@attrib][@xml:lang="nb"][following-sibling::eta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@xml:lang="no-nb"][not(following-sibling::*)]//kappa[@and][not(preceding-sibling::*)]//mu[@string][@xml:id="id3"][not(following-sibling::*)]//tau[@name][@xml:lang="en"][@xml:id="id4"][following-sibling::upsilon[not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <upsilon src="this-is-att-value" xml:id="id1"> <chi attrib="attribute-value" xml:lang="nb"/> @@ -574,6 +679,11 @@ </test> <test> <xpath>//*[starts-with(concat(@insert,"-"),"_blank-")]/alpha[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(concat(@token,"$"),"e-value$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[contains(@insert,"1")][not(child::node())][following-sibling::sigma[contains(@and,"_")][following-sibling::beta[@xml:lang="en"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::mu[not(child::node())][following-sibling::psi[following-sibling::kappa[not(following-sibling::*)]//beta//xi[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::kappa[@content][@xml:id="id3"][not(following-sibling::*)]/xi[@xml:lang="nb"][not(preceding-sibling::*)]//upsilon[contains(@content,"ri")][@xml:lang="nb"][not(following-sibling::*)]//psi[contains(@and,"te")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::iota[@attribute][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::lambda[starts-with(concat(@and,"-"),"123456789-")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::theta//beta[not(preceding-sibling::*)]//epsilon[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)]//zeta[starts-with(@insert,"content")][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <any insert="_blank"> <alpha xml:lang="no-nb" xml:id="id1"/> @@ -611,6 +721,11 @@ </test> <test> <xpath>//chi[@xml:lang="en-GB"][@xml:id="id1"]/tau//phi[@title][@xml:id="id2"]/sigma[@xml:lang="no-nb"]//theta[@xml:id="id3"][not(preceding-sibling::*)]/tau[contains(concat(@title,"$"),"nother attribute value$")][@xml:lang="en"][not(following-sibling::*)]/phi[@attribute][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::mu[@xml:lang="no"][@xml:id="id4"]/chi[@xml:lang="en-GB"][@xml:id="id5"][not(child::node())][following-sibling::tau[starts-with(@att,"false")][@xml:id="id6"][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 2]]/gamma[@attr][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="en"][preceding-sibling::*[position() = 1]]/tau[contains(@and,"r")][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@token="false"][@xml:lang="no"][not(following-sibling::*)]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>1</nth> + </result> <tree> <chi xml:lang="en-GB" xml:id="id1"> <tau> @@ -644,6 +759,11 @@ </test> <test> <xpath>//sigma[@title][@xml:id="id1"]/zeta[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@xml:id="id2"][following-sibling::psi[@att][@xml:lang="nb"][@xml:id="id3"]//alpha[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[starts-with(@title,"123456")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[@xml:id="id5"][following-sibling::*[position()=1]][not(preceding-sibling::any)][following-sibling::theta[preceding-sibling::*[position() = 3]][not(following-sibling::*)]//nu[contains(@desciption,"a")][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@object][preceding-sibling::*[position() = 1]]//iota[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:id="id8"]//omega[@delete][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[following-sibling::*[position()=1]][following-sibling::omega[@number="solid 1px green"][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//rho[@string][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <sigma title="another attribute value" xml:id="id1"> <zeta xml:lang="en"> @@ -674,6 +794,11 @@ </test> <test> <xpath>//*[@xml:lang="no-nb"][@xml:id="id1"]//theta[starts-with(@content,"fal")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[starts-with(@insert,"100")][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//theta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::epsilon[@desciption="100%"][@xml:lang="en"][@xml:id="id5"]/upsilon//xi[contains(@abort,"nt")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)]//beta[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::gamma[preceding-sibling::*[position() = 1]]//kappa[@xml:lang="en-US"][following-sibling::gamma[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(@abort,"solid 1px g")]//gamma[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@object="solid 1px green"][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@name="_blank"][@xml:lang="no-nb"]//nu[@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)]//sigma[@desciption][@xml:lang="nb"][following-sibling::beta[@xml:lang="en"][@xml:id="id10"][not(following-sibling::*)]/pi[contains(concat(@delete,"$"),"ue$")][not(preceding-sibling::*)][following-sibling::rho[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@xml:lang="en"][preceding-sibling::*[position() = 2]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="no-nb" xml:id="id1"> <theta content="false" xml:id="id2"/> @@ -714,6 +839,11 @@ </test> <test> <xpath>//rho[@content][@xml:lang="no-nb"][@xml:id="id1"]//alpha[@title="content"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][following-sibling::theta[@abort][@xml:lang="no"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][not(following-sibling::theta)][not(child::node())][following-sibling::pi[@attr="true"][@xml:lang="nb"]//eta[contains(concat(@attr,"$"),"false$")][@xml:lang="en-US"]//omega[@insert="solid 1px green"][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:lang="en"]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <rho content="false" xml:lang="no-nb" xml:id="id1"> <alpha title="content" xml:id="id2"/> @@ -735,6 +865,11 @@ </test> <test> <xpath>//zeta[@xml:lang="nb"]/psi[contains(@object,"te")][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[contains(@number,"d 1p")][@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=1]][not(preceding-sibling::chi)][not(preceding-sibling::chi or following-sibling::chi)][following-sibling::tau[@delete][@xml:lang="en-US"][not(following-sibling::*)]//phi[@token][@xml:id="id3"][not(preceding-sibling::*)]//xi[starts-with(concat(@att,"-"),"123456789-")][@xml:id="id4"][not(preceding-sibling::*)]//iota[@class="attribute-value"][not(preceding-sibling::*)]//rho[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[contains(@insert,"px green")][@xml:id="id5"][following-sibling::*[position()=3]][following-sibling::lambda[@token][@xml:lang="en-US"][not(child::node())][following-sibling::gamma[not(child::node())][following-sibling::mu[@xml:id="id6"]//omicron[contains(concat(@desciption,"$"),"his.nodeValue$")][@xml:id="id7"][not(preceding-sibling::*)]/sigma[starts-with(@attr,"at")][@xml:lang="en-US"][@xml:id="id8"][following-sibling::tau[contains(@true,"ute value")][@xml:lang="no-nb"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <zeta xml:lang="nb"> <psi object="attribute"/> @@ -765,6 +900,11 @@ </test> <test> <xpath>//theta[@false][@xml:lang="no"][@xml:id="id1"]//zeta[@name][@xml:id="id2"][following-sibling::*[position()=2]][following-sibling::sigma[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@src][@xml:lang="en"][@xml:id="id4"]//theta[contains(concat(@src,"$"),"%$")][@xml:id="id5"][following-sibling::omicron[contains(@or,"ribute")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::xi[@true="another attribute value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//*[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@or][@xml:id="id8"][not(preceding-sibling::*)]//kappa[not(preceding-sibling::*)][following-sibling::phi[@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[starts-with(@delete,"this.")][@xml:id="id10"][following-sibling::omega[contains(@string,"on")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <theta false="attribute-value" xml:lang="no" xml:id="id1"> <zeta name="solid 1px green" xml:id="id2"/> @@ -791,6 +931,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]//mu[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::alpha[@true][@xml:id="id3"][preceding-sibling::*[position() = 1]]//epsilon[contains(concat(@content,"$"),"e$")][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[starts-with(@data,"100")][not(preceding-sibling::*)]//pi[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[starts-with(concat(@attrib,"-"),"content-")][@xml:lang="no"][@xml:id="id5"][not(following-sibling::*)]/upsilon[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id6"][not(following-sibling::*)]//iota[not(preceding-sibling::*)][not(following-sibling::*)]/zeta[not(preceding-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <mu xml:lang="no-nb" xml:id="id2"/> @@ -818,6 +963,11 @@ </test> <test> <xpath>//tau[@abort][@xml:id="id1"]/rho[contains(concat(@true,"$"),"e$")][not(following-sibling::*)]//eta[not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:lang="no"]//tau[@xml:id="id2"]//iota[@xml:lang="no"][@xml:id="id3"][following-sibling::omega[@string][@xml:lang="no-nb"][following-sibling::theta[starts-with(@attr,"cont")][@xml:id="id4"][preceding-sibling::*[position() = 2]]/sigma[starts-with(@name,"this.nodeValue")][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]//rho[starts-with(@attrib,"cont")][@xml:lang="nb"][@xml:id="id6"][not(child::node())][following-sibling::pi[contains(concat(@token,"$"),"rue$")][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="en"][preceding-sibling::*[position() = 2]][following-sibling::omega[@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/*[@content][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::chi[@class][@xml:lang="no"][@xml:id="id10"]/alpha[@xml:lang="nb"][@xml:id="id11"][following-sibling::*[position()=4]][not(child::node())][following-sibling::upsilon[starts-with(concat(@name,"-"),"this-")][@xml:id="id12"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@delete][@xml:id="id13"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::xi[contains(concat(@true,"$"),"ank$")][not(child::node())][following-sibling::alpha[@xml:lang="en"][@xml:id="id14"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <tau abort="solid 1px green" xml:id="id1"> <rho true="this-is-att-value"> @@ -853,6 +1003,11 @@ </test> <test> <xpath>//kappa[@string="another attribute value"]/alpha[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]/eta[@xml:lang="en-US"][following-sibling::*[@content][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 2]]/gamma[starts-with(@insert,"attr")][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <kappa string="another attribute value"> <alpha xml:lang="en"/> @@ -870,6 +1025,11 @@ </test> <test> <xpath>//*//alpha//beta[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::mu[contains(@false,"value")][@xml:lang="no-nb"][@xml:id="id1"][following-sibling::*[position()=3]][following-sibling::beta[@xml:lang="no-nb"][not(child::node())][following-sibling::iota[contains(@or,"e")][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 3]][following-sibling::xi[preceding-sibling::*[position() = 4]][not(following-sibling::*)]//delta[@xml:lang="no"]//upsilon[contains(concat(@token,"$"),"alue$")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::omega[@false][@xml:id="id4"][preceding-sibling::*[position() = 1]]/omega[starts-with(concat(@desciption,"-"),"_blank-")][@xml:id="id5"][not(following-sibling::*)]/sigma[@xml:id="id6"][not(preceding-sibling::*)]//lambda[following-sibling::theta[starts-with(@token,"_")][preceding-sibling::*[position() = 1]]//eta/tau[@false]//epsilon[contains(concat(@true,"$"),"ue$")][@xml:lang="nb"]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <any> <alpha> @@ -904,6 +1064,11 @@ </test> <test> <xpath>//phi[@abort]//mu[@xml:lang="no-nb"][@xml:id="id1"]/xi[starts-with(@name,"att")][@xml:lang="no"][@xml:id="id2"]//beta[contains(@number,"l")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@string][@xml:id="id3"][not(following-sibling::*)]/pi[contains(concat(@false,"$"),"100%$")][@xml:lang="en-GB"]/omicron[@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[contains(concat(@attribute,"$"),"e$")][@xml:id="id5"][not(following-sibling::*)]//chi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::rho[@false="another attribute value"][not(following-sibling::*)]/beta[@xml:lang="no"][following-sibling::lambda[contains(concat(@name,"$"),"deValue$")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@title="this-is-att-value"][@xml:id="id6"][not(preceding-sibling::*)]/kappa[@false="false"][@xml:id="id7"][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <phi abort="this-is-att-value"> <mu xml:lang="no-nb" xml:id="id1"> @@ -935,6 +1100,11 @@ </test> <test> <xpath>//epsilon[@xml:id="id1"]//lambda[contains(@data,"alu")][@xml:lang="no-nb"][not(preceding-sibling::*)]//lambda[@xml:lang="nb"][not(child::node())][following-sibling::upsilon[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[contains(concat(@abort,"$"),"t-value$")][not(following-sibling::*)]//alpha[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]//kappa[contains(concat(@string,"$"),"alue$")][@xml:lang="en-GB"][@xml:id="id4"]//lambda[contains(concat(@insert,"$")," value$")][not(preceding-sibling::*)][following-sibling::zeta[not(child::node())][following-sibling::psi[@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::tau[@title="another attribute value"][@xml:lang="en-US"][preceding-sibling::*[position() = 3]][following-sibling::epsilon[not(following-sibling::*)]//gamma[contains(concat(@data,"$"),"23456789$")][@xml:id="id6"][not(following-sibling::*)]/mu[starts-with(@data,"solid 1px g")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@attr][@xml:lang="en-GB"][@xml:id="id7"][not(child::node())][following-sibling::lambda[@number][@xml:lang="nb"]//mu[contains(concat(@number,"$"),"t-value$")][@xml:lang="no"][not(child::node())][following-sibling::mu[@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[@data="attribute"][@xml:lang="no"][not(preceding-sibling::*)]/pi[not(following-sibling::*)]//lambda[starts-with(concat(@false,"-"),"this-")][@xml:lang="en"][@xml:id="id9"]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>1</nth> + </result> <tree> <epsilon xml:id="id1"> <lambda data="attribute-value" xml:lang="no-nb"> @@ -975,6 +1145,11 @@ </test> <test> <xpath>//theta[@src]//*[contains(@desciption,"alue")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:lang="en-US"][following-sibling::gamma[@string][@xml:lang="en-GB"][@xml:id="id2"][following-sibling::psi[starts-with(concat(@delete,"-"),"attribute-")][following-sibling::nu[@or][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::iota[@number="false"][@xml:lang="no"][@xml:id="id4"]//eta[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::rho[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::rho)][following-sibling::omega[@xml:id="id7"][not(preceding-sibling::omega)][following-sibling::*[not(following-sibling::*)]//rho[@xml:lang="en-US"][@xml:id="id8"][following-sibling::xi[@xml:lang="no"][preceding-sibling::*[position() = 1]]/omicron[not(preceding-sibling::*)][not(following-sibling::*)]//tau[@xml:id="id9"]//omega[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <theta src="attribute"> <any desciption="this.nodeValue" xml:id="id1"> @@ -1005,6 +1180,11 @@ </test> <test> <xpath>//chi[@number]/lambda[not(following-sibling::*)]/rho[@xml:lang="no"][not(following-sibling::*)]/mu[@xml:id="id1"][not(following-sibling::*)]/lambda[@xml:id="id2"][not(preceding-sibling::*)]//epsilon[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[@xml:id="id4"][preceding-sibling::*[position() = 1]]/lambda[starts-with(@abort,"th")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[contains(@false,"e v")][@xml:id="id6"][following-sibling::alpha[following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[contains(@delete,"te value")][@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]/xi[@xml:lang="no"][not(preceding-sibling::*)]/epsilon[contains(concat(@string,"$"),"ontent$")][@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::delta[@token][@xml:lang="nb"][not(following-sibling::*)]//zeta[contains(@string,"alue")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <chi number="another attribute value"> <lambda> @@ -1037,6 +1217,11 @@ </test> <test> <xpath>//nu[contains(@abort,"234567")]/delta[contains(concat(@token,"$"),"0%$")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[not(following-sibling::*)]//mu[@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::mu[@abort][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]/omega[starts-with(@att,"12")][@xml:lang="en"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[starts-with(concat(@attribute,"-"),"this.nodeValue-")][@xml:id="id4"][not(following-sibling::*)]/rho[contains(@src,"100")][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[not(preceding-sibling::*)]//chi[@string="attribute"][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <nu abort="123456789"> <delta token="100%" xml:id="id1"> @@ -1061,6 +1246,11 @@ </test> <test> <xpath>//alpha//zeta[@abort][not(preceding-sibling::*)][following-sibling::tau[@token][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]//tau[@true="another attribute value"]/theta[contains(concat(@delete,"$"),"attribute$")][@xml:lang="nb"][not(preceding-sibling::*)]/xi[contains(concat(@and,"$"),"Value$")][@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::omicron[@title][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::epsilon[@xml:lang="en-US"][@xml:id="id4"][not(child::node())][following-sibling::gamma[starts-with(@object,"_")][@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::theta[not(child::node())][following-sibling::kappa[@xml:id="id6"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::omicron[@title][@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 6]]/phi[starts-with(concat(@src,"-"),"attribute-")][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@title="_blank"][@xml:lang="nb"][preceding-sibling::*[position() = 1]]//sigma[@xml:lang="en-GB"][@xml:id="id9"]/theta[starts-with(@insert,"this.node")][@xml:lang="en-US"][@xml:id="id10"]//chi//*[contains(@abort,"e")][@xml:id="id11"][not(child::node())][following-sibling::*[@xml:id="id12"][not(following-sibling::*)]/kappa[contains(concat(@data,"$"),"alue$")][not(following-sibling::*)]]]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <alpha> <zeta abort="attribute value"/> @@ -1100,6 +1290,11 @@ </test> <test> <xpath>//omega[@xml:lang="en-GB"]/tau[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::epsilon[contains(@att,"ttribute-")][following-sibling::*[position()=3]][not(child::node())][following-sibling::pi[contains(concat(@desciption,"$"),"nt$")][not(child::node())][following-sibling::omicron[@object][@xml:id="id1"][preceding-sibling::*[position() = 3]][following-sibling::epsilon[@false][not(following-sibling::*)]/alpha[@xml:lang="en-US"][not(following-sibling::*)]/phi[contains(@number,"lue")][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/delta[not(preceding-sibling::*)]/psi[starts-with(@desciption,"tru")][@xml:id="id4"][not(preceding-sibling::*)][not(preceding-sibling::psi or following-sibling::psi)]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en-GB"> <tau xml:lang="en-US"/> @@ -1123,6 +1318,11 @@ </test> <test> <xpath>//theta[contains(concat(@attrib,"$"),"lue$")][@xml:id="id1"]/phi[contains(@desciption,"on")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:lang="nb"]/tau[@string][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@token][@xml:id="id2"][not(following-sibling::*)][not(following-sibling::psi)]/tau[@xml:lang="en-US"][@xml:id="id3"]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>1</nth> + </result> <tree> <theta attrib="attribute value" xml:id="id1"> <phi desciption="content" xml:lang="nb"> @@ -1141,6 +1341,11 @@ </test> <test> <xpath>//epsilon[@src="123456789"]//alpha[not(preceding-sibling::*)]/delta[@xml:id="id1"][following-sibling::tau[@desciption][@xml:id="id2"][not(following-sibling::*)]/pi[contains(concat(@attribute,"$"),"ute value$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:lang="no-nb"][@xml:id="id3"]/*[starts-with(concat(@object,"-"),"attribute value-")][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[@xml:id="id5"][not(following-sibling::*)]//upsilon[@xml:id="id6"][following-sibling::gamma[starts-with(@true,"at")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]//delta[starts-with(@string,"t")][following-sibling::kappa[@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(concat(@desciption,"-"),"100%-")][preceding-sibling::*[position() = 2]]/mu[starts-with(@data,"another attribu")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::xi[contains(concat(@or,"$"),".nodeValue$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/kappa[contains(concat(@attrib,"$")," value$")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[contains(concat(@desciption,"$"),"se$")]//theta[@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <epsilon src="123456789"> <alpha> @@ -1176,6 +1381,11 @@ </test> <test> <xpath>//xi[starts-with(concat(@attribute,"-"),"attribute-")][@xml:lang="en"][@xml:id="id1"]/*[@xml:lang="no-nb"]/zeta[starts-with(@or,"attribute-va")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[starts-with(@data,"attribute")][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@string][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[not(following-sibling::*)]//epsilon[starts-with(concat(@true,"-"),"this-")][@xml:id="id3"][not(following-sibling::*)]/gamma[@desciption][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[@xml:lang="no"][not(child::node())][following-sibling::theta[@xml:id="id5"][following-sibling::*[position()=3]][not(child::node())][following-sibling::xi[@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::pi[not(child::node())][following-sibling::lambda[@class][preceding-sibling::*[position() = 4]]/lambda[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::sigma[contains(@object,"alse")][@xml:id="id8"]/delta[@xml:lang="nb"][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <xi attribute="attribute-value" xml:lang="en" xml:id="id1"> <any xml:lang="no-nb"> @@ -1210,6 +1420,11 @@ </test> <test> <xpath>//omicron[@insert]/gamma[@xml:id="id1"][not(child::node())][following-sibling::alpha[@abort="content"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//epsilon[contains(concat(@title,"$"),"his-is-att-value$")][not(child::node())][following-sibling::delta[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@src][@xml:lang="en-GB"][not(child::node())][following-sibling::*[@abort][@xml:lang="en"]/kappa[contains(@insert,"ont")][@xml:lang="no-nb"]/xi[starts-with(@data,"at")][@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[not(following-sibling::*)][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <omicron insert="false"> <gamma xml:id="id1"/> @@ -1233,6 +1448,11 @@ </test> <test> <xpath>//eta/xi[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@content][not(preceding-sibling::*)]/phi[not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:id="id2"]//epsilon[contains(concat(@attr,"$")," 1px green$")][not(following-sibling::*)]//zeta[contains(concat(@true,"$"),"23456789$")][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::zeta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@xml:lang="no"][@xml:id="id4"][following-sibling::zeta[@xml:id="id5"][following-sibling::*[position()=4]][following-sibling::iota[@delete][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::chi[starts-with(concat(@title,"-"),"123456789-")][@xml:id="id7"][following-sibling::omicron[starts-with(@or,"attribute v")][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::rho[contains(@name,"e")][@xml:lang="no"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]/phi[@xml:lang="no-nb"][not(preceding-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <eta> <xi xml:id="id1"> @@ -1263,6 +1483,11 @@ </test> <test> <xpath>//sigma[starts-with(@att,"th")][@xml:lang="no"][@xml:id="id1"]//sigma[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::rho[starts-with(concat(@true,"-"),"content-")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::rho[starts-with(concat(@insert,"-"),"solid 1px green-")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/zeta[@title][@xml:lang="nb"]/rho[@xml:lang="no-nb"][not(preceding-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>1</nth> + </result> <tree> <sigma att="this.nodeValue" xml:lang="no" xml:id="id1"> <sigma xml:lang="no"/> @@ -1279,6 +1504,11 @@ </test> <test> <xpath>//zeta[starts-with(@false,"attribute val")][@xml:id="id1"]//eta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::kappa[following-sibling::*[position()=3]][not(child::node())][following-sibling::kappa[@xml:id="id3"][following-sibling::*[position()=2]][following-sibling::rho[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omicron[@desciption="another attribute value"][@xml:lang="nb"][not(following-sibling::*)]/tau[@and][@xml:id="id5"][not(following-sibling::*)]//chi[@token][@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[contains(concat(@name,"$"),"-att-value$")]//tau[contains(concat(@and,"$"),"789$")][following-sibling::pi[contains(@data,"0")][@xml:lang="nb"][not(following-sibling::*)]//delta[@src="true"][@xml:lang="nb"]/psi[@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@xml:id="id8"][not(preceding-sibling::*)]/tau[@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)]//lambda[not(following-sibling::*)]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <zeta false="attribute value" xml:id="id1"> <eta xml:id="id2"/> @@ -1311,6 +1541,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-GB"]//chi[contains(@desciption,"e")][@xml:lang="no-nb"]//omega[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[not(following-sibling::*)]//nu[contains(concat(@attr,"$"),"alue$")][@xml:lang="en-US"][not(preceding-sibling::*)]//iota[@xml:lang="en-US"]//rho[not(preceding-sibling::*)][not(following-sibling::*)]/phi[following-sibling::lambda[starts-with(concat(@desciption,"-"),"attribute-")][@xml:lang="no"][@xml:id="id2"][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>1</nth> + </result> <tree> <phi xml:lang="en-GB"> <chi desciption="attribute" xml:lang="no-nb"> @@ -1334,6 +1569,11 @@ </test> <test> <xpath>//beta[@data][@xml:lang="en-US"][@xml:id="id1"]/lambda[starts-with(concat(@attr,"-"),"_blank-")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::iota[contains(concat(@or,"$"),"er attribute value$")][@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[contains(concat(@and,"$"),"e$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//epsilon[@or="123456789"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::epsilon[@attribute][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/zeta[@content][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]/*[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[contains(concat(@attrib,"$"),"ent$")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <beta data="attribute" xml:lang="en-US" xml:id="id1"> <lambda attr="_blank" xml:lang="en-US" xml:id="id2"/> @@ -1355,6 +1595,11 @@ </test> <test> <xpath>//lambda[starts-with(concat(@data,"-"),"another attribute value-")][@xml:lang="en"]/xi[not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 1]][following-sibling::eta[starts-with(concat(@att,"-"),"this.nodeValue-")][@xml:id="id1"]//mu[@att][@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]//mu[@xml:lang="no"][not(following-sibling::*)]//chi[@xml:id="id3"]/lambda[contains(concat(@content,"$"),"ttribute value$")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::iota[contains(@name,"en")][preceding-sibling::*[position() = 1]][following-sibling::kappa[@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <lambda data="another attribute value" xml:lang="en"> <xi/> @@ -1377,6 +1622,11 @@ </test> <test> <xpath>//*[starts-with(@string,"another attribute va")][@xml:lang="en"][@xml:id="id1"]/gamma[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[starts-with(concat(@token,"-"),"content-")][@xml:id="id3"]/rho[@true="attribute-value"][not(preceding-sibling::*)]/pi[@insert="123456789"][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::pi)]/chi[contains(concat(@delete,"$"),"content$")][@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::eta[@xml:lang="en"]/kappa[@xml:id="id5"]/delta[starts-with(@number,"a")][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::delta)]/epsilon[@abort][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::gamma[@xml:lang="en"][@xml:id="id7"][not(child::node())][following-sibling::delta[following-sibling::*[position()=2]][following-sibling::omega[starts-with(@or,"solid ")][@xml:id="id8"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 4]]/gamma[contains(@number,"e value")][@xml:lang="no"][@xml:id="id9"][not(child::node())][following-sibling::*[starts-with(@delete,"_")]/rho[@xml:lang="nb"][following-sibling::alpha[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::mu[@xml:id="id10"][preceding-sibling::*[position() = 2]]//*[@xml:lang="en-GB"][not(following-sibling::*)]//zeta[@abort][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@attribute="123456789"][not(following-sibling::*)]//iota[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <any string="another attribute value" xml:lang="en" xml:id="id1"> <gamma xml:lang="en-GB" xml:id="id2"/> @@ -1420,6 +1670,11 @@ </test> <test> <xpath>//gamma[@xml:id="id1"]/tau[@xml:id="id2"][not(child::node())][following-sibling::phi[starts-with(@insert,"attribute-v")][@xml:lang="en-US"][@xml:id="id3"][following-sibling::pi//upsilon[@xml:lang="en-GB"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@title][@xml:lang="en-US"]/eta[contains(concat(@abort,"$"),"alue$")][not(child::node())][following-sibling::alpha[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]/epsilon[@and="solid 1px green"][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::nu[@desciption][@xml:lang="nb"]/psi[@xml:id="id6"][not(following-sibling::*)]//omicron[not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:lang="no"][not(child::node())][following-sibling::mu[not(following-sibling::*)]/iota[contains(concat(@true,"$"),"attribute$")][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@attr][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:lang="en-US"][@xml:id="id8"]//*[not(preceding-sibling::*)][position() = 1]][position() = 1]]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <gamma xml:id="id1"> <tau xml:id="id2"/> @@ -1453,6 +1708,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]//kappa[@xml:id="id2"][not(child::node())][following-sibling::*[@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]//lambda[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@att][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::psi[@content="_blank"][@xml:id="id7"]//kappa[starts-with(concat(@data,"-"),"this-")][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <iota xml:id="id1"> <kappa xml:id="id2"/> @@ -1472,6 +1732,11 @@ </test> <test> <xpath>//tau[@data="solid 1px green"][@xml:lang="nb"][@xml:id="id1"]//zeta[@xml:lang="nb"][not(child::node())][following-sibling::upsilon[@xml:lang="nb"][preceding-sibling::*[position() = 1]]/*[@content="this-is-att-value"][not(preceding-sibling::*)][following-sibling::sigma[starts-with(concat(@false,"-"),"content-")][@xml:lang="nb"][not(following-sibling::*)]//lambda[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::theta[@desciption="attribute"][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@and][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(concat(@data,"-"),"100%-")][not(following-sibling::*)]//eta[@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]//alpha[not(child::node())][following-sibling::omicron[starts-with(@content,"this.nodeVal")][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@object="123456789"][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="no"][@xml:id="id5"][not(following-sibling::*)]/eta[@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[starts-with(@number,"this.")][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:id="id8"][preceding-sibling::*[position() = 2]]//iota/iota[@name][@xml:id="id9"][not(preceding-sibling::*)]/tau[following-sibling::chi[contains(@true,"e")][@xml:id="id10"][preceding-sibling::*[position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <tau data="solid 1px green" xml:lang="nb" xml:id="id1"> <zeta xml:lang="nb"/> @@ -1510,6 +1775,11 @@ </test> <test> <xpath>//epsilon[contains(@attrib,"e")][@xml:id="id1"]//eta[@true][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@or][@xml:id="id2"][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 2]]//psi[@number][@xml:lang="nb"][@xml:id="id3"][following-sibling::*[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[@xml:lang="en"][@xml:id="id5"][not(following-sibling::*)]/gamma[@xml:id="id6"]/theta[not(preceding-sibling::*)][not(following-sibling::*)]/chi//lambda[@xml:lang="no-nb"]/gamma[@xml:lang="no"][@xml:id="id7"][not(child::node())][following-sibling::phi[@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::gamma[contains(@false,".nodeValue")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 3]]//tau[@xml:lang="no-nb"][@xml:id="id9"][not(child::node())][following-sibling::chi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <epsilon attrib="false" xml:id="id1"> <eta true="_blank"/> @@ -1543,6 +1813,11 @@ </test> <test> <xpath>//pi[@string="100%"][@xml:lang="en"]/chi[@xml:lang="en"][@xml:id="id1"]/xi[contains(concat(@content,"$"),"se$")][not(preceding-sibling::*)]//alpha[contains(@title," ")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::rho[@xml:id="id3"][not(following-sibling::*)]/delta[@name="attribute value"][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[contains(concat(@delete,"$"),"e$")][@xml:lang="nb"][not(child::node())][following-sibling::epsilon[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::epsilon)]/alpha[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::psi[starts-with(concat(@attribute,"-"),"this.nodeValue-")][@xml:id="id5"][preceding-sibling::*[position() = 1]]//tau[starts-with(@title,"_blan")][not(following-sibling::*)]/*[@delete][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::psi[contains(@or,"nother attribute ")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::pi[following-sibling::nu[starts-with(concat(@object,"-"),"solid 1px green-")][@xml:id="id7"][preceding-sibling::*[position() = 3]][following-sibling::kappa[contains(@content,"attribute va")][@xml:id="id8"][not(child::node())][following-sibling::delta[@xml:lang="no"][not(following-sibling::*)]//phi[@and="attribute-value"][@xml:lang="no-nb"][not(child::node())][following-sibling::theta[contains(@att,"nk")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[starts-with(@object,"attr")][not(child::node())][following-sibling::mu[@xml:lang="nb"][not(following-sibling::*)]/phi[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@xml:lang="en-GB"][@xml:id="id11"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <pi string="100%" xml:lang="en"> <chi xml:lang="en" xml:id="id1"> @@ -1586,6 +1861,11 @@ </test> <test> <xpath>//tau/xi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@insert][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@token][not(following-sibling::*)]/tau[@xml:id="id1"]//zeta[contains(@insert,"100")][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[not(child::node())][following-sibling::alpha[@xml:lang="en-US"][preceding-sibling::*[position() = 2]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <tau> <xi xml:lang="en-GB"/> @@ -1604,6 +1884,11 @@ </test> <test> <xpath>//omega[starts-with(@number,"_bla")][@xml:lang="en"]/tau[@xml:id="id1"][not(preceding-sibling::*)]/eta[contains(@src,"deValue")][@xml:lang="en"][following-sibling::gamma[contains(concat(@false,"$"),"100%$")][@xml:id="id2"][following-sibling::alpha[not(following-sibling::*)]/nu[starts-with(concat(@data,"-"),"this-")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[starts-with(@att,"attrib")][preceding-sibling::*[position() = 1]][following-sibling::pi[contains(@att,"a")][preceding-sibling::*[position() = 2]][following-sibling::*[@false][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::psi[starts-with(@and,"another attribu")][@xml:id="id4"][not(preceding-sibling::psi)]//epsilon[starts-with(concat(@insert,"-"),"attribute-")][@xml:id="id5"][following-sibling::omega[@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/theta[@attribute][@xml:id="id7"][not(child::node())][following-sibling::nu[@xml:lang="en"]//omicron[@att][@xml:lang="en-US"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[@insert][@xml:lang="no"][following-sibling::*[position()=3]][not(child::node())][following-sibling::alpha[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::lambda[@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::nu[not(following-sibling::*)]//xi[@xml:lang="en"][@xml:id="id10"][following-sibling::*[position()=3]][not(child::node())][following-sibling::tau[contains(concat(@data,"$"),"false$")][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[@xml:lang="en"][not(child::node())][following-sibling::theta[@delete="attribute"][@xml:id="id12"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <omega number="_blank" xml:lang="en"> <tau xml:id="id1"> @@ -1642,6 +1927,11 @@ </test> <test> <xpath>//gamma[@xml:id="id1"]//rho[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id3"][not(following-sibling::*)]//chi[@string][not(following-sibling::chi)][not(child::node())][following-sibling::epsilon[contains(concat(@abort,"$"),"value$")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::theta[@data="solid 1px green"][@xml:id="id5"]//omega[starts-with(@true,"this.n")][@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)][not(preceding-sibling::omega or following-sibling::omega)]/theta[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[contains(concat(@attribute,"$"),"bute value$")][@xml:lang="en-GB"][following-sibling::kappa[@src][@xml:lang="nb"][@xml:id="id8"]/iota[@xml:id="id9"][not(following-sibling::*)]/upsilon[starts-with(@insert,"fal")][@xml:lang="no"][@xml:id="id10"]//phi[not(following-sibling::*)]/lambda[not(following-sibling::*)]//chi[@data][@xml:lang="no-nb"][not(child::node())][following-sibling::theta[@xml:id="id11"][not(following-sibling::*)]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <gamma xml:id="id1"> <rho xml:lang="nb" xml:id="id2"/> @@ -1674,6 +1964,11 @@ </test> <test> <xpath>//tau[@xml:lang="no-nb"]//chi[@name="this.nodeValue"][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@delete][@xml:lang="en-US"][@xml:id="id1"][not(child::node())][following-sibling::kappa[@true][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/*[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::sigma[@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::nu[@xml:id="id5"][preceding-sibling::*[position() = 2]]//delta[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[starts-with(@desciption,"true")][@xml:lang="no-nb"][@xml:id="id7"]/omega[starts-with(concat(@abort,"-"),"123456789-")][@xml:id="id8"]//tau[starts-with(concat(@src,"-"),"false-")][@xml:lang="nb"][@xml:id="id9"][not(following-sibling::*)]//lambda[contains(concat(@or,"$"),"een$")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[contains(@attribute,"ls")][@xml:lang="no-nb"][following-sibling::chi[@class][@xml:id="id10"][not(following-sibling::*)]//lambda[@string][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::psi[following-sibling::upsilon[@xml:id="id11"][not(following-sibling::*)]/chi[starts-with(@src,"123456")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::theta[preceding-sibling::*[position() = 1]][following-sibling::epsilon[contains(@number,"ribute value")][preceding-sibling::*[position() = 2]][not(preceding-sibling::epsilon or following-sibling::epsilon)][following-sibling::kappa[@xml:lang="nb"]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no-nb"> <chi name="this.nodeValue" xml:lang="en"> @@ -1712,6 +2007,11 @@ </test> <test> <xpath>//epsilon[contains(@attribute,"als")][@xml:id="id1"]/omicron[@xml:id="id2"]/mu[starts-with(@title,"another att")][@xml:lang="nb"][@xml:id="id3"][following-sibling::kappa[@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::psi[starts-with(@number,"this-is-at")][@xml:lang="en"][preceding-sibling::*[position() = 2]]//*[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@xml:id="id5"][not(preceding-sibling::*)]/rho[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[@xml:id="id6"]/lambda[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)]/chi[@xml:lang="nb"][@xml:id="id8"][not(following-sibling::chi)][not(child::node())][following-sibling::theta[contains(concat(@class,"$"),"ue$")][@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 2]]//pi[starts-with(concat(@data,"-"),"attribute-")][not(preceding-sibling::*)][not(preceding-sibling::pi)][not(child::node())][following-sibling::nu[@att][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <epsilon attribute="false" xml:id="id1"> <omicron xml:id="id2"> @@ -1742,6 +2042,11 @@ </test> <test> <xpath>//gamma//upsilon[not(child::node())][following-sibling::nu[@xml:id="id1"][not(child::node())][following-sibling::eta[starts-with(concat(@att,"-"),"another attribute value-")][preceding-sibling::*[position() = 2]]//sigma[not(preceding-sibling::*)]//lambda[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[@xml:id="id3"][following-sibling::mu[contains(@title,"tt-valu")][@xml:id="id4"][not(following-sibling::*)]/sigma[contains(@title,"ibute")]/theta[contains(@true," value")][not(following-sibling::*)]/gamma[position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <gamma> <upsilon/> @@ -1766,6 +2071,11 @@ </test> <test> <xpath>//eta[@xml:id="id1"]//gamma[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[not(child::node())][following-sibling::lambda[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::xi[starts-with(concat(@delete,"-"),"this-")][preceding-sibling::*[position() = 2]]//psi[contains(@desciption,"tribute")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]/tau[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omega[@content="true"][@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/mu[contains(concat(@number,"$"),"lse$")][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="en-US"][@xml:id="id8"]//pi[not(following-sibling::*)]//pi[contains(@title,"t")][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[not(preceding-sibling::*)]/gamma[contains(@name,"ntent")][not(child::node())][following-sibling::theta[@string][@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[not(following-sibling::*)]//alpha[contains(@src,"x gree")][@xml:lang="nb"]//delta[@xml:lang="en-US"][not(child::node())][following-sibling::upsilon[contains(@delete,"k")][@xml:lang="nb"][@xml:id="id11"][following-sibling::*[position()=1]][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id12"]/upsilon[starts-with(@delete,"this-is-att-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@xml:id="id13"][following-sibling::*[position()=1]][following-sibling::omega[starts-with(concat(@class,"-"),"true-")][@xml:lang="no"][@xml:id="id14"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <eta xml:id="id1"> <gamma xml:lang="en" xml:id="id2"> @@ -1811,6 +2121,11 @@ </test> <test> <xpath>//pi[@xml:id="id1"]/zeta[contains(concat(@and,"$"),"n$")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=5]][following-sibling::gamma[@xml:lang="en-US"][@xml:id="id3"][not(child::node())][following-sibling::psi[@xml:lang="en"][not(child::node())][following-sibling::iota[@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::zeta[starts-with(@number,"attr")][@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::beta[@xml:lang="en"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//gamma[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[contains(concat(@attrib,"$"),"3456789$")][@xml:id="id5"][preceding-sibling::*[position() = 1]]//omega[starts-with(@content,"c")][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:lang="no-nb"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[starts-with(@attribute,"att")][@xml:lang="nb"]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <pi xml:id="id1"> <zeta and="solid 1px green" xml:lang="no-nb" xml:id="id2"/> @@ -1835,6 +2150,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]/chi[contains(concat(@class,"$"),"k$")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[@xml:lang="nb"][not(preceding-sibling::*)]/mu[contains(@number,"ute")][@xml:lang="en-US"][not(following-sibling::*)]/kappa[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[starts-with(concat(@number,"-"),"attribute value-")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/iota[starts-with(concat(@number,"-"),"true-")][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id4"][following-sibling::upsilon[@xml:id="id5"][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <chi class="_blank" xml:lang="no" xml:id="id2"/> @@ -1857,6 +2177,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@attribute,"-"),"true-")][@xml:id="id1"]/chi[starts-with(concat(@or,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//beta[@content][@xml:id="id4"]//upsilon[@delete][@xml:id="id5"][not(following-sibling::*)]/rho[contains(@desciption,"tru")][@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)]//nu[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::pi[@title][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][@xml:id="id8"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omega[starts-with(@number,"123")][@xml:lang="no-nb"][@xml:id="id9"][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id10"]/sigma[@xml:lang="en-US"][@xml:id="id11"][following-sibling::omicron[@xml:lang="nb"][@xml:id="id12"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[starts-with(concat(@or,"-"),"123456789-")][@xml:id="id13"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <delta attribute="true" xml:id="id1"> <chi or="this.nodeValue" xml:lang="nb" xml:id="id2"/> @@ -1886,6 +2211,11 @@ </test> <test> <xpath>//epsilon[@object="attribute"][@xml:id="id1"]/mu[starts-with(@att,"1")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu//lambda[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@attrib][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::*[position()=3]][following-sibling::omicron[starts-with(concat(@title,"-"),"_blank-")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::omicron)][not(child::node())][following-sibling::upsilon[starts-with(concat(@number,"-"),"_blank-")][@xml:lang="en"][not(child::node())][following-sibling::iota[starts-with(concat(@delete,"-"),"100%-")][@xml:lang="no-nb"][@xml:id="id7"]/psi[not(following-sibling::*)]//iota[starts-with(@att,"this-is-att-valu")][@xml:id="id8"][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <epsilon object="attribute" xml:id="id1"> <mu att="100%" xml:id="id2"> @@ -1911,6 +2241,11 @@ </test> <test> <xpath>//omicron[starts-with(concat(@title,"-"),"content-")][@xml:id="id1"]/zeta[starts-with(concat(@att,"-"),"content-")][@xml:lang="en"]/psi[@att][@xml:lang="no"][not(following-sibling::*)][not(preceding-sibling::psi)]/xi[@or="attribute value"][not(child::node())][following-sibling::upsilon[not(following-sibling::*)]//alpha[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::xi[contains(@false,"fa")][@xml:lang="en"][following-sibling::*[position()=4]][following-sibling::xi[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::iota[contains(concat(@object,"$")," attribute value$")][@xml:id="id2"][following-sibling::lambda[starts-with(concat(@title,"-"),"this-")][@xml:lang="no-nb"][@xml:id="id3"][not(child::node())][following-sibling::omicron[@xml:lang="en"][preceding-sibling::*[position() = 5]]/alpha[@data="123456789"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@data="solid 1px green"][@xml:lang="en-GB"]//delta[following-sibling::*[position()=1]][following-sibling::lambda[starts-with(concat(@desciption,"-"),"this.nodeValue-")][@xml:lang="en-US"]/sigma[starts-with(@name,"12")][@xml:lang="en-GB"]/phi[contains(concat(@attrib,"$"),"100%$")]//zeta[@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <omicron title="content" xml:id="id1"> <zeta att="content" xml:lang="en"> @@ -1946,6 +2281,11 @@ </test> <test> <xpath>//chi[starts-with(concat(@object,"-"),"solid 1px green-")][@xml:lang="en-US"]/xi[contains(@string,"onte")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::iota[@insert="true"][preceding-sibling::*[position() = 1]]/mu[@number="another attribute value"][@xml:lang="nb"][not(child::node())][following-sibling::omicron[@or="this-is-att-value"][@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]]/eta[contains(@desciption,"deValue")][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 1]]/upsilon[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[@data="solid 1px green"][@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/*[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::lambda[starts-with(@attr,"1234")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]]//zeta[starts-with(concat(@string,"-"),"content-")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <chi object="solid 1px green" xml:lang="en-US"> <xi string="content" xml:lang="nb"/> @@ -1971,6 +2311,11 @@ </test> <test> <xpath>//epsilon[@data="true"]//lambda[starts-with(@attrib,"false")][@xml:lang="nb"][following-sibling::*[@xml:lang="no"][not(following-sibling::*)]/eta[contains(concat(@delete,"$"),"ribute value$")][@xml:lang="en-US"][@xml:id="id1"]/xi[@title][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id2"]//omicron[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@false="this.nodeValue"][following-sibling::mu[not(child::node())][following-sibling::*[starts-with(concat(@false,"-"),"another attribute value-")][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::beta[starts-with(@content,"so")][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@att][@xml:id="id4"][not(following-sibling::*)][position() = 1]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <epsilon data="true"> <lambda attrib="false" xml:lang="nb"/> @@ -1994,6 +2339,11 @@ </test> <test> <xpath>//rho[@xml:lang="en"][@xml:id="id1"]/*[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]/omega[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[starts-with(@data,"thi")][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@false][following-sibling::*[position()=1]][not(preceding-sibling::eta)][following-sibling::theta[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]]/iota[not(preceding-sibling::*)]//epsilon[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="en" xml:id="id1"> <any xml:lang="en-US" xml:id="id2"> @@ -2016,6 +2366,11 @@ </test> <test> <xpath>//eta[contains(@token,"bla")][@xml:lang="no"][@xml:id="id1"]/tau[@attribute="another attribute value"][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@abort="this-is-att-value"][@xml:lang="en-US"][not(child::node())][following-sibling::delta[starts-with(concat(@title,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@token][@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=4]][not(child::node())][following-sibling::theta[@xml:lang="en"][@xml:id="id5"][following-sibling::*[position()=3]][following-sibling::xi[@xml:lang="no"][@xml:id="id6"][following-sibling::beta[@xml:lang="no"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::kappa[contains(concat(@desciption,"$"),"alse$")][@xml:id="id7"][not(following-sibling::*)]/kappa[not(following-sibling::*)]//theta[@xml:id="id8"][not(child::node())][following-sibling::omicron[@data][following-sibling::psi[@xml:lang="nb"][not(following-sibling::*)]//rho[contains(@token,"t")][@xml:lang="nb"][not(following-sibling::*)][not(preceding-sibling::rho)]//omega[@xml:lang="en-GB"][@xml:id="id9"][not(following-sibling::*)]/eta[starts-with(@false,"t")][@xml:lang="en-GB"]/eta[@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)]//omicron[@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <eta token="_blank" xml:lang="no" xml:id="id1"> <tau attribute="another attribute value" xml:lang="no-nb" xml:id="id2"> @@ -2051,6 +2406,11 @@ </test> <test> <xpath>//chi[@attrib="content"][@xml:id="id1"]/nu[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="nb"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[@xml:id="id4"]//beta[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::lambda[contains(concat(@name,"$"),"his-is-att-value$")][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[contains(concat(@att,"$"),"deValue$")][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <chi attrib="content" xml:id="id1"> <nu xml:lang="no" xml:id="id2"/> @@ -2067,6 +2427,11 @@ </test> <test> <xpath>//lambda[@xml:lang="en-US"][@xml:id="id1"]//omega[@xml:lang="no"][@xml:id="id2"]//*[@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]//sigma[@name][@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]/pi[starts-with(@token,"attribute-va")][@xml:lang="no-nb"][not(preceding-sibling::*)]/epsilon[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::sigma[@true][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[starts-with(@attr,"_bla")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::theta[@xml:lang="en"][@xml:id="id6"]//eta[@name][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@name][@xml:lang="nb"][following-sibling::*[position()=3]][following-sibling::eta[@title][@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::lambda[@xml:id="id8"][preceding-sibling::*[position() = 3]][following-sibling::pi[@xml:id="id9"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/omicron[not(preceding-sibling::*)][not(following-sibling::*)]//psi[@xml:lang="no-nb"][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id10"][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="en-US" xml:id="id1"> <omega xml:lang="no" xml:id="id2"> @@ -2100,6 +2465,11 @@ </test> <test> <xpath>//eta[contains(@attrib,"lue")][@xml:id="id1"]/phi[@data][@xml:lang="en-GB"][following-sibling::omicron[contains(@attribute,"-att-val")][not(following-sibling::*)]/kappa[contains(@data,"t")][not(preceding-sibling::*)][following-sibling::nu[@title][following-sibling::*[position()=3]][following-sibling::delta[@xml:id="id2"][not(preceding-sibling::delta)][following-sibling::*[@xml:id="id3"][preceding-sibling::*[position() = 3]][following-sibling::xi[starts-with(concat(@delete,"-"),"another attribute value-")][@xml:id="id4"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/theta[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[contains(@att,"tribu")][@xml:lang="no"][@xml:id="id6"][following-sibling::omicron[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[@content][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@number][@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <eta attrib="this-is-att-value" xml:id="id1"> <phi data="true" xml:lang="en-GB"/> @@ -2126,6 +2496,11 @@ </test> <test> <xpath>//beta[@xml:lang="no-nb"][@xml:id="id1"]//tau[@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::psi[@xml:id="id3"][preceding-sibling::*[position() = 1]]//xi[contains(concat(@false,"$"),"alse$")][@xml:id="id4"][following-sibling::kappa[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[not(preceding-sibling::*)]/alpha[@xml:id="id5"]/phi[@att][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::upsilon[@and][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omega[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no-nb" xml:id="id1"> <tau xml:lang="nb" xml:id="id2"/> @@ -2150,6 +2525,11 @@ </test> <test> <xpath>//mu[@class]//pi[starts-with(concat(@delete,"-"),"true-")][not(following-sibling::*)]/omicron[contains(concat(@insert,"$"),"456789$")][@xml:lang="en-GB"][not(child::node())][following-sibling::lambda[@object][@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]]/delta[@or="_blank"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[starts-with(concat(@true,"-"),"100%-")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[contains(@name,"ttribut")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)]/kappa[contains(concat(@token,"$"),"attribute$")][@xml:lang="no-nb"][not(following-sibling::*)]/pi[@false][@xml:id="id4"][following-sibling::phi[@and][@xml:id="id5"][not(following-sibling::*)]/rho[starts-with(concat(@false,"-"),"attribute-")][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:id="id6"][not(following-sibling::*)]//lambda[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@name][@xml:lang="nb"][@xml:id="id8"][following-sibling::*[position()=3]][not(child::node())][following-sibling::lambda[@xml:lang="en"][@xml:id="id9"][not(child::node())][following-sibling::alpha[starts-with(@delete,"a")][@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="no"][@xml:id="id10"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <mu class="attribute-value"> <pi delete="true"> @@ -2184,6 +2564,11 @@ </test> <test> <xpath>//nu[@attribute][@xml:lang="en"]//xi[contains(@object,"e")][@xml:lang="no"][@xml:id="id1"][following-sibling::*[position()=5]][not(child::node())][following-sibling::psi[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::pi[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omega[starts-with(@name,"false")][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][following-sibling::upsilon[@xml:lang="nb"][@xml:id="id4"][following-sibling::sigma[@true][@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)]/xi[@src][@xml:lang="no"][@xml:id="id6"][not(following-sibling::*)]//*[@attrib][@xml:id="id7"][not(child::node())][following-sibling::psi[starts-with(@attribute,"tr")][@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]/rho[@xml:id="id9"]/omicron[@desciption][@xml:lang="en"][not(preceding-sibling::omicron)][following-sibling::xi[not(following-sibling::*)]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <nu attribute="_blank" xml:lang="en"> <xi object="attribute-value" xml:lang="no" xml:id="id1"/> @@ -2209,6 +2594,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]//gamma[@token][@xml:lang="no"][@xml:id="id2"][following-sibling::*[position()=3]][following-sibling::tau[@xml:lang="en-GB"][following-sibling::*[position()=2]][following-sibling::xi[@xml:id="id3"][not(child::node())][following-sibling::xi[@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//upsilon[@xml:id="id5"][not(preceding-sibling::*)]/omega[contains(concat(@true,"$"),"0%$")][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::nu[preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::iota[@number="100%"][@xml:lang="en"][@xml:id="id7"][not(following-sibling::*)]/upsilon[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(@desciption,"t")][@xml:lang="en-US"][@xml:id="id9"]/*]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <gamma token="attribute" xml:lang="no" xml:id="id2"/> @@ -2235,6 +2625,11 @@ </test> <test> <xpath>//nu[@xml:lang="en"]//tau[contains(concat(@true,"$"),"attribute value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(preceding-sibling::tau)]/omega[@false="attribute value"][@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)]//phi[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::rho[contains(concat(@att,"$"),"lank$")][not(following-sibling::*)]/eta[@xml:id="id2"][following-sibling::*[position()=3]][following-sibling::omicron[starts-with(concat(@att,"-"),"false-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::rho[@xml:id="id3"][following-sibling::delta[@xml:lang="en"][not(preceding-sibling::delta)]//omega[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/rho/alpha[following-sibling::*[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::sigma[@abort][@xml:id="id5"][not(following-sibling::*)]/omicron[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::chi[@xml:id="id7"][not(child::node())][following-sibling::iota[starts-with(concat(@true,"-"),"solid 1px green-")][@xml:id="id8"][preceding-sibling::*[position() = 3]][following-sibling::kappa[@xml:id="id9"]/nu[@and][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::iota[@or][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//iota[@xml:lang="no"][following-sibling::gamma[@att="this.nodeValue"][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="en"> <tau true="another attribute value" xml:lang="no-nb"> @@ -2275,6 +2670,11 @@ </test> <test> <xpath>//upsilon[contains(@insert,"true")][@xml:lang="no"]//delta[starts-with(concat(@and,"-"),"this.nodeValue-")][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[starts-with(concat(@string,"-"),"this.nodeValue-")][@xml:id="id2"][not(child::node())][following-sibling::iota[@desciption][@xml:id="id3"][not(child::node())][following-sibling::psi[@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::rho/zeta[@xml:id="id5"][not(child::node())][following-sibling::beta[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <upsilon insert="true" xml:lang="no"> <delta and="this.nodeValue" xml:lang="en-GB" xml:id="id1"> @@ -2293,6 +2693,11 @@ </test> <test> <xpath>//psi[@abort][@xml:lang="en"]/beta[starts-with(concat(@attribute,"-"),"123456789-")][@xml:id="id1"]/tau[@attr]/beta[@name][following-sibling::phi[contains(concat(@object,"$"),"lse$")][@xml:id="id2"][not(following-sibling::*)]/psi[starts-with(@abort,"f")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@number][@xml:lang="en-US"]/rho[starts-with(concat(@desciption,"-"),"_blank-")][@xml:id="id3"]/omicron[@att][@xml:lang="nb"][@xml:id="id4"][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>1</nth> + </result> <tree> <psi abort="solid 1px green" xml:lang="en"> <beta attribute="123456789" xml:id="id1"> @@ -2315,6 +2720,11 @@ </test> <test> <xpath>//lambda[contains(@src,"attribute-valu")][@xml:id="id1"]//upsilon[@xml:lang="en-US"][not(child::node())][following-sibling::nu[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(preceding-sibling::nu or following-sibling::nu)][not(preceding-sibling::nu)][following-sibling::lambda[@data][@xml:id="id3"][not(following-sibling::*)]//theta[@string="attribute"][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[not(child::node())][following-sibling::pi[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@class="attribute"][@xml:lang="nb"][preceding-sibling::*[position() = 3]]/lambda[starts-with(concat(@title,"-"),"this.nodeValue-")][@xml:lang="no-nb"][@xml:id="id6"][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 1]][following-sibling::iota[@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::phi[contains(@title,"ue")][@xml:lang="en"][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@attr="100%"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::kappa[starts-with(@delete,"1234")][@xml:lang="no-nb"][not(following-sibling::*)]//gamma[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id8"][following-sibling::sigma[@or][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <lambda src="attribute-value" xml:id="id1"> <upsilon xml:lang="en-US"/> @@ -2343,6 +2753,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]//pi[@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]//phi[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:id="id4"][preceding-sibling::*[position() = 1]]/sigma[contains(concat(@delete,"$"),"x green$")][following-sibling::kappa[contains(@true,"ibute val")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[@title][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>1</nth> + </result> <tree> <phi xml:id="id1"> <pi xml:lang="no" xml:id="id2"> @@ -2360,6 +2775,11 @@ </test> <test> <xpath>//omicron[@src="this-is-att-value"][@xml:lang="no"]/upsilon[@and="attribute-value"][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[contains(concat(@or,"$"),"nodeValue$")][@xml:id="id1"][not(following-sibling::*)]/pi[@attrib][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:lang="no"][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[@xml:id="id4"][not(child::node())][following-sibling::delta[@attr][@xml:lang="nb"]//mu[not(preceding-sibling::*)][not(following-sibling::*)]//*[@insert="123456789"][@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::lambda[@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)][not(preceding-sibling::lambda)]/chi[@xml:lang="no-nb"][not(preceding-sibling::*)]//nu[@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omicron src="this-is-att-value" xml:lang="no"> <upsilon and="attribute-value" xml:lang="no"/> @@ -2385,6 +2805,11 @@ </test> <test> <xpath>//iota[contains(concat(@src,"$"),"e$")][@xml:lang="no"][@xml:id="id1"]//omicron[@xml:id="id2"][not(child::node())][following-sibling::nu[contains(@number,"lid 1px gre")][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::mu[@xml:id="id4"][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 3]]/pi[starts-with(@desciption,"another attribute va")][@xml:id="id5"]//omega[@false][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <iota src="true" xml:lang="no" xml:id="id1"> <omicron xml:id="id2"/> @@ -2402,6 +2827,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no"]/nu[contains(concat(@class,"$"),"ontent$")][@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[not(child::node())][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 2]][not(preceding-sibling::delta)][following-sibling::theta[@xml:id="id3"][preceding-sibling::*[position() = 3]]//omicron[@desciption][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(@content,"fa")][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][not(child::node())][following-sibling::tau[contains(@delete,"value")][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::tau[@xml:lang="nb"][@xml:id="id5"]//iota[not(preceding-sibling::*)]/omicron[contains(@and,"ue")][@xml:lang="no"][@xml:id="id6"]/mu[contains(concat(@insert,"$"),"lue$")][@xml:id="id7"][not(preceding-sibling::*)]/phi[contains(@desciption,"0%")][@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/omega[@xml:lang="no"][@xml:id="id9"][following-sibling::epsilon[@attr][@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]]//tau[@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="en-US"][not(preceding-sibling::*)]/rho[not(child::node())][following-sibling::zeta[contains(concat(@true,"$"),"en$")][@xml:id="id12"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(@attr,"solid 1px")][@xml:id="id13"][preceding-sibling::*[position() = 2]]//xi[@xml:lang="no-nb"][@xml:id="id14"][not(following-sibling::*)]/phi[not(preceding-sibling::*)]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="no"> <nu class="content" xml:lang="en" xml:id="id1"/> @@ -2446,6 +2876,11 @@ </test> <test> <xpath>//omicron[@xml:lang="no-nb"][@xml:id="id1"]//psi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/omicron[@data][@xml:lang="en-GB"][not(preceding-sibling::*)]/*[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@abort][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@xml:lang="en-US"][not(following-sibling::*)]/*[starts-with(@and,"fals")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="no-nb" xml:id="id1"> <psi xml:lang="en-GB"/> @@ -2467,6 +2902,11 @@ </test> <test> <xpath>//psi[@xml:lang="no-nb"]//omicron[@xml:id="id1"][not(preceding-sibling::*)]//omega[@class="_blank"]/xi[contains(@and,"ue")][@xml:lang="no"][@xml:id="id2"]//pi[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@attrib][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::omega[@content][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[contains(concat(@abort,"$"),"ontent$")][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::psi[contains(concat(@or,"$"),"te-value$")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omicron[@class][@xml:id="id6"]//phi[@xml:lang="nb"][not(preceding-sibling::*)]//delta[contains(@att,"00%")][@xml:id="id7"][not(following-sibling::*)]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no-nb"> <omicron xml:id="id1"> @@ -2493,6 +2933,11 @@ </test> <test> <xpath>//kappa[@xml:id="id1"]/zeta[@xml:lang="en-US"][not(preceding-sibling::*)]/nu[starts-with(@title,"con")][@xml:id="id2"][not(following-sibling::*)]//phi[starts-with(concat(@and,"-"),"true-")][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="nb"]//psi[@xml:lang="no-nb"][@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>1</nth> + </result> <tree> <kappa xml:id="id1"> <zeta xml:lang="en-US"> @@ -2513,6 +2958,11 @@ </test> <test> <xpath>//*[@xml:lang="en-US"]//psi[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@xml:lang="no"][not(preceding-sibling::*)]//omicron[@attr="true"][@xml:lang="nb"][following-sibling::epsilon[@delete][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::tau[not(following-sibling::*)]/phi[following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[starts-with(concat(@true,"-"),"attribute value-")][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/xi[not(preceding-sibling::*)][not(child::node())][following-sibling::rho[contains(@content,"tribute value")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[@xml:id="id4"][following-sibling::gamma[not(following-sibling::*)]//theta[@xml:id="id5"]/xi[@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::pi[starts-with(concat(@abort,"-"),"this-")][@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[preceding-sibling::*[position() = 2]]//kappa[starts-with(concat(@token,"-"),"100%-")][@xml:lang="en-US"][not(child::node())][following-sibling::iota[starts-with(concat(@abort,"-"),"123456789-")][@xml:id="id8"][preceding-sibling::*[position() = 1]]]][position() = 1]]][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-US"> <psi xml:id="id1"> @@ -2548,6 +2998,11 @@ </test> <test> <xpath>//omega[@data="100%"][@xml:lang="en"][@xml:id="id1"]/alpha[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(preceding-sibling::alpha)][following-sibling::xi[starts-with(concat(@and,"-"),"attribute-")][@xml:id="id3"][following-sibling::*[position()=4]][not(child::node())][following-sibling::psi[@desciption][following-sibling::*[position()=3]][not(child::node())][following-sibling::xi[not(child::node())][following-sibling::*[contains(@desciption,"nten")][@xml:id="id4"][not(child::node())][following-sibling::pi[@xml:lang="en-US"][not(following-sibling::*)]/lambda[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@and="this-is-att-value"][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)]//phi[@xml:lang="no"][not(child::node())][following-sibling::xi[contains(concat(@and,"$"),"nk$")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <omega data="100%" xml:lang="en" xml:id="id1"> <alpha xml:lang="no" xml:id="id2"/> @@ -2570,6 +3025,11 @@ </test> <test> <xpath>//beta[@attribute][@xml:lang="no"]/*[@xml:lang="en-GB"][not(preceding-sibling::*)]//rho[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@xml:lang="en"]//xi[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id3"]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <beta attribute="false" xml:lang="no"> <any xml:lang="en-GB"> @@ -2591,6 +3051,11 @@ </test> <test> <xpath>//beta[starts-with(@attr,"attribu")]/xi[contains(@number,"id 1px ")][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[contains(@attrib,"e")][@xml:id="id1"][not(following-sibling::*)]//zeta[starts-with(@desciption,"t")][@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]/nu[starts-with(@desciption,"fals")][not(preceding-sibling::*)][not(following-sibling::*)]/rho[starts-with(@or,"another attribut")][@xml:lang="no"][@xml:id="id3"][following-sibling::omicron[@xml:lang="nb"]//omega[@xml:lang="no"][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <beta attr="attribute-value"> <xi number="solid 1px green"/> @@ -2611,6 +3076,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]/pi[starts-with(@abort,"1")][@xml:lang="no"][@xml:id="id2"][following-sibling::eta[starts-with(@att,"1")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[contains(@delete,"e")][@xml:lang="en-US"][not(preceding-sibling::*)]//beta[@xml:id="id3"][not(preceding-sibling::*)]/omega[starts-with(concat(@false,"-"),"100%-")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[starts-with(@attr,"attribute-v")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]/eta[@true="this-is-att-value"][@xml:lang="no-nb"][@xml:id="id6"]/sigma[@true="attribute value"][@xml:lang="no"][@xml:id="id7"][not(following-sibling::*)]/omega[not(preceding-sibling::*)]/alpha[contains(concat(@content,"$")," attribute value$")][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@number][@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::epsilon[following-sibling::epsilon[@xml:lang="en-GB"]/psi[@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[not(preceding-sibling::*)][following-sibling::iota[not(child::node())][following-sibling::phi[@xml:id="id11"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/epsilon[@xml:id="id12"][not(following-sibling::*)]/pi[@xml:id="id13"][not(preceding-sibling::*)]//*[@xml:lang="en-GB"][@xml:id="id14"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(concat(@token,"-"),"content-")][@xml:lang="no-nb"][@xml:id="id15"]/tau[@object][@xml:id="id16"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <pi abort="123456789" xml:lang="no" xml:id="id2"/> @@ -2658,6 +3128,11 @@ </test> <test> <xpath>//iota[starts-with(concat(@desciption,"-"),"this.nodeValue-")][@xml:id="id1"]/psi[starts-with(concat(@attribute,"-"),"another attribute value-")][@xml:id="id2"]/mu[@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@attr][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="no"][not(child::node())][following-sibling::iota[contains(@insert,"lid 1")][not(following-sibling::*)]/beta[@xml:id="id5"][not(preceding-sibling::*)]/beta[@string="true"][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::epsilon[contains(concat(@src,"$"),"ribute value$")][@xml:lang="en-US"][@xml:id="id6"]//omega[@xml:lang="en-US"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <iota desciption="this.nodeValue" xml:id="id1"> <psi attribute="another attribute value" xml:id="id2"> @@ -2681,6 +3156,11 @@ </test> <test> <xpath>//omicron[@string][@xml:id="id1"]/nu[starts-with(@false,"co")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::theta//pi[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::nu[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[@attribute][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(preceding-sibling::alpha)][following-sibling::lambda[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][following-sibling::psi[@attrib][@xml:lang="en"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]]]]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <omicron string="false" xml:id="id1"> <nu false="content" xml:lang="nb"/> @@ -2698,6 +3178,11 @@ </test> <test> <xpath>//gamma[@string][@xml:lang="en"]//tau[@token][@xml:lang="no-nb"][@xml:id="id1"][not(following-sibling::*)]//zeta[starts-with(@object,"conten")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@true][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::*[@xml:id="id4"][preceding-sibling::*[position() = 2]]//iota[@string="123456789"]//epsilon[starts-with(@att,"this.nodeValu")][@xml:lang="en-GB"][@xml:id="id5"][not(child::node())][following-sibling::upsilon[@xml:id="id6"][preceding-sibling::*[position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <gamma string="this.nodeValue" xml:lang="en"> <tau token="_blank" xml:lang="no-nb" xml:id="id1"> @@ -2717,6 +3202,11 @@ </test> <test> <xpath>//psi[@xml:lang="no-nb"][@xml:id="id1"]/nu[@attribute][@xml:lang="no"][@xml:id="id2"]//eta[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[contains(@class,"ntent")][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//rho[starts-with(concat(@or,"-"),"false-")][following-sibling::kappa[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::gamma[not(child::node())][following-sibling::xi[@object][not(child::node())][following-sibling::iota[@string][preceding-sibling::*[position() = 4]][not(preceding-sibling::iota)][following-sibling::upsilon[@desciption]//lambda[contains(concat(@string,"$")," value$")][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@attr][@xml:lang="en-GB"][@xml:id="id5"][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no-nb" xml:id="id1"> <nu attribute="this.nodeValue" xml:lang="no" xml:id="id2"> @@ -2741,6 +3231,11 @@ </test> <test> <xpath>//kappa[@attr="this.nodeValue"][@xml:lang="en-GB"][@xml:id="id1"]/omega[@xml:id="id2"][not(preceding-sibling::*)]/zeta[@xml:lang="nb"][@xml:id="id3"]/mu[@xml:lang="en-GB"][not(following-sibling::*)]//eta[@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::beta[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[@xml:lang="nb"][@xml:id="id6"][not(child::node())][following-sibling::alpha[starts-with(@false,"solid 1px ")][@xml:lang="nb"][@xml:id="id7"][not(child::node())][following-sibling::omega[contains(@src,"attribute")][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::mu[preceding-sibling::*[position() = 5]][following-sibling::*[position()=1]][following-sibling::epsilon[contains(concat(@delete,"$"),"en$")][@xml:lang="en-US"][@xml:id="id8"][not(following-sibling::*)]/xi[contains(@and,"00%")][@xml:lang="nb"][not(following-sibling::*)]//tau[@xml:lang="nb"]/alpha[starts-with(@name,"solid 1px gr")][@xml:lang="no"][not(preceding-sibling::*)]//pi[@xml:lang="no-nb"][not(following-sibling::*)]/kappa[@xml:lang="en"][@xml:id="id9"]/beta[@xml:id="id10"][not(following-sibling::*)]//omega[starts-with(@number,"con")][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[starts-with(@object,"attribute valu")][@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@attr="attribute value"][@xml:lang="no"][@xml:id="id12"][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <kappa attr="this.nodeValue" xml:lang="en-GB" xml:id="id1"> <omega xml:id="id2"> @@ -2780,6 +3275,11 @@ </test> <test> <xpath>//kappa[contains(concat(@attr,"$"),"e-value$")][@xml:lang="en-US"][@xml:id="id1"]/mu[@xml:lang="no-nb"][@xml:id="id2"][following-sibling::alpha[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="nb"][not(following-sibling::*)]/alpha[starts-with(@desciption,"_")][@xml:lang="en"][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[@xml:lang="nb"][not(child::node())][following-sibling::tau[contains(@attrib,"fal")][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <kappa attr="attribute-value" xml:lang="en-US" xml:id="id1"> <mu xml:lang="no-nb" xml:id="id2"/> @@ -2797,6 +3297,11 @@ </test> <test> <xpath>//beta[@data][@xml:lang="no-nb"][@xml:id="id1"]//tau[not(preceding-sibling::*)]//*[not(preceding-sibling::*)][not(child::node())][following-sibling::eta[starts-with(@name,"solid 1px gr")][following-sibling::pi[starts-with(@token,"attribute val")][@xml:lang="en"][not(following-sibling::*)][not(following-sibling::pi)]//tau[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::psi[@attribute][@xml:lang="en"]/*[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::theta[@string="this.nodeValue"][@xml:id="id4"][not(child::node())][following-sibling::upsilon[@delete][@xml:id="id5"][preceding-sibling::*[position() = 2]]/lambda[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <beta data="_blank" xml:lang="no-nb" xml:id="id1"> <tau> @@ -2820,6 +3325,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]//psi[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(preceding-sibling::psi or following-sibling::psi)]/omega[@data][following-sibling::pi[@xml:id="id3"][following-sibling::omega[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[@attrib][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::gamma[starts-with(concat(@class,"-"),"content-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//omicron[@attrib][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::theta[contains(concat(@insert,"$"),"ent$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[contains(@attribute,"t-value")][@xml:id="id5"][preceding-sibling::*[position() = 2]]/iota[@xml:id="id6"][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <psi xml:id="id1"> <psi xml:lang="no-nb" xml:id="id2"> @@ -2842,6 +3352,11 @@ </test> <test> <xpath>//omega[starts-with(@att,"10")][@xml:lang="no"][@xml:id="id1"]/eta[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[starts-with(concat(@object,"-"),"this-")][@xml:id="id2"][following-sibling::*[position()=2]][following-sibling::upsilon[@xml:lang="no-nb"][not(child::node())][following-sibling::lambda[contains(@string,"te value")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 3]]//omega[starts-with(@data,"solid 1px")][@xml:id="id4"][not(child::node())][following-sibling::phi[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="nb"][not(following-sibling::*)]//omega[contains(@number,"onten")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <omega att="100%" xml:lang="no" xml:id="id1"> <eta xml:lang="en-US"/> @@ -2861,6 +3376,11 @@ </test> <test> <xpath>//psi[@xml:lang="no"]/alpha[@token][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="en"][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="no"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(preceding-sibling::kappa or following-sibling::kappa)]//chi[contains(@title,"e")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@object][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]/mu[@xml:lang="en"][following-sibling::sigma[starts-with(concat(@delete,"-"),"100%-")][@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::nu[@xml:id="id5"][not(following-sibling::*)]//beta[contains(concat(@data,"$")," attribute value$")][not(child::node())][following-sibling::chi[@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]//eta[@xml:id="id7"][not(following-sibling::*)]/pi[@xml:id="id8"][not(following-sibling::*)]//phi[@xml:lang="no-nb"][@xml:id="id9"][following-sibling::gamma[starts-with(@attrib,"conten")][preceding-sibling::*[position() = 1]]//delta[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no"> <alpha token="attribute-value" xml:lang="no"> @@ -2899,6 +3419,11 @@ </test> <test> <xpath>//pi[@src="this.nodeValue"][@xml:lang="nb"]/lambda[starts-with(concat(@and,"-"),"this-")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]/eta[not(child::node())][following-sibling::gamma[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="en"]//delta[@content][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 1]][following-sibling::gamma[@xml:lang="no"][not(following-sibling::*)]//gamma[starts-with(concat(@true,"-"),"123456789-")][not(preceding-sibling::*)][not(following-sibling::*)]/*[starts-with(concat(@insert,"-"),"123456789-")]//alpha[contains(concat(@false,"$"),"%$")][@xml:lang="no"][@xml:id="id2"]//chi[not(following-sibling::chi)]/phi[@xml:lang="nb"][not(preceding-sibling::*)]//upsilon[@xml:id="id3"][not(child::node())][following-sibling::mu[not(following-sibling::*)]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <pi src="this.nodeValue" xml:lang="nb"> <lambda and="this-is-att-value" xml:id="id1"/> @@ -2930,6 +3455,11 @@ </test> <test> <xpath>//xi[contains(@insert,"00%")][@xml:lang="en-GB"][@xml:id="id1"]//mu[@false][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(concat(@delete,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@content][not(following-sibling::*)]/tau[not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id3"][not(following-sibling::*)]//mu[contains(concat(@src,"$"),"px green$")][@xml:lang="en-US"][not(child::node())][following-sibling::phi[@or][not(following-sibling::*)]/chi[starts-with(concat(@data,"-"),"false-")][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[@xml:id="id4"][following-sibling::iota[@xml:id="id5"][not(following-sibling::*)]//tau[starts-with(concat(@data,"-"),"content-")][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="en"][not(following-sibling::*)]//phi[@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)]/psi[not(preceding-sibling::*)][not(following-sibling::*)]/kappa[contains(concat(@attribute,"$"),"false$")][@xml:lang="en"][not(following-sibling::*)]/epsilon[contains(concat(@src,"$"),"e$")][@xml:lang="en"][@xml:id="id7"]//tau[@insert][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[@xml:id="id8"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <xi insert="100%" xml:lang="en-GB" xml:id="id1"> <mu false="solid 1px green"/> @@ -2966,6 +3496,11 @@ </test> <test> <xpath>//beta[contains(@attrib,"ue")]/nu[contains(@title,"fals")][@xml:id="id1"][not(preceding-sibling::*)]/rho[@insert][@xml:id="id2"][not(preceding-sibling::*)]/kappa[not(following-sibling::*)]//upsilon[@and][@xml:id="id3"][not(preceding-sibling::*)]//chi[not(preceding-sibling::*)][following-sibling::delta[preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <beta attrib="this.nodeValue"> <nu title="false" xml:id="id1"> @@ -2985,6 +3520,11 @@ </test> <test> <xpath>//zeta[@xml:lang="en"][@xml:id="id1"]/delta[@and][@xml:lang="en"]/omicron[@xml:lang="no"][following-sibling::iota[contains(@number,"t")][@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::beta[contains(concat(@number,"$"),"k$")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/phi[not(preceding-sibling::*)]/omicron[contains(@class,"lue")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)]//omicron[not(preceding-sibling::*)]/omicron[@class="this-is-att-value"][@xml:id="id4"]/epsilon[starts-with(@false,"this.node")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[starts-with(@desciption,"co")][@xml:lang="no-nb"]/mu[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::upsilon[starts-with(concat(@name,"-"),"true-")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[@xml:id="id8"][not(child::node())][following-sibling::theta[@xml:lang="no"][not(child::node())][following-sibling::pi[contains(concat(@data,"$"),"lue$")][@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//*[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::phi[@xml:lang="en"][not(child::node())][following-sibling::psi[@xml:lang="en-US"][not(following-sibling::*)]/lambda[@xml:lang="en-GB"][@xml:id="id10"][position() = 1]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <zeta xml:lang="en" xml:id="id1"> <delta and="_blank" xml:lang="en"> @@ -3026,6 +3566,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]//kappa[starts-with(concat(@att,"-"),"123456789-")][@xml:lang="no"][not(following-sibling::*)]//epsilon[@number][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//beta[contains(@desciption,"6789")][@xml:lang="no"][@xml:id="id4"][not(following-sibling::beta)][not(child::node())][following-sibling::delta[@name][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//phi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[starts-with(@false,"a")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::psi[contains(concat(@number,"$"),"%$")][@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <phi xml:id="id1"> <kappa att="123456789" xml:lang="no"> @@ -3047,6 +3592,11 @@ </test> <test> <xpath>//beta[contains(concat(@false,"$"),"t-value$")][@xml:lang="en-GB"][@xml:id="id1"]//*[@xml:lang="en"][not(child::node())][following-sibling::rho[@false][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 2]][following-sibling::omicron[@token="attribute"][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//zeta[@content][@xml:lang="nb"]/phi[@attrib][@xml:id="id3"]/nu[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::omega[starts-with(concat(@number,"-"),"solid 1px green-")][@xml:lang="en-US"][@xml:id="id6"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <beta false="this-is-att-value" xml:lang="en-GB" xml:id="id1"> <any xml:lang="en"/> @@ -3071,6 +3621,11 @@ </test> <test> <xpath>//*/delta[@xml:lang="en-GB"][not(preceding-sibling::*)]//lambda[not(preceding-sibling::*)]//lambda[@abort][@xml:lang="no"][@xml:id="id1"][following-sibling::*[position()=8]][not(child::node())][following-sibling::phi[following-sibling::*[position()=7]][following-sibling::psi[@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[starts-with(concat(@attribute,"-"),"this-")][@xml:lang="en"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::upsilon[contains(concat(@att,"$"),"t$")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=4]][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 5]][following-sibling::*[position()=3]][following-sibling::pi[@xml:id="id5"][preceding-sibling::*[position() = 6]][not(preceding-sibling::pi or following-sibling::pi)][not(child::node())][following-sibling::alpha[contains(concat(@attr,"$"),"456789$")][@xml:lang="no"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::beta[contains(@data,"an")][@xml:lang="en-US"]/rho[@att][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[contains(concat(@class,"$"),"another attribute value$")][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>1</nth> + </result> <tree> <any> <delta xml:lang="en-GB"> @@ -3099,6 +3654,11 @@ </test> <test> <xpath>//theta[contains(concat(@attr,"$"),"ue$")]/zeta[@xml:lang="en-US"][not(preceding-sibling::*)]/rho[starts-with(concat(@insert,"-"),"attribute value-")][@xml:lang="nb"][@xml:id="id1"]/theta[starts-with(concat(@and,"-"),"this.nodeValue-")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="en"]/alpha[contains(@att,"hi")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::chi[@xml:lang="nb"][preceding-sibling::*[position() = 1]]//chi[@attrib="another attribute value"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::psi[starts-with(@number,"_blank")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[not(preceding-sibling::*)][following-sibling::gamma[@true][@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>1</nth> + </result> <tree> <theta attr="true"> <zeta xml:lang="en-US"> @@ -3123,6 +3683,11 @@ </test> <test> <xpath>//tau[@xml:lang="no"][@xml:id="id1"]//nu//omicron[not(preceding-sibling::*)][following-sibling::beta[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@string][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::tau[contains(@src,"s")][@xml:lang="no-nb"][following-sibling::nu[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::gamma[@xml:lang="en-US"][@xml:id="id5"]/omega[contains(concat(@abort,"$"),"eValue$")][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[not(child::node())][following-sibling::alpha[starts-with(@name,"this.n")][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::tau[@xml:id="id8"][not(following-sibling::*)]//lambda[@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[starts-with(concat(@true,"-"),"attribute value-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id10"]]]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no" xml:id="id1"> <nu> @@ -3151,6 +3716,11 @@ </test> <test> <xpath>//*[@data="false"][@xml:id="id1"]/mu[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@xml:lang="no-nb"][not(child::node())][following-sibling::lambda[@xml:lang="en-GB"][following-sibling::zeta[@xml:id="id3"][following-sibling::eta[@class][@xml:id="id4"][not(child::node())][following-sibling::sigma[@attrib][@xml:lang="no-nb"][not(following-sibling::*)]//mu[not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@delete][@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//gamma[not(preceding-sibling::*)]//upsilon[@data][@xml:id="id6"][not(following-sibling::*)]//beta/psi[contains(@number," green")][@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::alpha[@attrib][@xml:id="id8"][preceding-sibling::*[position() = 1]]//delta[contains(concat(@class,"$"),"this-is-att-value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::eta[@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[@xml:lang="en-GB"][@xml:id="id10"][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <any data="false" xml:id="id1"> <mu xml:lang="nb" xml:id="id2"> @@ -3186,6 +3756,11 @@ </test> <test> <xpath>//lambda[contains(concat(@src,"$"),"-value$")]/omega[not(child::node())][following-sibling::zeta[@data][@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::omega[starts-with(concat(@attrib,"-"),"this.nodeValue-")][@xml:id="id2"]//nu[contains(@number,"00")][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/delta[starts-with(@true,"this-is-att")][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[starts-with(@abort,"solid 1px gr")][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[not(following-sibling::*)]/eta[@xml:lang="no-nb"][@xml:id="id6"][following-sibling::sigma[starts-with(concat(@desciption,"-"),"123456789-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@insert="this-is-att-value"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::*[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 3]][not(preceding-sibling::any)]/tau[@token="123456789"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[starts-with(@token,"_blan")][@xml:lang="no-nb"][@xml:id="id10"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <lambda src="this-is-att-value"> <omega/> @@ -3216,6 +3791,11 @@ </test> <test> <xpath>//upsilon[starts-with(@content,"attribute valu")][@xml:lang="en"][@xml:id="id1"]/iota[contains(concat(@attrib,"$"),"tribute value$")][not(preceding-sibling::*)][following-sibling::alpha[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="no-nb"][@xml:id="id2"]//nu[contains(concat(@abort,"$"),"rue$")][@xml:id="id3"][following-sibling::omicron[preceding-sibling::*[position() = 1]][following-sibling::*[position()=6]][following-sibling::epsilon[@xml:lang="en-GB"][following-sibling::*[position()=5]][not(child::node())][following-sibling::mu[contains(concat(@data,"$"),"ute value$")][following-sibling::pi[@xml:id="id4"][not(child::node())][following-sibling::gamma[@desciption][@xml:lang="nb"][following-sibling::omicron[@insert][@xml:lang="en-US"][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 7]][not(following-sibling::*)]//omega[@attribute][@xml:lang="no"][@xml:id="id5"][not(following-sibling::*)]//gamma[@xml:lang="en"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::tau[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[starts-with(@delete,"false")][not(preceding-sibling::*)]//rho[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::delta//lambda[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::omega[@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/*[contains(@or,"ntent")][@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)]/kappa[contains(@name,"reen")][@xml:lang="en-GB"][@xml:id="id11"][not(following-sibling::*)]//nu[@xml:lang="no"][@xml:id="id12"][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[@xml:lang="en-US"][@xml:id="id13"]]]]]][position() = 1]]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <upsilon content="attribute value" xml:lang="en" xml:id="id1"> <iota attrib="another attribute value"/> @@ -3257,6 +3837,11 @@ </test> <test> <xpath>//gamma[@object][@xml:lang="en-GB"][@xml:id="id1"]//tau[@class][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:id="id4"]//pi[starts-with(concat(@true,"-"),"_blank-")][@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::eta[@class="true"][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]]/theta[@src][not(preceding-sibling::*)][not(following-sibling::*)]//eta[starts-with(@attrib,"true")][@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]//zeta[starts-with(concat(@insert,"-"),"this.nodeValue-")][not(preceding-sibling::*)][following-sibling::xi[starts-with(concat(@attr,"-"),"another attribute value-")][not(child::node())][following-sibling::tau[@xml:id="id8"][preceding-sibling::*[position() = 2]]/lambda[@and][not(following-sibling::*)]//kappa[not(following-sibling::*)]//delta[@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@xml:lang="no-nb"][not(following-sibling::*)]/rho[@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::*[@true][@xml:lang="no"][@xml:id="id10"][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <gamma object="100%" xml:lang="en-GB" xml:id="id1"> <tau class="content" xml:id="id2"/> @@ -3292,6 +3877,11 @@ </test> <test> <xpath>//phi[contains(concat(@object,"$")," 1px green$")][@xml:id="id1"]//xi[starts-with(@attr,"content")]//epsilon[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:lang="no"][preceding-sibling::*[position() = 2]]/iota[@abort][@xml:id="id3"][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <phi object="solid 1px green" xml:id="id1"> <xi attr="content"> @@ -3308,6 +3898,11 @@ </test> <test> <xpath>//psi[@xml:lang="en"][@xml:id="id1"]/nu/pi[@attribute][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::nu[@xml:lang="nb"][preceding-sibling::*[position() = 1]]/beta[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@xml:id="id4"][not(child::node())][following-sibling::lambda[@xml:lang="no"]/rho[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="no-nb"][@xml:id="id6"][not(child::node())][following-sibling::tau[@or="content"][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 2]]/kappa[@xml:lang="en"][not(preceding-sibling::*)]/tau[starts-with(concat(@delete,"-"),"false-")][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[contains(@and,"100")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::omicron[starts-with(concat(@title,"-"),"attribute-")][@xml:id="id8"][not(following-sibling::*)]//sigma[contains(@data,"fals")][@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)]//theta[@and="true"][@xml:lang="nb"][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="en" xml:id="id1"> <nu> @@ -3342,6 +3937,11 @@ </test> <test> <xpath>//iota[starts-with(@title,"solid 1")]//nu[@xml:lang="no-nb"][not(child::node())][following-sibling::beta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::theta[@xml:id="id1"]/nu[contains(@number,"e valu")][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@string="content"][@xml:lang="no"][not(preceding-sibling::*)]//*[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/zeta[starts-with(@attrib,"this-is-att-valu")][@xml:lang="nb"][@xml:id="id3"]//*[@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[not(child::node())][following-sibling::omicron[contains(@number,"ibute")]/delta[contains(concat(@number,"$"),"his.nodeValue$")][@xml:lang="en-GB"][not(child::node())][following-sibling::lambda[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@class][@xml:lang="nb"][not(following-sibling::*)]/zeta[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::mu[@number="false"][@xml:lang="en"][following-sibling::zeta[following-sibling::*[position()=1]][following-sibling::nu[@class][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/epsilon[@abort][@xml:id="id7"][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <iota title="solid 1px green"> <nu xml:lang="no-nb"/> @@ -3380,6 +3980,11 @@ </test> <test> <xpath>//phi//theta[@xml:lang="en-GB"]//*[@attribute][@xml:id="id1"][following-sibling::*[position()=6]][not(child::node())][following-sibling::*[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::nu[@object][@xml:id="id3"][not(child::node())][following-sibling::alpha[contains(concat(@true,"$"),"value$")][@xml:id="id4"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=3]][following-sibling::omicron[preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::phi[@or][@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="en-US"][preceding-sibling::*[position() = 6]][not(following-sibling::*)]/delta[@name][@xml:lang="en-GB"][@xml:id="id5"][following-sibling::*[position()=3]][not(child::node())][following-sibling::nu[@xml:lang="en-US"][not(child::node())][following-sibling::nu[@xml:id="id6"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::zeta[@data][@xml:id="id7"][not(following-sibling::*)]//alpha[@insert="solid 1px green"][@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-US"][@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::kappa[contains(concat(@abort,"$"),"other attribute value$")][@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 2]]//gamma[@insert][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][not(following-sibling::*)]//gamma[@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[contains(@true,"rue")][@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]]][position() = 1]]]]]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <phi> <theta xml:lang="en-GB"> @@ -3414,6 +4019,11 @@ </test> <test> <xpath>//phi[@xml:lang="nb"]/upsilon[@xml:lang="no-nb"][@xml:id="id1"]/psi[@xml:id="id2"]//kappa[@name][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en-GB"][following-sibling::*[position()=1]][not(preceding-sibling::omicron)][not(child::node())][following-sibling::alpha[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 2]]//lambda[starts-with(concat(@class,"-"),"_blank-")][@xml:lang="no-nb"][not(preceding-sibling::*)]/alpha[@attribute][@xml:id="id5"][not(preceding-sibling::*)]/delta[@xml:id="id6"]/delta[contains(concat(@title,"$"),"3456789$")][following-sibling::omicron[contains(@true,"_blan")][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/sigma[contains(@token,"3456")][@xml:lang="en-US"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::xi[starts-with(concat(@title,"-"),"attribute-")][@xml:id="id9"][preceding-sibling::*[position() = 1]]//sigma[@attr][@xml:lang="en-US"][@xml:id="id10"][not(following-sibling::*)]/phi[contains(@desciption,"nother a")][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[contains(concat(@true,"$"),"ue$")][@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[starts-with(concat(@name,"-"),"solid 1px green-")][@xml:lang="no-nb"][@xml:id="id11"][preceding-sibling::*[position() = 2]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="nb"> <upsilon xml:lang="no-nb" xml:id="id1"> @@ -3448,6 +4058,11 @@ </test> <test> <xpath>//delta[@xml:id="id1"]//eta[@xml:lang="en-US"][@xml:id="id2"]//*[starts-with(@attrib,"false")][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@src,"$"),"lue$")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]/*[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:id="id6"][preceding-sibling::*[position() = 1]]/sigma[contains(@src,"l")][@xml:lang="no-nb"][@xml:id="id7"]/lambda[@xml:lang="no-nb"]//iota[contains(concat(@src,"$"),"ttribute value$")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="en-US"]//eta[starts-with(@desciption,"attribute va")][not(following-sibling::*)]//psi[following-sibling::*[position()=1]][following-sibling::rho[@attr][@xml:lang="no-nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <delta xml:id="id1"> <eta xml:lang="en-US" xml:id="id2"> @@ -3477,6 +4092,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]/tau[@string][@xml:id="id2"]//alpha[@insert][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)]//lambda[starts-with(@or,"1234567")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::theta[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:lang="no"][@xml:id="id6"][not(child::node())][following-sibling::iota[contains(@title,"en")][@xml:lang="no"][@xml:id="id7"]/phi[contains(@or,"e")][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id8"]//*[contains(concat(@src,"$"),"e$")][@xml:lang="nb"][not(child::node())][following-sibling::eta[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//gamma[@xml:lang="no-nb"][following-sibling::omicron[contains(concat(@insert,"$"),"blank$")][@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <rho xml:id="id1"> <tau string="attribute" xml:id="id2"> @@ -3503,6 +4123,11 @@ </test> <test> <xpath>//iota[contains(concat(@attr,"$"),"e$")][@xml:lang="no-nb"]/chi[@att][@xml:lang="en-GB"]//kappa[@name="content"][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[starts-with(concat(@title,"-"),"attribute-")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//xi[@attribute][not(preceding-sibling::*)]//phi[@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[contains(concat(@content,"$"),"ue$")][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@class][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::zeta/iota[starts-with(@object,"c")][@xml:lang="en-US"][following-sibling::*[starts-with(concat(@token,"-"),"another attribute value-")][@xml:id="id6"][preceding-sibling::*[position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <iota attr="attribute value" xml:lang="no-nb"> <chi att="attribute" xml:lang="en-GB"> @@ -3528,6 +4153,11 @@ </test> <test> <xpath>//chi[@xml:lang="no"]//theta[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::xi[contains(concat(@or,"$"),"false$")][following-sibling::*[position()=2]][following-sibling::beta[@content="true"][not(following-sibling::beta)][following-sibling::phi[@xml:lang="en-US"][not(following-sibling::*)]/epsilon[contains(concat(@title,"$")," value$")][@xml:id="id1"][not(preceding-sibling::*)]/theta[starts-with(@content,"a")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)]/xi[starts-with(@true,"true")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::delta[contains(@insert,"other att")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[contains(concat(@attr,"$"),"k$")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="no-nb"][following-sibling::alpha[@xml:lang="no-nb"][@xml:id="id4"]//lambda[contains(@insert,"ttr")][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::tau[@or="attribute value"][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::nu[contains(@string,"thi")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 2]]/nu[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="no"> <theta xml:lang="en-US"/> @@ -3560,6 +4190,11 @@ </test> <test> <xpath>//iota[@xml:lang="en-US"][@xml:id="id1"]/omega[@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)][not(preceding-sibling::omega)]//eta[starts-with(@number,"1234567")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="no"][not(child::node())][following-sibling::theta[starts-with(concat(@string,"-"),"solid 1px green-")][@xml:lang="en-US"][@xml:id="id3"]/nu[@object][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::nu[starts-with(concat(@src,"-"),"attribute-")][@xml:id="id4"]//kappa[@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::beta[starts-with(@name,"content")][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="en-US" xml:id="id1"> <omega xml:lang="en" xml:id="id2"> @@ -3580,6 +4215,11 @@ </test> <test> <xpath>//iota[@xml:lang="no"][@xml:id="id1"]//zeta[@xml:id="id2"][not(preceding-sibling::*)]//delta[@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@xml:id="id4"]//nu[not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::upsilon[@attr="solid 1px green"][following-sibling::mu[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::alpha[@xml:lang="en"][@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[@xml:id="id7"]//pi[@xml:id="id8"]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no" xml:id="id1"> <zeta xml:id="id2"> @@ -3602,6 +4242,11 @@ </test> <test> <xpath>//omega[starts-with(@abort,"anoth")]//beta[@string][@xml:lang="no"][not(child::node())][following-sibling::xi[contains(concat(@content,"$"),"other attribute value$")][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[contains(@class,"_")][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[@true][@xml:lang="en-GB"][@xml:id="id2"][following-sibling::omega[starts-with(concat(@false,"-"),"content-")][@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(following-sibling::*)][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omega abort="another attribute value"> <beta string="attribute" xml:lang="no"/> @@ -3616,6 +4261,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]//xi[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)]/omicron[@xml:id="id3"][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@xml:id="id5"][preceding-sibling::*[position() = 2]]/xi[@string][@xml:lang="en-US"][not(preceding-sibling::*)]/xi[@att="content"][@xml:id="id6"][following-sibling::alpha[@xml:id="id7"][preceding-sibling::*[position() = 1]]//nu[@attrib][@xml:id="id8"][not(preceding-sibling::*)]/tau[starts-with(@att,"attribut")][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[starts-with(@token,"this.nodeValue")][@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::lambda)][not(child::node())][following-sibling::alpha[@xml:lang="nb"][@xml:id="id11"]//delta[@delete][@xml:lang="no"][not(child::node())][following-sibling::upsilon[@class][@xml:lang="no"][@xml:id="id12"][following-sibling::phi[@xml:lang="en"][preceding-sibling::*[position() = 2]][following-sibling::lambda[@xml:lang="nb"][following-sibling::alpha[contains(@token,"s-is-a")][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//epsilon[starts-with(@name,"another attribute val")][@xml:id="id13"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:lang="en-GB"][@xml:id="id14"][following-sibling::epsilon[starts-with(@token,"12345")][@xml:id="id15"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <xi xml:lang="no" xml:id="id2"> @@ -3653,6 +4303,11 @@ </test> <test> <xpath>//gamma[@xml:lang="en"]/xi[contains(concat(@number,"$"),"ribute-value$")][@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)]/*[contains(concat(@object,"$"),"lank$")][@xml:id="id2"][following-sibling::psi[preceding-sibling::*[position() = 1]]//pi[not(preceding-sibling::*)][not(following-sibling::*)]/eta[@title="this.nodeValue"][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id3"][not(child::node())][following-sibling::chi[starts-with(concat(@name,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau[contains(@number,"k")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::phi[preceding-sibling::*[position() = 1]][following-sibling::*[@xml:lang="en"][@xml:id="id6"]//omicron[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::eta[@xml:id="id8"][not(following-sibling::*)]//delta[contains(@abort,"al")][not(preceding-sibling::delta or following-sibling::delta)]/*[starts-with(concat(@and,"-"),"attribute value-")][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::eta[contains(@insert,"nk")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::gamma[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/sigma[@xml:lang="en-GB"][not(child::node())][following-sibling::zeta[starts-with(concat(@src,"-"),"solid 1px green-")][@xml:lang="en"][not(following-sibling::*)]//eta[@data][@xml:lang="nb"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <gamma xml:lang="en"> <xi number="attribute-value" xml:lang="en" xml:id="id1"> @@ -3690,6 +4345,11 @@ </test> <test> <xpath>//mu[starts-with(@abort,"anothe")]/pi[@xml:id="id1"][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[following-sibling::omega[@class="_blank"][following-sibling::delta[@object][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi/zeta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@attr][@xml:lang="no-nb"][@xml:id="id2"][following-sibling::sigma[contains(concat(@string,"$"),"789$")][@xml:lang="no"]//chi[not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@and][@xml:id="id3"]//eta[not(preceding-sibling::*)][not(child::node())][following-sibling::mu[starts-with(concat(@true,"-"),"true-")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[starts-with(concat(@or,"-"),"123456789-")][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/omicron[@xml:id="id6"][following-sibling::sigma[@attr][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/*[starts-with(concat(@insert,"-"),"this.nodeValue-")][@xml:lang="en"]][position() = 1]]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <mu abort="another attribute value"> <pi xml:id="id1"/> @@ -3721,6 +4381,11 @@ </test> <test> <xpath>//omega[contains(concat(@desciption,"$"),"ute$")][@xml:lang="no"]//iota[@xml:lang="en-US"][@xml:id="id1"][following-sibling::*[position()=2]][following-sibling::psi[following-sibling::chi[starts-with(@true,"12345678")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/omega[starts-with(@attribute,"solid 1px")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::zeta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//gamma[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::sigma[contains(@att,"e")][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]//iota[starts-with(concat(@attr,"-"),"123456789-")][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <omega desciption="attribute" xml:lang="no"> <iota xml:lang="en-US" xml:id="id1"/> @@ -3743,6 +4408,11 @@ </test> <test> <xpath>//beta/mu[@desciption][@xml:lang="no"][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[starts-with(concat(@attribute,"-"),"attribute-")][not(following-sibling::*)]//beta[contains(@or,"content")][@xml:lang="en"][@xml:id="id2"]/chi[@abort][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[@attrib][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::gamma[@xml:id="id5"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <beta> <mu desciption="attribute" xml:lang="no"/> @@ -3762,6 +4432,11 @@ </test> <test> <xpath>//iota[@xml:lang="en-US"][@xml:id="id1"]/psi[contains(@data,"se")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[contains(concat(@token,"$"),"nk$")][@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]//nu[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::phi[starts-with(@and,"this-is-att-val")][not(child::node())][following-sibling::eta[contains(@attribute,"is-is-att-v")][@xml:id="id4"][not(following-sibling::*)]/nu[@xml:id="id5"][not(preceding-sibling::*)][not(preceding-sibling::nu)]//tau[not(preceding-sibling::*)][following-sibling::alpha[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[@false][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omicron[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[not(preceding-sibling::*)]//mu[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)]/zeta[@name="another attribute value"][not(preceding-sibling::*)]//delta[@insert="123456789"][not(following-sibling::*)]/iota[@xml:id="id7"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="en-US" xml:id="id1"> <psi data="false"/> @@ -3798,6 +4473,11 @@ </test> <test> <xpath>//upsilon[@xml:id="id1"]//omega[@xml:lang="en-US"]/kappa[@desciption][not(preceding-sibling::*)]//omicron[@and="100%"][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[preceding-sibling::*[position() = 1]][following-sibling::theta[@title][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/pi[@and="attribute-value"][@xml:lang="en"][@xml:id="id3"]/upsilon[@xml:lang="nb"][following-sibling::omicron[@att="true"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[@or][@xml:id="id5"][not(following-sibling::*)]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:id="id1"> <omega xml:lang="en-US"> @@ -3821,6 +4501,11 @@ </test> <test> <xpath>//zeta/gamma[@class][@xml:id="id1"][not(following-sibling::*)]/sigma[@delete][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(@and,"ute-value")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[contains(concat(@string,"$"),"attribute-value$")][@xml:lang="no-nb"][@xml:id="id3"]//epsilon[@desciption][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]/sigma[@xml:id="id5"][following-sibling::*[position()=11]][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=10]][following-sibling::omicron[@xml:lang="en-GB"][following-sibling::omicron[@content][@xml:id="id7"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::eta[@true][@xml:lang="nb"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=7]][following-sibling::tau[@xml:id="id8"][following-sibling::psi[@xml:id="id9"][not(child::node())][following-sibling::delta[contains(concat(@and,"$"),"nt$")][@xml:id="id10"][preceding-sibling::*[position() = 7]][following-sibling::*[position()=4]][following-sibling::zeta[@xml:id="id11"][following-sibling::alpha[not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 10]][following-sibling::psi[@string="false"][preceding-sibling::*[position() = 11]]][position() = 1]]]]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <zeta> <gamma class="this-is-att-value" xml:id="id1"> @@ -3851,6 +4536,11 @@ </test> <test> <xpath>//pi[@xml:id="id1"]//tau[following-sibling::*[position()=1]][following-sibling::rho[starts-with(concat(@and,"-"),"attribute-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[following-sibling::*[position()=6]][not(child::node())][following-sibling::omicron[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=4]][following-sibling::theta[@token][@xml:lang="en-GB"][following-sibling::*[position()=3]][following-sibling::alpha[contains(concat(@string,"$"),"123456789$")][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::chi[@xml:id="id4"][preceding-sibling::*[position() = 5]][following-sibling::iota//pi[@name][@xml:id="id5"][not(preceding-sibling::*)]/phi[@xml:id="id6"][not(child::node())][following-sibling::pi[@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::theta[contains(@attrib,"olid 1p")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::pi[@false][@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <pi xml:id="id1"> <tau/> @@ -3877,6 +4567,11 @@ </test> <test> <xpath>//iota[@xml:lang="no"][@xml:id="id1"]/chi[contains(@name,"0")][@xml:lang="en-GB"][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@attr][@xml:id="id2"][following-sibling::epsilon[@xml:lang="en"][@xml:id="id3"][not(following-sibling::epsilon)]/psi[starts-with(@title,"attrib")][@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@xml:lang="nb"][@xml:id="id5"][following-sibling::*[position()=1]][not(preceding-sibling::iota)][not(child::node())][following-sibling::epsilon[@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]//omicron[@src][@xml:lang="en-US"][@xml:id="id7"][following-sibling::*[position()=3]][following-sibling::upsilon[contains(@and,"fa")][@xml:id="id8"][following-sibling::sigma[@xml:lang="no"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::zeta[starts-with(concat(@and,"-"),"123456789-")][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no" xml:id="id1"> <chi name="100%" xml:lang="en-GB"/> @@ -3898,6 +4593,11 @@ </test> <test> <xpath>//lambda[@xml:lang="no-nb"][@xml:id="id1"]//rho[@xml:id="id2"][not(child::node())][following-sibling::chi[not(following-sibling::*)]/rho[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::kappa[@xml:lang="en"][following-sibling::*[@or][@xml:lang="en-GB"][@xml:id="id4"]//mu[@xml:lang="en"][@xml:id="id5"]//psi[following-sibling::pi[@number][not(following-sibling::*)]/beta[@xml:lang="en-GB"][following-sibling::*[position()=2]][following-sibling::lambda[@or][@xml:id="id6"][following-sibling::gamma[starts-with(concat(@insert,"-"),"content-")][@xml:lang="no"][@xml:id="id7"][not(following-sibling::*)]//*[@xml:lang="en-US"][@xml:id="id8"]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="no-nb" xml:id="id1"> <rho xml:id="id2"/> @@ -3924,6 +4624,11 @@ </test> <test> <xpath>//kappa[@data][@xml:lang="no"][@xml:id="id1"]//rho[contains(concat(@object,"$"),"te value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::rho)][following-sibling::phi[following-sibling::tau[@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/mu[@attribute][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::alpha[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/alpha[@xml:id="id4"][following-sibling::pi[contains(concat(@att,"$"),"lank$")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[starts-with(concat(@and,"-"),"attribute value-")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <kappa data="this.nodeValue" xml:lang="no" xml:id="id1"> <rho object="another attribute value" xml:lang="no-nb"/> @@ -3943,6 +4648,11 @@ </test> <test> <xpath>//omicron[@xml:id="id1"]/kappa[@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::gamma[@xml:id="id3"][not(following-sibling::*)]/rho[@xml:lang="nb"][not(preceding-sibling::*)]/rho[@xml:lang="en-US"]//upsilon[starts-with(@desciption,"false")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[starts-with(@delete,"123456789")][@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[@data="content"][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 2]]/beta[contains(@title,"n")][@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]/omicron[@xml:lang="no"][not(child::node())][following-sibling::gamma[@false][@xml:id="id8"]/iota[following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[contains(concat(@title,"$"),"3456789$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::epsilon[@xml:lang="en-GB"][@xml:id="id9"]/zeta[contains(@delete,"reen")]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <omicron xml:id="id1"> <kappa xml:lang="nb" xml:id="id2"/> @@ -3974,6 +4684,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]//theta[starts-with(concat(@desciption,"-"),"false-")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[starts-with(@or,"_blan")][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::theta[contains(concat(@content,"$"),"100%$")][@xml:lang="en-US"][@xml:id="id4"][not(child::node())][following-sibling::beta[starts-with(concat(@title,"-"),"false-")][@xml:lang="nb"][not(following-sibling::*)]//iota[@delete][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[starts-with(@att,"this-is-att-va")][not(preceding-sibling::*)]/iota[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@xml:lang="en"][@xml:id="id6"][not(child::node())][following-sibling::*[contains(@and,"-value")][@xml:lang="nb"]/rho[following-sibling::epsilon[@abort][@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]//epsilon[@attrib][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <phi xml:id="id1"> <theta desciption="false" xml:lang="en-US" xml:id="id2"/> @@ -4002,6 +4717,11 @@ </test> <test> <xpath>//kappa[@abort]//delta[contains(@attr,"alu")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)]//epsilon[starts-with(concat(@attribute,"-"),"_blank-")][@xml:lang="no"][not(child::node())][following-sibling::omicron[@delete][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::theta[starts-with(@and,"attribute v")][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::delta[not(child::node())][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/eta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[not(preceding-sibling::*)]/theta[not(child::node())][following-sibling::beta[starts-with(@string,"a")][@xml:lang="nb"][not(following-sibling::*)]//epsilon[contains(@att,"olid 1px gr")][@xml:id="id4"][following-sibling::delta[@or="solid 1px green"][@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[not(child::node())][following-sibling::eta[@xml:lang="nb"][not(child::node())][following-sibling::epsilon[@xml:id="id6"][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id7"][not(child::node())][following-sibling::phi[@attr="123456789"][@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::omega[@xml:lang="en-GB"]//lambda[@xml:id="id9"][not(preceding-sibling::*)]//omicron[@attr="content"][@xml:lang="no-nb"][not(child::node())][following-sibling::pi[@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@xml:id="id11"]]]]][position() = 1]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <kappa abort="another attribute value"> <delta attr="attribute-value" xml:lang="en-US" xml:id="id1"> @@ -4042,6 +4762,11 @@ </test> <test> <xpath>//*[@xml:id="id1"]/delta[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="nb"][@xml:id="id3"]//theta[@src][@xml:lang="en"][following-sibling::eta[@xml:id="id4"]/chi[@abort][@xml:id="id5"][not(child::node())][following-sibling::iota[starts-with(@false,"tru")][@xml:lang="nb"][not(following-sibling::*)]/psi[@att="solid 1px green"][@xml:lang="no-nb"]//kappa[@or][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::kappa[@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:id="id8"][not(following-sibling::*)]//kappa[starts-with(@attribute,"another a")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[starts-with(concat(@insert,"-"),"attribute-")][@xml:lang="en-GB"][not(following-sibling::*)]/*[@and][@xml:lang="no-nb"][@xml:id="id9"][not(following-sibling::*)]//omicron[@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)]/phi[@xml:id="id11"][not(child::node())][following-sibling::tau[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::pi[@xml:id="id12"][following-sibling::iota[@name="123456789"][preceding-sibling::*[position() = 3]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <any xml:id="id1"> <delta xml:lang="en-US" xml:id="id2"/> @@ -4078,6 +4803,11 @@ </test> <test> <xpath>//iota[contains(@and,"ute value")][@xml:id="id1"]/nu[contains(@and," ")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::psi[starts-with(@token,"fals")][@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::tau[not(following-sibling::*)]/gamma[starts-with(@content,"a")][@xml:lang="en-GB"]//alpha[@data][@xml:lang="en-US"][not(preceding-sibling::*)]//upsilon[contains(concat(@true,"$"),"tribute-value$")][not(following-sibling::*)]/chi[contains(@data,"alue")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@src="another attribute value"][not(following-sibling::*)]//pi[@false][@xml:lang="no"]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <iota and="another attribute value" xml:id="id1"> <nu and="another attribute value" xml:lang="no"/> @@ -4101,6 +4831,11 @@ </test> <test> <xpath>//eta/alpha[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="nb"]//iota/delta[contains(@token,"alue")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omega[@xml:id="id3"][preceding-sibling::*[position() = 1]]//theta[@xml:id="id4"][not(preceding-sibling::*)]/delta[@xml:lang="no-nb"][not(preceding-sibling::*)]//theta[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en-US"]//lambda//beta[@data][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[contains(concat(@object,"$"),"bute value$")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@and][@xml:lang="en-US"][@xml:id="id8"]//*[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[not(preceding-sibling::*)][following-sibling::*[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@or][@xml:id="id9"][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <eta> <alpha xml:lang="no-nb" xml:id="id1"/> @@ -4137,6 +4872,11 @@ </test> <test> <xpath>//delta//delta[contains(@attr,"att")][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::iota[@xml:lang="en-GB"]//mu[starts-with(@true,"this.nodeVa")][@xml:lang="en"][@xml:id="id2"][not(child::node())][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(preceding-sibling::upsilon)]//lambda[starts-with(concat(@attribute,"-"),"_blank-")][@xml:lang="en-GB"][@xml:id="id4"]//theta[@data][@xml:lang="en-GB"][following-sibling::gamma[preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]/omega[@xml:id="id5"][not(preceding-sibling::*)]//xi[@class][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[contains(@string,"this-is-a")][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@number][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//eta[not(preceding-sibling::*)][not(following-sibling::*)]//eta[@xml:id="id7"][following-sibling::omega[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::omicron[contains(concat(@src,"$"),"his.nodeValue$")][@xml:id="id9"][preceding-sibling::*[position() = 2]]//upsilon[starts-with(@name,"fals")][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::beta[@xml:lang="no"][@xml:id="id11"][not(following-sibling::*)]/alpha[@delete][@xml:id="id12"][not(preceding-sibling::*)]/pi[starts-with(@name,"a")][@xml:lang="no"][@xml:id="id13"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[contains(concat(@attribute,"$"),"blank$")]/alpha[@xml:lang="en-US"][not(preceding-sibling::*)]//alpha[@true="123456789"][@xml:lang="en-GB"][@xml:id="id14"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>1</nth> + </result> <tree> <delta> <delta attr="attribute value" xml:lang="en-GB" xml:id="id1"/> @@ -4181,6 +4921,11 @@ </test> <test> <xpath>//tau/tau[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::upsilon[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@number="attribute-value"][@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::chi[contains(@attribute,"bu")][@xml:id="id1"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:lang="no"][@xml:id="id2"]/nu[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::mu[starts-with(concat(@token,"-"),"solid 1px green-")][preceding-sibling::*[position() = 1]][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id4"][not(child::node())][following-sibling::chi[@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/upsilon[starts-with(@string,"attribute-")][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)]/alpha[@true="attribute-value"][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <tau> <tau xml:lang="no-nb"> @@ -4206,6 +4951,11 @@ </test> <test> <xpath>//alpha[starts-with(@attr,"attribute valu")][@xml:id="id1"]/psi[contains(concat(@src,"$"),"-att-value$")][@xml:lang="en"]//sigma[@xml:id="id2"][not(preceding-sibling::*)]//kappa[contains(@attrib,"attri")][@xml:id="id3"][not(preceding-sibling::*)]/alpha[@attr][@xml:id="id4"][not(following-sibling::*)]//alpha[contains(concat(@string,"$"),"89$")][@xml:lang="en-US"]//tau[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <alpha attr="attribute value" xml:id="id1"> <psi src="this-is-att-value" xml:lang="en"> @@ -4226,6 +4976,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]/rho[not(following-sibling::*)]/mu[not(preceding-sibling::*)][not(following-sibling::*)]/mu[@data="this-is-att-value"][following-sibling::alpha[@xml:lang="en-US"][following-sibling::eta[@xml:id="id2"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::chi[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/psi[contains(concat(@title,"$"),"value$")][@xml:lang="en"]//tau[contains(concat(@class,"$"),"ue$")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::alpha[not(following-sibling::*)]/tau[@xml:lang="en-GB"][@xml:id="id5"]//omicron[contains(concat(@abort,"$"),"bute value$")][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::phi[@xml:lang="en"][not(following-sibling::*)]//alpha[@xml:id="id7"]/sigma[@attribute="123456789"][@xml:lang="en"][@xml:id="id8"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>1</nth> + </result> <tree> <phi xml:id="id1"> <rho> @@ -4257,6 +5012,11 @@ </test> <test> <xpath>//sigma[contains(@false,"0%")][@xml:lang="no-nb"]/tau[@insert][@xml:id="id1"]//*[@title="false"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[contains(concat(@false,"$"),"nk$")][@xml:id="id2"][following-sibling::*[position()=3]][following-sibling::nu[@number][@xml:id="id3"][following-sibling::*[@object][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omicron[contains(@att,"nk")][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//omicron[@or][@xml:id="id5"][not(preceding-sibling::*)]//omega[contains(concat(@delete,"$"),"ue$")][not(preceding-sibling::*)]/gamma[starts-with(concat(@abort,"-"),"false-")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::sigma[@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=2]][following-sibling::alpha[@xml:id="id8"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@xml:lang="en-US"]/lambda[@data][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::lambda)][not(child::node())][following-sibling::zeta[starts-with(concat(@delete,"-"),"true-")][@xml:lang="en-GB"]/pi[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>1</nth> + </result> <tree> <sigma false="100%" xml:lang="no-nb"> <tau insert="true" xml:id="id1"> @@ -4288,6 +5048,11 @@ </test> <test> <xpath>//pi[@xml:lang="no-nb"][@xml:id="id1"]//eta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]/omega[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[starts-with(@object,"a")][@xml:lang="nb"][not(following-sibling::*)]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="no-nb" xml:id="id1"> <eta xml:lang="no-nb"/> @@ -4303,6 +5068,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="nb"]//nu[following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[contains(concat(@and,"$"),"-att-value$")][@xml:lang="en"][not(child::node())][following-sibling::beta[not(following-sibling::*)]//lambda[not(preceding-sibling::*)][not(following-sibling::*)]//mu[starts-with(@title,"false")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::rho[@name="this.nodeValue"][@xml:lang="en-GB"][@xml:id="id1"]/chi[@or="this-is-att-value"][@xml:lang="en-GB"][not(preceding-sibling::*)]/sigma[contains(concat(@att,"$"),"e$")][@xml:id="id2"][not(preceding-sibling::*)]//tau[not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@xml:id="id3"]//pi[@xml:lang="en-US"][following-sibling::sigma[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[@string][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[contains(@title,"nk")][@xml:id="id5"][following-sibling::beta[contains(concat(@desciption,"$")," value$")][@xml:id="id6"][not(preceding-sibling::beta)][not(child::node())][following-sibling::rho[@src][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::xi[contains(@number," va")][@xml:lang="nb"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::iota[not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="nb"> <nu/> @@ -4338,6 +5108,11 @@ </test> <test> <xpath>//theta[@att][@xml:lang="no"]/phi[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)]//omicron[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//xi[contains(@name,"tribut")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::xi[not(following-sibling::*)]//epsilon[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>1</nth> + </result> <tree> <theta att="false" xml:lang="no"> <phi xml:lang="en-GB" xml:id="id1"> @@ -4358,6 +5133,11 @@ </test> <test> <xpath>//xi[@abort="100%"][@xml:lang="en-GB"][@xml:id="id1"]//theta[starts-with(@src,"this-is-att-valu")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::alpha[preceding-sibling::*[position() = 1]]//phi[not(preceding-sibling::*)][following-sibling::sigma[@name][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//rho[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]/zeta[following-sibling::theta[@xml:lang="nb"][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <xi abort="100%" xml:lang="en-GB" xml:id="id1"> <theta src="this-is-att-value" xml:id="id2"/> @@ -4378,6 +5158,11 @@ </test> <test> <xpath>//xi[@xml:lang="no"]//lambda[@att][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[contains(concat(@att,"$"),"his.nodeValue$")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[contains(concat(@true,"$"),"ue$")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omega[contains(@insert,"alse")][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::xi[not(child::node())][following-sibling::pi[starts-with(@att,"solid 1px gre")][@xml:id="id4"][preceding-sibling::*[position() = 5]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <xi xml:lang="no"> <lambda att="attribute value" xml:id="id1"> @@ -4395,6 +5180,11 @@ </test> <test> <xpath>//kappa[@xml:id="id1"]/pi[contains(concat(@object,"$"),"3456789$")][@xml:id="id2"][following-sibling::zeta[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//rho[starts-with(@object,"another attribute valu")][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:id="id5"][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]][following-sibling::phi[@attribute="100%"][@xml:id="id6"][preceding-sibling::*[position() = 2]]/theta[@xml:lang="en"][following-sibling::upsilon[starts-with(concat(@delete,"-"),"this.nodeValue-")][@xml:id="id7"]/chi[@false][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[starts-with(@src,"this.nodeVal")][@xml:id="id8"][preceding-sibling::*[position() = 1]]//iota[@xml:lang="en"][@xml:id="id9"][following-sibling::chi[contains(@and,".no")][@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[starts-with(concat(@content,"-"),"this.nodeValue-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[starts-with(@object,"fal")][@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <kappa xml:id="id1"> <pi object="123456789" xml:id="id2"/> @@ -4424,6 +5214,11 @@ </test> <test> <xpath>//beta[contains(concat(@attr,"$"),"1px green$")][@xml:id="id1"]/eta[@xml:lang="en"][not(preceding-sibling::*)]/sigma[@xml:id="id2"][not(preceding-sibling::*)]//zeta[not(following-sibling::*)]/lambda[@xml:lang="no"][not(preceding-sibling::*)]/theta[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/omicron[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]//omicron[not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:lang="no"][not(following-sibling::*)]/lambda[not(following-sibling::*)]/alpha[contains(concat(@desciption,"$"),"123456789$")][@xml:lang="en-US"][@xml:id="id5"]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <beta attr="solid 1px green" xml:id="id1"> <eta xml:lang="en"> @@ -4452,6 +5247,11 @@ </test> <test> <xpath>//mu[@name][@xml:lang="no"]/phi[@xml:lang="no-nb"][not(following-sibling::*)]/theta[contains(concat(@data,"$"),"lank$")][@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]/xi[starts-with(@insert,"con")][not(following-sibling::*)]//tau[not(preceding-sibling::*)][following-sibling::beta[@attrib][not(following-sibling::*)]//gamma[contains(@title,"se")][@xml:lang="no-nb"][following-sibling::zeta[@insert="this-is-att-value"][not(child::node())][following-sibling::alpha[@xml:lang="en-US"][not(child::node())][following-sibling::zeta[@content="attribute-value"][preceding-sibling::*[position() = 3]][following-sibling::kappa[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=6]][not(child::node())][following-sibling::beta[@desciption][@xml:lang="no-nb"][not(child::node())][following-sibling::pi[@delete="_blank"][preceding-sibling::*[position() = 6]][following-sibling::*[position()=4]][not(child::node())][following-sibling::gamma[contains(@insert,"ute")][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 7]][following-sibling::*[position()=3]][not(child::node())][following-sibling::*[@true][@xml:lang="no"][@xml:id="id4"][following-sibling::pi[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 9]][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@false][@xml:lang="no"]//upsilon[@xml:id="id6"][not(preceding-sibling::*)]//psi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::rho[@attribute][@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::delta[@attribute="_blank"][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omega[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <mu name="solid 1px green" xml:lang="no"> <phi xml:lang="no-nb"> @@ -4489,6 +5289,11 @@ </test> <test> <xpath>//alpha[@xml:lang="nb"][@xml:id="id1"]/sigma[@xml:id="id2"][not(following-sibling::*)]/xi[@content="attribute"][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::pi[starts-with(concat(@content,"-"),"123456789-")][preceding-sibling::*[position() = 1]][following-sibling::lambda[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//xi[@attribute][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[contains(concat(@attr,"$"),"0%$")][not(preceding-sibling::eta)][following-sibling::kappa[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]/xi[@xml:lang="no-nb"][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::sigma[@true="attribute-value"]/sigma[@token][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[contains(@delete,"ibute-value")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@xml:id="id7"][following-sibling::epsilon[@or="attribute value"][@xml:lang="en-GB"][not(child::node())][following-sibling::theta[@delete="this-is-att-value"][@xml:id="id8"][not(following-sibling::*)]//delta[contains(concat(@true,"$"),"deValue$")][following-sibling::delta[@name="_blank"][@xml:lang="no"][following-sibling::beta[@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omega[@xml:lang="en-US"][@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::zeta[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="nb" xml:id="id1"> <sigma xml:id="id2"> @@ -4526,6 +5331,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en"][@xml:id="id1"]/rho[starts-with(@src,"f")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::epsilon[contains(concat(@title,"$"),"t$")][@xml:id="id3"][not(following-sibling::*)]//lambda[contains(concat(@token,"$"),"-value$")][not(child::node())][following-sibling::iota[starts-with(concat(@and,"-"),"attribute value-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]//kappa[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@xml:lang="no"][preceding-sibling::*[position() = 1]]//theta[starts-with(@abort,"soli")][@xml:id="id6"]//delta[@attribute="this.nodeValue"][@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en" xml:id="id1"> <rho src="false" xml:id="id2"/> @@ -4549,6 +5359,11 @@ </test> <test> <xpath>//zeta[starts-with(concat(@attrib,"-"),"this.nodeValue-")][@xml:lang="no-nb"][@xml:id="id1"]/nu[@xml:lang="nb"][following-sibling::alpha[starts-with(@attrib,"th")][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@insert][@xml:id="id3"][not(child::node())][following-sibling::gamma[@xml:lang="en-US"][not(child::node())][following-sibling::mu[@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][following-sibling::delta[preceding-sibling::*[position() = 5]][following-sibling::*[position()=2]][following-sibling::rho[@xml:lang="no"][following-sibling::pi[@false][preceding-sibling::*[position() = 7]]/*[starts-with(@insert,"tr")][not(preceding-sibling::*)][not(preceding-sibling::any)]//alpha[following-sibling::eta[following-sibling::phi[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[@xml:lang="nb"]/beta[@xml:lang="en-GB"]/lambda[@name="this-is-att-value"][not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id5"]/alpha[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[contains(concat(@desciption,"$"),"%$")][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::eta[contains(@or,"nk")][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:id="id9"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::delta[@xml:lang="no"][@xml:id="id10"][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id11"][preceding-sibling::*[position() = 4]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <zeta attrib="this.nodeValue" xml:lang="no-nb" xml:id="id1"> <nu xml:lang="nb"/> @@ -4586,6 +5401,11 @@ </test> <test> <xpath>//upsilon[@name="123456789"]//theta[@xml:lang="no"][not(following-sibling::*)]//nu[contains(concat(@attrib,"$"),"te$")][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::chi[starts-with(@object,"false")][not(following-sibling::*)]/pi[@xml:lang="no"][not(following-sibling::*)]/rho[starts-with(concat(@false,"-"),"attribute-")][@xml:id="id2"][not(child::node())][following-sibling::lambda[preceding-sibling::*[position() = 1]]/alpha[contains(concat(@string,"$"),"false$")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@true][@xml:id="id3"][not(preceding-sibling::*)]//iota[starts-with(@src,"1234567")][@xml:lang="no-nb"][not(preceding-sibling::*)]/upsilon[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[@or="attribute value"][not(following-sibling::*)]/gamma[contains(concat(@or,"$"),"reen$")][@xml:id="id5"][not(preceding-sibling::*)]//rho[@attr="another attribute value"]//phi[@xml:id="id6"][following-sibling::chi[starts-with(@title,"1234567")][preceding-sibling::*[position() = 1]]//xi[not(child::node())][following-sibling::pi[starts-with(concat(@number,"-"),"solid 1px green-")][@xml:id="id7"]/theta[@xml:lang="en-GB"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="no"][@xml:id="id8"][not(following-sibling::*)]/iota[@attribute="attribute value"][@xml:lang="en-US"][@xml:id="id9"][not(following-sibling::*)]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <upsilon name="123456789"> <theta xml:lang="no"> @@ -4631,6 +5451,11 @@ </test> <test> <xpath>//phi//kappa[@object][@xml:lang="en-US"][@xml:id="id1"]/theta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::iota[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[contains(@attrib,"k")][@xml:lang="en-GB"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[starts-with(concat(@name,"-"),"100%-")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/epsilon[starts-with(@true,"attribute-va")][not(following-sibling::*)]/mu[@xml:lang="en"][@xml:id="id4"][not(child::node())][following-sibling::beta[@false][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::tau[not(following-sibling::*)]/nu[@attribute][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::lambda[@number][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::mu[contains(@true,"cont")][@xml:lang="en-GB"][@xml:id="id5"][not(child::node())][following-sibling::delta[contains(@title,"value")][@xml:lang="en-US"]/omega[@content][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[starts-with(@attrib,"t")][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(preceding-sibling::theta or following-sibling::theta)]//rho//sigma[@xml:id="id7"][not(preceding-sibling::*)][position() = 1]]]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <phi> <kappa object="this-is-att-value" xml:lang="en-US" xml:id="id1"> @@ -4665,6 +5490,11 @@ </test> <test> <xpath>//alpha[starts-with(concat(@class,"-"),"content-")][@xml:lang="nb"][@xml:id="id1"]/*[@src="123456789"][following-sibling::omega[contains(@string,"blank")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[@false][not(child::node())][following-sibling::zeta[starts-with(concat(@desciption,"-"),"solid 1px green-")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[starts-with(concat(@token,"-"),"100%-")][@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]//pi[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[contains(concat(@object,"$")," attribute value$")][following-sibling::gamma[contains(@attr,"nt")][@xml:id="id6"][not(following-sibling::*)]//beta[@xml:id="id7"][not(following-sibling::*)]/alpha[starts-with(concat(@true,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id8"]/iota[@xml:lang="nb"][not(child::node())][following-sibling::omega[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[@att="attribute value"][@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[starts-with(@insert,"thi")][@xml:lang="no"][@xml:id="id11"][not(preceding-sibling::*)]/chi[@xml:lang="no-nb"][@xml:id="id12"][not(following-sibling::*)]/psi[starts-with(@object,"an")][@xml:lang="en-US"][not(child::node())][following-sibling::upsilon[@xml:id="id13"][preceding-sibling::*[position() = 1]][following-sibling::pi[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//delta[@xml:lang="en-GB"][@xml:id="id14"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <alpha class="content" xml:lang="nb" xml:id="id1"> <any src="123456789"/> @@ -4705,6 +5535,11 @@ </test> <test> <xpath>//omega[@xml:lang="en"]//gamma[@data][not(preceding-sibling::*)]//pi[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::mu[starts-with(concat(@att,"-"),"attribute value-")][@xml:lang="no"][following-sibling::chi[@attr][@xml:lang="no-nb"]/epsilon[@and="attribute-value"][@xml:lang="en"][following-sibling::upsilon[starts-with(concat(@token,"-"),"123456789-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[contains(@desciption,"%")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::xi[not(child::node())][following-sibling::eta[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::omega[@xml:id="id3"][not(child::node())][following-sibling::phi[@xml:id="id4"][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::pi[@xml:id="id5"][preceding-sibling::*[position() = 6]][following-sibling::mu[@xml:id="id6"][preceding-sibling::*[position() = 7]][following-sibling::omega[contains(@false,"this")][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 8]][following-sibling::*[position()=1]][following-sibling::beta[not(following-sibling::*)]/alpha[@xml:lang="en"][not(preceding-sibling::*)]//rho[@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[contains(@attribute,"bute")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="nb"][@xml:id="id9"][following-sibling::delta[not(child::node())][following-sibling::zeta[@xml:lang="no"][not(following-sibling::*)]/iota[@xml:id="id10"][not(following-sibling::*)]]][position() = 1]]]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en"> <gamma data="this-is-att-value"> @@ -4744,6 +5579,11 @@ </test> <test> <xpath>//*[contains(concat(@name,"$"),"ue$")][@xml:lang="en-US"]//kappa[starts-with(@desciption,"10")][@xml:id="id1"][following-sibling::omicron[contains(concat(@att,"$"),"er attribute value$")][@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]/rho[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@title="content"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@xml:lang="no"]//alpha[following-sibling::chi[@attr][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::chi[position()=1]][not(child::node())][following-sibling::rho[following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 3]][following-sibling::mu[@insert="attribute-value"][@xml:id="id6"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//lambda[@content="123456789"][@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::*[contains(concat(@or,"$"),"nk$")][@xml:lang="en-GB"][@xml:id="id7"]/eta[@xml:lang="en-US"]/zeta[contains(@content,"attribu")][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::tau[starts-with(@false,"this.nodeVa")][@xml:id="id9"][following-sibling::chi[contains(@att," valu")][@xml:id="id10"][following-sibling::*[position()=1]][following-sibling::xi[contains(concat(@false,"$"),"ibute$")][@xml:lang="en-US"][@xml:id="id11"][not(following-sibling::*)]//omega[starts-with(concat(@and,"-"),"100%-")][@xml:lang="nb"][@xml:id="id12"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <any name="true" xml:lang="en-US"> <kappa desciption="100%" xml:id="id1"/> @@ -4782,6 +5622,11 @@ </test> <test> <xpath>//nu/kappa[@xml:id="id1"]//phi[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[contains(@attribute,"id 1p")][@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[starts-with(concat(@and,"-"),"another attribute value-")][@xml:id="id4"][not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[@desciption][following-sibling::gamma[@false][@xml:id="id6"][following-sibling::xi[@true="this-is-att-value"][@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]]/mu[starts-with(concat(@name,"-"),"this-")][@xml:lang="nb"][@xml:id="id8"][not(child::node())][following-sibling::lambda[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//eta[starts-with(@desciption,"so")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::alpha[contains(concat(@content,"$"),"alue$")][@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::*[following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[contains(concat(@token,"$"),"ue$")][preceding-sibling::*[position() = 4]][following-sibling::phi[@xml:lang="en-US"][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <nu> <kappa xml:id="id1"> @@ -4814,6 +5659,11 @@ </test> <test> <xpath>//theta[@xml:lang="no"]//chi[contains(concat(@title,"$"),"lue$")][@xml:id="id1"]/phi[not(child::node())][following-sibling::eta[@xml:id="id2"][preceding-sibling::*[position() = 1]]/kappa[starts-with(concat(@src,"-"),"100%-")][@xml:lang="en"][@xml:id="id3"][following-sibling::psi[contains(concat(@true,"$"),"content$")][@xml:lang="en-US"][@xml:id="id4"]/sigma[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[@abort="this.nodeValue"][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]/psi[@class][@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)]/nu[@delete][following-sibling::kappa[@xml:lang="en-GB"]//xi[starts-with(@insert,"attri")][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::tau[starts-with(concat(@class,"-"),"content-")][@xml:id="id7"][not(preceding-sibling::tau)]/nu[@or="false"][@xml:id="id8"]/theta[@xml:lang="no"][@xml:id="id9"][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[starts-with(concat(@and,"-"),"this-")][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="no"> <chi title="this.nodeValue" xml:id="id1"> @@ -4849,6 +5699,11 @@ </test> <test> <xpath>//phi[contains(concat(@or,"$"),"deValue$")][@xml:lang="en-GB"][@xml:id="id1"]/gamma[not(following-sibling::*)]/pi[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@number="false"][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[@src][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::rho[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@object][@xml:id="id6"][not(following-sibling::*)]//tau[not(preceding-sibling::*)][following-sibling::iota[@xml:lang="no-nb"][following-sibling::mu[@attrib="attribute value"][@xml:lang="en"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <phi or="this.nodeValue" xml:lang="en-GB" xml:id="id1"> <gamma> @@ -4873,6 +5728,11 @@ </test> <test> <xpath>//rho/theta[starts-with(@name,"cont")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[@content="attribute-value"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[starts-with(concat(@number,"-"),"_blank-")][@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@xml:lang="no-nb"][not(following-sibling::*)]//omicron[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::nu[contains(concat(@att,"$"),"100%$")][@xml:lang="en"][not(following-sibling::*)]/sigma[contains(@attribute,"e")][@xml:lang="en-GB"][not(preceding-sibling::*)]//sigma[contains(@object,"s")]/omega[@xml:lang="nb"][@xml:id="id3"]//omega[@token][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::upsilon[contains(@class,"s-att-value")][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[starts-with(@abort,"attri")][@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::theta[following-sibling::nu[@insert="attribute-value"]//rho[starts-with(concat(@content,"-"),"true-")][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[following-sibling::omicron[@class][@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 2]]/chi[starts-with(concat(@false,"-"),"attribute-")][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@xml:lang="no-nb"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@abort][@xml:lang="en-GB"][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <rho> <theta name="content" xml:lang="en-GB"/> @@ -4917,6 +5777,11 @@ </test> <test> <xpath>//mu[starts-with(concat(@insert,"-"),"attribute value-")][@xml:lang="no"]//zeta[not(child::node())][following-sibling::theta[@xml:lang="en"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::pi[starts-with(@string,"fal")][@xml:id="id2"][preceding-sibling::*[position() = 2]]/sigma[contains(@class,"ank")][following-sibling::*[position()=5]][not(child::node())][following-sibling::xi[@att="_blank"][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::tau[@false][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(child::node())][following-sibling::chi[contains(@and,"bute-value")][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::gamma[preceding-sibling::*[position() = 4]][following-sibling::iota[@xml:id="id5"][not(following-sibling::*)]//eta[@insert="_blank"][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::nu[starts-with(concat(@title,"-"),"true-")][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::phi[@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::eta[starts-with(concat(@att,"-"),"_blank-")][@xml:lang="en-US"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::alpha//omicron[not(preceding-sibling::*)]//omega[@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@title="_blank"][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[@name][@xml:lang="no"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]]]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <mu insert="attribute value" xml:lang="no"> <zeta/> @@ -4950,6 +5815,11 @@ </test> <test> <xpath>//upsilon[@attrib="123456789"][@xml:lang="no"]//alpha[@xml:lang="en"][following-sibling::delta[@attrib][@xml:lang="no-nb"][not(child::node())][following-sibling::lambda[starts-with(@attrib,"1")][@xml:lang="nb"][not(child::node())][following-sibling::eta[starts-with(@content,"attr")][@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 3]]/mu[@xml:id="id2"]/pi[@and][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@xml:lang="no"]/chi[@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[starts-with(@false,"false")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[starts-with(@abort,"10")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <upsilon attrib="123456789" xml:lang="no"> <alpha xml:lang="en"/> @@ -4977,6 +5847,11 @@ </test> <test> <xpath>//sigma[@token][@xml:id="id1"]//rho[@xml:id="id2"][not(preceding-sibling::*)]//theta[starts-with(concat(@number,"-"),"false-")][not(child::node())][following-sibling::alpha[@number="attribute-value"][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//psi[@title][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)]//delta[starts-with(@insert,"fal")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::theta[@xml:lang="en-GB"][following-sibling::*[position()=4]][not(child::node())][following-sibling::rho[starts-with(concat(@number,"-"),"another attribute value-")][not(child::node())][following-sibling::psi[@delete="false"][@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::psi[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::pi[@attrib]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <sigma token="another attribute value" xml:id="id1"> <rho xml:id="id2"> @@ -4999,6 +5874,11 @@ </test> <test> <xpath>//omega[@xml:lang="nb"]/chi[contains(concat(@true,"$"),"e$")][@xml:id="id1"]/xi[starts-with(@content,"1")][@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@xml:lang="en-GB"][not(child::node())][following-sibling::omicron[@xml:lang="no-nb"][@xml:id="id3"]/pi[@src][@xml:lang="nb"]/phi[not(preceding-sibling::*)][following-sibling::eta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[@content][@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]//theta[@abort][@xml:id="id5"][following-sibling::psi[@att][@xml:lang="nb"][@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@xml:id="id7"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="nb"> <chi true="false" xml:id="id1"> @@ -5026,6 +5906,11 @@ </test> <test> <xpath>//eta[@xml:lang="en-GB"]//alpha//phi[@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)]/upsilon[@attribute][@xml:lang="no"][not(following-sibling::*)][not(following-sibling::upsilon)]//chi[following-sibling::*[position()=2]][following-sibling::upsilon[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@title="solid 1px green"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/omicron[starts-with(@or,"fa")][not(child::node())][following-sibling::lambda[contains(concat(@token,"$"),"green$")][@xml:id="id3"][not(following-sibling::*)]/gamma[@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::omega[starts-with(@attrib,"a")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id6"][following-sibling::kappa[following-sibling::phi[contains(concat(@attribute,"$"),"k$")][@xml:lang="no-nb"][@xml:id="id7"][not(child::node())][following-sibling::iota[starts-with(concat(@delete,"-"),"100%-")][@xml:id="id8"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::*[@xml:lang="no-nb"][not(following-sibling::*)]//alpha[contains(concat(@number,"$"),"ibute-value$")]//omega[contains(@desciption,"0%")][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:id="id9"][not(following-sibling::*)]//xi[@xml:lang="en"][not(preceding-sibling::*)]/beta[@xml:lang="en-GB"][not(preceding-sibling::*)]/upsilon[@xml:id="id10"][not(following-sibling::*)]]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="en-GB"> <alpha> @@ -5068,6 +5953,11 @@ </test> <test> <xpath>//iota[contains(concat(@attribute,"$"),"ue$")]//chi[contains(concat(@object,"$"),"blank$")][@xml:id="id1"][not(preceding-sibling::*)]//delta[@xml:id="id2"]/iota[@title="123456789"][@xml:id="id3"]/beta[@xml:id="id4"][not(child::node())][following-sibling::rho[contains(@string,"sol")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::mu[@true][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[contains(concat(@and,"$"),"ibute-value$")]/rho[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::tau[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="no"][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <iota attribute="true"> <chi object="_blank" xml:id="id1"> @@ -5091,6 +5981,11 @@ </test> <test> <xpath>//omega[@name="false"][@xml:lang="no"][@xml:id="id1"]/lambda[@xml:id="id2"][not(preceding-sibling::lambda or following-sibling::lambda)]/xi[following-sibling::*[position()=1]][following-sibling::mu[@attr][@xml:lang="en-GB"][@xml:id="id3"]//sigma[contains(@number,"n")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[starts-with(concat(@src,"-"),"solid 1px green-")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:lang="en-US"][not(preceding-sibling::*)]//omicron[@xml:lang="nb"][not(following-sibling::*)]//pi[contains(@false,"green")][@xml:lang="en-GB"][@xml:id="id6"]//*[starts-with(@or,"c")][not(preceding-sibling::*)][following-sibling::pi[@xml:lang="no"][preceding-sibling::*[position() = 1]]//lambda[@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@attr="this.nodeValue"][@xml:lang="en-GB"]//xi[not(preceding-sibling::*)]//alpha[starts-with(concat(@class,"-"),"123456789-")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[not(following-sibling::*)]//beta[@xml:lang="en-US"][not(preceding-sibling::beta)]/nu[@xml:lang="en-US"][not(child::node())][following-sibling::nu[@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:id="id9"]//zeta[@xml:lang="no-nb"][not(parent::*/*[position()=2])]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <omega name="false" xml:lang="no" xml:id="id1"> <lambda xml:id="id2"> @@ -5135,6 +6030,11 @@ </test> <test> <xpath>//phi[starts-with(concat(@class,"-"),"true-")][@xml:id="id1"]//beta[@xml:lang="no-nb"][@xml:id="id2"][not(child::node())][following-sibling::theta[@delete][following-sibling::rho[@title][@xml:id="id3"][not(following-sibling::*)]//iota[starts-with(concat(@title,"-"),"_blank-")][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[contains(concat(@data,"$"),"s-is-att-value$")][@xml:lang="no"][preceding-sibling::*[position() = 1]]//epsilon[contains(concat(@content,"$"),"lue$")][@xml:lang="en-GB"][@xml:id="id4"]//delta[starts-with(@desciption,"_blan")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::lambda[@and][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::mu[starts-with(concat(@data,"-"),"attribute-")][following-sibling::rho[contains(concat(@true,"$"),"ute value$")][@xml:id="id7"][following-sibling::psi[@desciption][@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]/tau[@attrib][@xml:lang="en-US"][not(child::node())][following-sibling::omicron[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[@xml:id="id9"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 3]][following-sibling::nu[preceding-sibling::*[position() = 4]][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <phi class="true" xml:id="id1"> <beta xml:lang="no-nb" xml:id="id2"/> @@ -5164,6 +6064,11 @@ </test> <test> <xpath>//nu[contains(concat(@or,"$"),"89$")]/iota[@desciption][@xml:lang="no"][@xml:id="id1"][not(child::node())][following-sibling::delta[contains(@attrib,"Value")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="en-US"]/gamma[not(preceding-sibling::*)][not(following-sibling::*)]//xi[@and][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::rho[contains(@attr,"%")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[contains(@class," val")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@delete][@xml:id="id3"][preceding-sibling::*[position() = 1]]//epsilon[contains(@true,"ue")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::tau[@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::gamma[@xml:lang="no-nb"][not(following-sibling::*)]//psi[starts-with(concat(@string,"-"),"another attribute value-")][@xml:lang="no"][not(preceding-sibling::*)]/pi[@att][@xml:lang="en-US"][not(preceding-sibling::*)]/chi[starts-with(concat(@object,"-"),"false-")][not(preceding-sibling::*)][following-sibling::omicron[@false="100%"][@xml:lang="no"][@xml:id="id6"][following-sibling::xi[@xml:id="id7"][following-sibling::lambda[not(following-sibling::*)]//*[not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:lang="en-US"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <nu or="123456789"> <iota desciption="solid 1px green" xml:lang="no" xml:id="id1"/> @@ -5202,6 +6107,11 @@ </test> <test> <xpath>//iota[@xml:lang="no"]/psi[@attr][@xml:id="id1"][following-sibling::*[position()=2]][following-sibling::eta[@delete][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::xi[@object][not(following-sibling::*)]/pi[@att][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[@abort][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no"> <psi attr="attribute" xml:id="id1"/> @@ -5217,6 +6127,11 @@ </test> <test> <xpath>//upsilon//alpha[@content][@xml:id="id1"]//epsilon[contains(@attribute,"tent")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[@false="attribute value"][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::kappa[@attribute][@xml:lang="no"][not(following-sibling::*)]/xi[starts-with(concat(@true,"-"),"content-")][@xml:lang="no-nb"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:lang="en"][preceding-sibling::*[position() = 1]]//xi[@xml:id="id3"][not(following-sibling::*)]//lambda[starts-with(@attr,"another attribute valu")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]//gamma[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)]/rho[starts-with(concat(@src,"-"),"_blank-")][not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id6"]//omicron[@xml:lang="en-US"]/nu[@attribute][@xml:id="id7"][not(following-sibling::*)]//epsilon[contains(@src,"value")][@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::sigma[@desciption="123456789"][not(child::node())][following-sibling::chi[starts-with(@attribute,"attribute-value")][@xml:lang="en-US"]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <upsilon> <alpha content="solid 1px green" xml:id="id1"> @@ -5252,6 +6167,11 @@ </test> <test> <xpath>//beta[starts-with(@attrib,"f")][@xml:lang="no-nb"]//alpha[@data][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[starts-with(concat(@string,"-"),"solid 1px green-")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[starts-with(concat(@or,"-"),"attribute value-")][@xml:id="id2"]/theta[@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="nb"][@xml:id="id4"]/pi[@xml:lang="en"][@xml:id="id5"][not(following-sibling::*)]/alpha[starts-with(@string,"_")][@xml:lang="nb"][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::pi[@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[contains(@object,"lank")][not(following-sibling::*)]//zeta[contains(concat(@attribute,"$"),"ue$")][@xml:id="id8"][not(preceding-sibling::*)]/rho[starts-with(concat(@false,"-"),"content-")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="nb"][@xml:id="id9"]//mu[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@class][@xml:lang="no"]//omega[@xml:lang="nb"][not(child::node())][following-sibling::pi[@xml:id="id10"][not(child::node())][following-sibling::beta[starts-with(concat(@and,"-"),"100%-")][@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::omega[@xml:lang="en"][preceding-sibling::*[position() = 3]]/chi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::psi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@string="123456789"][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <beta attrib="false" xml:lang="no-nb"> <alpha data="false" xml:id="id1"> @@ -5292,6 +6212,11 @@ </test> <test> <xpath>//epsilon[starts-with(concat(@false,"-"),"100%-")]/kappa[@xml:id="id1"][following-sibling::mu[@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 3]][not(following-sibling::*)]/alpha[not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::alpha or following-sibling::alpha)]/*[@xml:lang="en"][following-sibling::omega[starts-with(concat(@att,"-"),"100%-")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@attrib="attribute-value"][@xml:id="id3"][not(child::node())][following-sibling::iota[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::psi[starts-with(@att,"soli")][@xml:id="id4"][preceding-sibling::*[position() = 2]]/xi[@xml:id="id5"]//*[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::sigma[not(child::node())][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]]//tau[contains(@title,"is.nodeValue")][@xml:lang="en-GB"][not(preceding-sibling::*)]/pi[@xml:lang="no"][following-sibling::tau[@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[@xml:lang="no"]//alpha[not(following-sibling::*)]//epsilon[contains(@number,"e")]//tau[starts-with(concat(@token,"-"),"this-")][@xml:id="id9"][not(preceding-sibling::*)]/kappa[starts-with(concat(@name,"-"),"100%-")][not(preceding-sibling::*)][not(following-sibling::*)]]]][position() = 1]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <epsilon false="100%"> <kappa xml:id="id1"/> @@ -5334,6 +6259,11 @@ </test> <test> <xpath>//kappa[contains(@object,"ttrib")]//tau[@abort][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[contains(concat(@content,"$"),"een$")][following-sibling::mu[@object][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::iota[@xml:lang="en-US"]//psi[starts-with(@content,"123456")][@xml:id="id2"][not(preceding-sibling::*)]/omicron[@string][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]/chi[@content="_blank"][@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::gamma[@or="this.nodeValue"][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(following-sibling::gamma)][not(child::node())][following-sibling::mu[@name][@xml:lang="en-US"][@xml:id="id6"][not(child::node())][following-sibling::eta[@xml:id="id7"][not(following-sibling::*)]/phi][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>1</nth> + </result> <tree> <kappa object="attribute"> <tau abort="123456789" xml:id="id1"> @@ -5360,6 +6290,11 @@ </test> <test> <xpath>//beta[@attr="this.nodeValue"][@xml:lang="no-nb"]/theta[starts-with(@title,"100")]/omicron[@abort="true"][@xml:lang="en-GB"][not(child::node())][following-sibling::phi[@xml:id="id1"]/chi[contains(@attr,"u")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//sigma[@string="this-is-att-value"][not(following-sibling::*)]//epsilon[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[@name="content"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[starts-with(@string,"attribute")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)]//chi[@xml:lang="en-GB"][@xml:id="id7"][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <beta attr="this.nodeValue" xml:lang="no-nb"> <theta title="100%"> @@ -5386,6 +6321,11 @@ </test> <test> <xpath>//omicron/zeta[@xml:lang="en-US"][not(preceding-sibling::*)]/*[not(preceding-sibling::*)][not(following-sibling::*)]/mu[starts-with(concat(@false,"-"),"false-")][@xml:lang="nb"][not(following-sibling::*)]/beta[contains(concat(@and,"$"),"100%$")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@desciption][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[contains(@token,"nten")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::pi[contains(@token,"olid 1px ")][@xml:id="id3"][following-sibling::alpha[@name="this-is-att-value"][not(following-sibling::*)]//psi[@xml:lang="nb"][@xml:id="id4"]//epsilon[not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="no"][following-sibling::epsilon[@xml:lang="en"][@xml:id="id5"][following-sibling::epsilon[@object][@xml:lang="no-nb"][not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omicron> <zeta xml:lang="en-US"> @@ -5417,6 +6357,11 @@ </test> <test> <xpath>//psi[@number][@xml:lang="en"]/xi[contains(@name,"id ")]/omega[starts-with(concat(@insert,"-"),"123456789-")][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@src][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::gamma[@xml:lang="no"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][following-sibling::mu[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::sigma[@attrib="_blank"][@xml:id="id3"][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <psi number="solid 1px green" xml:lang="en"> <xi name="solid 1px green"> @@ -5434,6 +6379,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]//beta[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]//lambda[not(preceding-sibling::*)][not(following-sibling::*)]/omicron[contains(concat(@desciption,"$"),"e$")][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//xi[@xml:lang="en-GB"]/nu[contains(concat(@abort,"$"),"e$")][@xml:id="id4"][not(following-sibling::*)]/nu[starts-with(@string,"this.n")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][following-sibling::omicron[preceding-sibling::*[position() = 2]]/gamma[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@class][@xml:lang="en-US"][@xml:id="id6"][following-sibling::*[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]//xi[@xml:id="id9"][not(preceding-sibling::*)]//omega[@name="_blank"][@xml:lang="no-nb"][@xml:id="id10"][not(following-sibling::*)]//pi[starts-with(@and,"solid 1px g")][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>1</nth> + </result> <tree> <mu xml:id="id1"> <beta xml:lang="en-US" xml:id="id2"> @@ -5468,6 +6418,11 @@ </test> <test> <xpath>//rho[contains(concat(@desciption,"$"),"tribute value$")][@xml:lang="nb"]/alpha[contains(concat(@string,"$"),"e$")][@xml:lang="nb"][@xml:id="id1"][following-sibling::lambda[@name][@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::eta[@insert][@xml:id="id3"]/theta[@xml:id="id4"]//chi[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::eta[@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@xml:lang="nb"][not(following-sibling::*)]//zeta[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:id="id8"][not(following-sibling::*)]//psi[@xml:lang="nb"][@xml:id="id9"][following-sibling::omega[@false="attribute"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(@data,"e")][@xml:lang="no"][preceding-sibling::*[position() = 2]][following-sibling::phi[@number="another attribute value"][@xml:lang="en-US"][@xml:id="id10"][following-sibling::beta[@token][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::chi[@false][@xml:id="id11"][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <rho desciption="attribute value" xml:lang="nb"> <alpha string="attribute-value" xml:lang="nb" xml:id="id1"/> @@ -5497,6 +6452,11 @@ </test> <test> <xpath>//alpha[@xml:lang="en-GB"]/lambda[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::iota[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[@attr][@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]//eta[starts-with(concat(@desciption,"-"),"this-")][@xml:lang="no"][not(child::node())][following-sibling::*[@or="another attribute value"][not(child::node())][following-sibling::beta[contains(concat(@object,"$"),"other attribute value$")][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[starts-with(@string,"thi")][@xml:lang="nb"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::omicron[@attr][not(following-sibling::*)]/theta[@att][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::chi[@xml:lang="nb"][not(following-sibling::*)]//beta[not(preceding-sibling::*)]/nu[@or][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[starts-with(@delete,"conten")][not(preceding-sibling::iota)][not(child::node())][following-sibling::lambda[contains(concat(@attrib,"$"),"9$")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/phi[@xml:id="id7"][not(preceding-sibling::*)]/lambda[starts-with(@attrib,"conten")]/zeta[@xml:lang="en"]//lambda[starts-with(@content,"at")][@xml:lang="en-US"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="en-GB"> <lambda xml:lang="en" xml:id="id1"/> @@ -5535,6 +6495,11 @@ </test> <test> <xpath>//omicron/chi[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@src][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::beta[starts-with(concat(@false,"-"),"this-")][preceding-sibling::*[position() = 2]]/phi[@string][@xml:id="id3"]//beta[contains(concat(@name,"$"),"r attribute value$")][@xml:lang="no-nb"][not(preceding-sibling::*)]//gamma[@att][following-sibling::beta[not(following-sibling::*)]//*[@number][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[contains(@class,"r")]/rho[@xml:id="id4"][not(child::node())][following-sibling::sigma[@insert][@xml:id="id5"][preceding-sibling::*[position() = 1]]/gamma[@xml:lang="nb"][@xml:id="id6"][not(child::node())][following-sibling::iota[@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[starts-with(@name,"100%")][not(following-sibling::*)]//epsilon[@xml:lang="no-nb"][not(preceding-sibling::*)]/theta[@xml:lang="nb"][not(child::node())][following-sibling::zeta[contains(@false,"bu")][@xml:id="id8"][not(following-sibling::*)]/nu[following-sibling::epsilon[starts-with(@attribute,"tr")]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <omicron> <chi xml:id="id1"/> @@ -5572,6 +6537,11 @@ </test> <test> <xpath>//beta[@xml:id="id1"]/upsilon[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[@xml:id="id3"][following-sibling::chi[not(following-sibling::*)]/sigma[starts-with(@content,"12345678")][@xml:lang="en-GB"][@xml:id="id4"][following-sibling::lambda[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id6"][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]]/eta[following-sibling::omicron[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::eta[@insert="solid 1px green"][@xml:lang="no"][@xml:id="id7"][following-sibling::theta[@xml:id="id8"][preceding-sibling::*[position() = 4]]//zeta[@delete][not(preceding-sibling::*)][following-sibling::alpha[contains(@data,"ue")][not(child::node())][following-sibling::alpha[@xml:lang="no-nb"][not(following-sibling::*)]/kappa[@attr][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[starts-with(@token,"attr")][following-sibling::xi[@insert][@xml:lang="nb"][@xml:id="id9"][following-sibling::phi//alpha[starts-with(concat(@token,"-"),"content-")][@xml:lang="no"][@xml:id="id10"][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id11"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]]]]][position() = 1]][position() = 1]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <beta xml:id="id1"> <upsilon xml:lang="no" xml:id="id2"/> @@ -5608,6 +6578,11 @@ </test> <test> <xpath>//mu[@insert][@xml:lang="nb"]/chi[@title][@xml:id="id1"][not(preceding-sibling::*)]/sigma[@false][not(preceding-sibling::*)][not(following-sibling::*)]/chi[contains(@desciption,"1")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:lang="en"][not(following-sibling::*)]/beta[@attrib][not(following-sibling::*)]/epsilon[@xml:lang="no"][not(child::node())][following-sibling::mu[@xml:id="id3"]/rho[@xml:lang="no"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@title="attribute value"][not(following-sibling::*)]//theta[starts-with(concat(@token,"-"),"another attribute value-")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@attr="another attribute value"][@xml:lang="no"][not(preceding-sibling::*)]//omega[starts-with(@object,"another attribute value")][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)]//tau[not(preceding-sibling::*)][not(child::node())][following-sibling::iota[starts-with(@name,"attri")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 2]][following-sibling::beta[@xml:id="id7"][not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id8"][not(child::node())][following-sibling::gamma[@xml:id="id9"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//xi[following-sibling::lambda[contains(concat(@true,"$"),"n$")][@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <mu insert="_blank" xml:lang="nb"> <chi title="attribute" xml:id="id1"> @@ -5650,6 +6625,11 @@ </test> <test> <xpath>//sigma[starts-with(concat(@src,"-"),"attribute-")]//zeta[@true][@xml:id="id1"][not(child::node())][following-sibling::psi[@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[contains(concat(@number,"$"),"s.nodeValue$")][@xml:id="id3"][preceding-sibling::*[position() = 2]]//mu[not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:lang="nb"][following-sibling::iota[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[@false="content"][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau[@xml:lang="en"][following-sibling::upsilon[@number="false"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]//pi[@xml:lang="nb"][@xml:id="id5"][following-sibling::*[position()=2]][following-sibling::epsilon[@delete="true"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::eta[@src="false"][@xml:lang="no-nb"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <sigma src="attribute"> <zeta true="attribute" xml:id="id1"/> @@ -5676,6 +6656,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en-US"][@xml:id="id1"]//lambda[starts-with(@class,"att")][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 2]][following-sibling::alpha[@delete][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::iota[@xml:lang="en"][not(child::node())][following-sibling::chi[starts-with(concat(@or,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 5]][following-sibling::mu[@insert][@xml:id="id5"][preceding-sibling::*[position() = 6]]/nu[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::rho[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[starts-with(concat(@src,"-"),"100%-")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omicron[@insert="false"][@xml:id="id8"][following-sibling::iota[@xml:lang="no"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::iota)]]]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en-US" xml:id="id1"> <lambda class="attribute value"/> @@ -5699,6 +6684,11 @@ </test> <test> <xpath>//epsilon[@xml:id="id1"]//alpha[contains(concat(@string,"$"),"ttribute$")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:id="id3"]/phi[@xml:lang="no"][following-sibling::*[position()=4]][not(child::node())][following-sibling::beta[@xml:id="id4"][not(child::node())][following-sibling::phi[following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::omega[@xml:lang="en-GB"][not(following-sibling::*)]/pi[starts-with(@or,"_bl")][@xml:id="id6"][not(following-sibling::*)]//pi[contains(@title,"rue")][not(preceding-sibling::*)]/eta[@xml:lang="en-GB"][@xml:id="id7"]/omega[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[not(following-sibling::*)]/lambda[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[starts-with(concat(@src,"-"),"true-")][@xml:lang="no-nb"][@xml:id="id10"][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[contains(@attrib,"t")][@xml:id="id11"][not(following-sibling::*)]//theta[@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:id="id1"> <alpha string="attribute" xml:id="id2"/> @@ -5733,6 +6723,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]//mu[@object][@xml:lang="en"][not(following-sibling::*)]/mu[@xml:lang="en"][not(following-sibling::*)]/sigma[@xml:lang="no"][not(preceding-sibling::*)]//kappa[@desciption][@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::xi[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::alpha[contains(concat(@and,"$"),"lank$")][@xml:id="id4"]/theta[contains(concat(@true,"$"),"ribute$")][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]//chi[@string="attribute-value"][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=5]][following-sibling::psi[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::tau[@xml:lang="no-nb"][following-sibling::beta[starts-with(concat(@src,"-"),"false-")][@xml:lang="no-nb"][@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::lambda[@xml:id="id9"][preceding-sibling::*[position() = 5]][not(following-sibling::*)][not(preceding-sibling::lambda)]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi xml:id="id1"> <mu object="attribute value" xml:lang="en"> @@ -5760,6 +6755,11 @@ </test> <test> <xpath>//rho[@title="true"][@xml:lang="nb"][@xml:id="id1"]//phi[contains(concat(@false,"$"),"-value$")][@xml:id="id2"][not(following-sibling::*)]//chi[starts-with(@title,"_bl")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::kappa[@attr][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//eta[starts-with(@desciption,"fal")][@xml:id="id5"]/upsilon[starts-with(concat(@class,"-"),"another attribute value-")][@xml:lang="en"][following-sibling::zeta[contains(@data,"ute value")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 2]]//lambda[@xml:lang="en-US"][@xml:id="id7"][not(child::node())][following-sibling::*[contains(@attrib,"0%")][not(child::node())][following-sibling::beta[@number][@xml:lang="no-nb"][@xml:id="id8"][not(child::node())][following-sibling::nu[@xml:lang="no-nb"][@xml:id="id9"][preceding-sibling::*[position() = 3]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <rho title="true" xml:lang="nb" xml:id="id1"> <phi false="attribute-value" xml:id="id2"> @@ -5785,6 +6785,11 @@ </test> <test> <xpath>//delta[contains(@title,"te")][@xml:id="id1"]//upsilon[@content][@xml:id="id2"][following-sibling::pi[@att][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[following-sibling::mu[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::mu)]/*[contains(@name,"lue")][not(preceding-sibling::*)]/omega[contains(@desciption,"%")][@xml:lang="en-US"][not(preceding-sibling::*)]/zeta[starts-with(concat(@attrib,"-"),"another attribute value-")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::pi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[starts-with(concat(@data,"-"),"attribute value-")][@xml:lang="nb"][@xml:id="id6"][following-sibling::*[@class][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@attr="another attribute value"][@xml:lang="en"][@xml:id="id7"]/xi[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)]//zeta[contains(@attribute,"se")][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@title="attribute"][@xml:lang="en"][@xml:id="id10"]/theta[starts-with(@content,"at")][@xml:id="id11"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:lang="nb"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <delta title="attribute" xml:id="id1"> <upsilon content="attribute" xml:id="id2"/> @@ -5819,6 +6824,11 @@ </test> <test> <xpath>//gamma[starts-with(concat(@attribute,"-"),"content-")][@xml:lang="en"][@xml:id="id1"]/tau[not(following-sibling::*)]/delta[contains(concat(@true,"$"),"reen$")][@xml:lang="en"][following-sibling::beta[@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::sigma[@string][@xml:lang="no"][@xml:id="id3"]/theta[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@insert][@xml:lang="no"][not(following-sibling::*)]/rho[@xml:lang="no-nb"][@xml:id="id5"]/kappa[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(concat(@desciption,"-"),"this.nodeValue-")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::beta[@att][@xml:id="id7"][preceding-sibling::*[position() = 1]]/rho[@xml:lang="no"][@xml:id="id8"][following-sibling::rho[starts-with(concat(@or,"-"),"false-")]/beta[@xml:lang="no-nb"][@xml:id="id9"][following-sibling::beta[@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <gamma attribute="content" xml:lang="en" xml:id="id1"> <tau> @@ -5849,6 +6859,11 @@ </test> <test> <xpath>//rho[@xml:lang="no-nb"]//kappa[contains(@token,"1234567")][@xml:lang="en-GB"][not(preceding-sibling::*)]/alpha[@xml:lang="en"][not(following-sibling::*)]//epsilon[starts-with(@data,"tr")][@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[starts-with(concat(@and,"-"),"false-")][@xml:lang="en-US"][following-sibling::upsilon[not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="no-nb"> <kappa token="123456789" xml:lang="en-GB"> @@ -5865,6 +6880,11 @@ </test> <test> <xpath>//omicron[starts-with(concat(@src,"-"),"solid 1px green-")]//*[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)]//iota[@xml:lang="no-nb"]/phi[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:id="id2"][not(child::node())][following-sibling::theta[@xml:id="id3"][not(following-sibling::*)]//lambda[@class][@xml:lang="en-GB"][not(preceding-sibling::*)]/chi[@object][not(preceding-sibling::*)][not(following-sibling::*)]/*[starts-with(@token,"fa")]//phi[@xml:lang="en-GB"]/rho[contains(concat(@false,"$"),"id 1px green$")][not(following-sibling::rho)]/phi[@insert="another attribute value"][@xml:lang="no"][@xml:id="id4"][following-sibling::lambda[preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:lang="nb"][following-sibling::mu[@xml:id="id5"][preceding-sibling::*[position() = 3]]//lambda[starts-with(concat(@src,"-"),"false-")][@xml:lang="no"][@xml:id="id6"][not(child::node())][following-sibling::chi[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/nu[contains(concat(@string,"$"),"ttribute$")][@xml:id="id9"][not(child::node())][following-sibling::theta[contains(@true,"attribute-v")][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::nu[preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <omicron src="solid 1px green"> <any xml:lang="en" xml:id="id1"> @@ -5903,6 +6923,11 @@ </test> <test> <xpath>//theta[@xml:lang="en-GB"][@xml:id="id1"]/omega[starts-with(@string,"c")][following-sibling::alpha[@desciption][@xml:lang="en"][@xml:id="id2"]/lambda[starts-with(concat(@number,"-"),"123456789-")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:lang="no-nb"][@xml:id="id4"][following-sibling::alpha[@delete][preceding-sibling::*[position() = 1]][following-sibling::beta[contains(@abort,"bute valu")][@xml:lang="nb"][@xml:id="id5"][following-sibling::xi[contains(concat(@class,"$"),"_blank$")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/chi[@xml:id="id6"]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="en-GB" xml:id="id1"> <omega string="content"/> @@ -5924,6 +6949,11 @@ </test> <test> <xpath>//zeta[starts-with(concat(@content,"-"),"true-")][@xml:lang="en-GB"][@xml:id="id1"]//theta[@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]]//rho[@xml:lang="en"][@xml:id="id3"][following-sibling::upsilon[contains(@desciption,"is-is-att-valu")][preceding-sibling::*[position() = 1]]//rho[@name][@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::pi[@string][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[@xml:lang="nb"][following-sibling::epsilon[@xml:lang="en-US"]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <zeta content="true" xml:lang="en-GB" xml:id="id1"> <theta xml:lang="en-US" xml:id="id2"/> @@ -5944,6 +6974,11 @@ </test> <test> <xpath>//gamma[@xml:id="id1"]/theta[@xml:id="id2"][not(following-sibling::*)]//eta[contains(concat(@string,"$"),"00%$")][following-sibling::omega[starts-with(concat(@abort,"-"),"attribute-")][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@class][preceding-sibling::*[position() = 2]]//iota[@abort="this.nodeValue"][@xml:lang="en"][not(preceding-sibling::*)]/mu[starts-with(@insert,"attr")][@xml:lang="en-US"][following-sibling::omicron[@attr="_blank"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[not(child::node())][following-sibling::omega[@data="100%"][@xml:lang="no-nb"]//omega[@xml:lang="nb"][@xml:id="id4"]//xi[@xml:lang="en"][not(preceding-sibling::*)][not(preceding-sibling::xi)][not(child::node())][following-sibling::omega[starts-with(@abort,"100%")][preceding-sibling::*[position() = 1]]/tau[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::zeta[starts-with(@delete,"solid")][@xml:id="id5"][preceding-sibling::*[position() = 1]]/pi[@desciption="solid 1px green"][not(following-sibling::*)]/beta[@attribute="solid 1px green"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="nb"][following-sibling::iota[contains(@true,"true")][preceding-sibling::*[position() = 2]]//psi[contains(@delete,"ttribu")][not(preceding-sibling::*)][not(following-sibling::*)]//nu[not(preceding-sibling::*)][following-sibling::chi[@attr="attribute value"][following-sibling::iota[@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]]]]][position() = 1]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <gamma xml:id="id1"> <theta xml:id="id2"> @@ -5985,6 +7020,11 @@ </test> <test> <xpath>//*[starts-with(@number,"conten")][@xml:lang="nb"]/iota[@attr="123456789"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@data="attribute-value"][@xml:lang="no-nb"][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/nu[@xml:lang="no-nb"][not(preceding-sibling::*)]/psi[@xml:lang="en-US"][@xml:id="id1"][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <any number="content" xml:lang="nb"> <iota attr="123456789"/> @@ -6001,6 +7041,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en"]/theta[not(following-sibling::*)]//nu[@delete][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[starts-with(@string,"_bl")][preceding-sibling::*[position() = 1]]/mu[@xml:id="id1"][not(preceding-sibling::*)]/beta[@xml:id="id2"]//upsilon[@xml:id="id3"][not(following-sibling::*)]/chi[contains(concat(@abort,"$"),"tribute-value$")][@xml:lang="en-GB"][@xml:id="id4"]/delta[@number][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[not(following-sibling::*)]//epsilon[@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="no"][preceding-sibling::*[position() = 1]]/tau[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@content][@xml:lang="en"][preceding-sibling::*[position() = 1]]//zeta[@and][@xml:id="id7"][following-sibling::mu[@insert="solid 1px green"][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[starts-with(@object,"10")][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en"> <theta> @@ -6036,6 +7081,11 @@ </test> <test> <xpath>//phi[@xml:lang="en"][@xml:id="id1"]//omicron[not(preceding-sibling::*)][not(following-sibling::*)]//theta[@xml:lang="no-nb"]/delta[@xml:id="id2"]/phi[starts-with(@or,"another attribute value")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::rho[@xml:id="id5"][preceding-sibling::*[position() = 3]][not(preceding-sibling::rho)][following-sibling::upsilon[@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::omicron[contains(concat(@attr,"$"),"ttribute value$")][@xml:lang="en-US"]//phi[@xml:id="id7"][following-sibling::*[position()=3]][not(child::node())][following-sibling::gamma[@name][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[contains(@data,"ank")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[not(following-sibling::*)]//tau[@xml:lang="en-GB"][not(preceding-sibling::*)]/chi[following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[contains(@or,"blank")][@xml:lang="nb"]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>1</nth> + </result> <tree> <phi xml:lang="en" xml:id="id1"> <omicron> @@ -6067,6 +7117,11 @@ </test> <test> <xpath>//theta[starts-with(concat(@delete,"-"),"another attribute value-")][@xml:lang="en"][@xml:id="id1"]//psi//beta[not(preceding-sibling::*)]/delta[not(preceding-sibling::*)]//lambda[starts-with(@class,"1")][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[contains(concat(@false,"$"),"e$")][@xml:id="id2"][not(preceding-sibling::*)]//omega[@name][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[contains(concat(@content,"$"),"attribute$")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//psi[@name="attribute"][@xml:id="id3"]//theta[contains(@or,"0%")]/xi[@xml:lang="no-nb"][@xml:id="id4"]//kappa[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[contains(@or,"solid 1px gre")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::chi)]/theta[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:lang="en"][preceding-sibling::*[position() = 1]]/psi[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[contains(concat(@attrib,"$"),"e$")][@xml:id="id7"][not(following-sibling::*)]/tau[@xml:lang="no-nb"]/beta[@xml:id="id8"][following-sibling::omega[contains(concat(@data,"$"),"lue$")][preceding-sibling::*[position() = 1]][following-sibling::epsilon[@xml:lang="en-US"][@xml:id="id9"]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <theta delete="another attribute value" xml:lang="en" xml:id="id1"> <psi> @@ -6112,6 +7167,11 @@ </test> <test> <xpath>//eta[contains(@number,"deValue")][@xml:id="id1"]/delta[contains(@content,"ue")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::alpha[contains(@attrib,"0%")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/tau[@attr="attribute value"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::eta/lambda[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[not(preceding-sibling::*)][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <eta number="this.nodeValue" xml:id="id1"> <delta content="true" xml:lang="no" xml:id="id2"/> @@ -6131,6 +7191,11 @@ </test> <test> <xpath>//kappa[@attr]/gamma[contains(concat(@content,"$"),"tribute value$")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[starts-with(@att,"f")]/xi[@token][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@src][preceding-sibling::*[position() = 2]][not(following-sibling::xi)]/kappa[@and][@xml:lang="en-GB"][not(child::node())][following-sibling::upsilon[@xml:lang="en"]//rho[@att="another attribute value"][@xml:lang="en"][not(preceding-sibling::*)]/beta[not(preceding-sibling::*)][not(following-sibling::*)]//nu[not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@att][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@xml:lang="en-US"][not(preceding-sibling::*)]/mu[@xml:id="id3"]/delta[@object][@xml:lang="en-GB"][not(following-sibling::*)]//gamma[starts-with(@attr,"attribu")][following-sibling::iota[@xml:id="id4"][following-sibling::phi[@or][@xml:id="id5"][not(following-sibling::*)]//sigma[not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::lambda[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//kappa[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::upsilon[contains(@data,"b")][@xml:lang="en-US"][@xml:id="id6"][not(child::node())][following-sibling::tau[@and="100%"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]]][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <kappa attr="this-is-att-value"> <gamma content="attribute value" xml:id="id1"> @@ -6175,6 +7240,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no"]/beta[@false="solid 1px green"][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::omicron[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[contains(concat(@string,"$"),"tent$")][@xml:lang="en-GB"][not(preceding-sibling::*)]/nu[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@abort][@xml:lang="nb"][following-sibling::*[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[not(following-sibling::*)]/delta[@name="this-is-att-value"][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@insert][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[contains(@number,"n")][@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:id="id6"]/*[@xml:lang="en"]//upsilon[contains(concat(@delete,"$"),"ntent$")][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[@xml:id="id8"][not(following-sibling::*)]//omega[@object="false"][following-sibling::*[position()=1]][following-sibling::kappa[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[contains(concat(@title,"$"),"nodeValue$")][@xml:id="id9"][not(following-sibling::*)]//beta[starts-with(@title,"th")][not(preceding-sibling::*)][not(preceding-sibling::beta)][not(child::node())][following-sibling::rho[@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 1]]//upsilon[@token][@xml:id="id11"]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="no"> <beta false="solid 1px green" xml:lang="en-GB" xml:id="id1"/> @@ -6217,6 +7287,11 @@ </test> <test> <xpath>//gamma[@attribute][@xml:lang="no-nb"]/omega[not(preceding-sibling::*)]//xi[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(preceding-sibling::xi)][following-sibling::rho[contains(concat(@attribute,"$"),"e$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau/omicron[@true][@xml:lang="no"][not(following-sibling::*)]//pi[starts-with(concat(@attr,"-"),"content-")][@xml:lang="nb"][not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <gamma attribute="100%" xml:lang="no-nb"> <omega> @@ -6235,6 +7310,11 @@ </test> <test> <xpath>//tau[@xml:lang="no-nb"]/psi[not(preceding-sibling::*)]//epsilon[not(preceding-sibling::*)][not(following-sibling::*)]//rho[starts-with(concat(@or,"-"),"100%-")][following-sibling::alpha[contains(@object,"green")][@xml:lang="en-GB"][not(child::node())][following-sibling::beta[@xml:id="id1"][preceding-sibling::*[position() = 2]][following-sibling::omega[@xml:id="id2"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/omega[contains(@data,"e val")][@xml:lang="en"]//alpha[contains(concat(@desciption,"$"),"9$")]//rho[@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::mu[starts-with(@data,"attribute valu")][@xml:lang="en-US"][@xml:id="id5"]//delta[starts-with(@content,"thi")][not(following-sibling::*)]//omega[@desciption][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[@data][not(child::node())][following-sibling::phi/kappa[starts-with(concat(@desciption,"-"),"this-")][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(@string,"a")][@xml:id="id7"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no-nb"> <psi> @@ -6269,6 +7349,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@name,"-"),"content-")][@xml:lang="en-US"]/alpha[contains(@number,"a")][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::lambda[@object][preceding-sibling::*[position() = 1]]//chi[@and][@xml:id="id2"][not(preceding-sibling::*)]//alpha[@xml:id="id3"][not(preceding-sibling::*)]//xi[@true][@xml:id="id4"][not(child::node())][following-sibling::pi[@false][preceding-sibling::*[position() = 1]]/rho[@xml:id="id5"][not(child::node())][following-sibling::psi[starts-with(@title,"12345678")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <delta name="content" xml:lang="en-US"> <alpha number="false" xml:id="id1"/> @@ -6290,6 +7375,11 @@ </test> <test> <xpath>//omicron[@xml:lang="en-GB"][@xml:id="id1"]//pi[contains(@att,"e")][@xml:lang="no"][@xml:id="id2"][not(following-sibling::pi)][following-sibling::eta[@attrib="false"][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::eta[@xml:lang="no"][not(child::node())][following-sibling::theta[@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 3]][following-sibling::theta/gamma[@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@name][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(preceding-sibling::omicron or following-sibling::omicron)][following-sibling::kappa[@name][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/delta[not(following-sibling::*)]/pi[@attribute="true"][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)]/beta[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]/lambda[@title="content"][@xml:id="id8"][following-sibling::epsilon[@abort="attribute value"][not(following-sibling::*)]//epsilon[@data="this.nodeValue"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en"][@xml:id="id10"][not(child::node())][following-sibling::omicron[@xml:id="id11"]/kappa[contains(@title,"lue")][@xml:id="id12"][not(preceding-sibling::*)][following-sibling::phi[@xml:lang="no-nb"][not(preceding-sibling::phi)][not(child::node())][following-sibling::beta[contains(concat(@string,"$"),"ue$")][@xml:id="id13"][following-sibling::*[position()=1]][following-sibling::zeta[starts-with(concat(@src,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id14"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]][position() = 1]]]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="en-GB" xml:id="id1"> <pi att="true" xml:lang="no" xml:id="id2"/> @@ -6326,6 +7416,11 @@ </test> <test> <xpath>//epsilon[contains(concat(@attr,"$"),"reen$")][@xml:lang="en-GB"]//phi[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(preceding-sibling::phi)][not(child::node())][following-sibling::lambda[starts-with(@insert,"another attribute ")][@xml:lang="en"][preceding-sibling::*[position() = 1]]//iota[contains(@or,"bute-value")][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::iota[@xml:id="id2"]/kappa[@attr]/kappa[@xml:id="id3"][not(child::node())][following-sibling::eta[starts-with(concat(@true,"-"),"this.nodeValue-")][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::chi[@string][preceding-sibling::*[position() = 2]][not(preceding-sibling::chi)][following-sibling::theta[@xml:id="id5"][preceding-sibling::*[position() = 3]]//omicron[@insert][@xml:lang="en-US"][@xml:id="id6"][not(child::node())][following-sibling::psi[@xml:id="id7"][preceding-sibling::*[position() = 1]]//*[@xml:lang="no-nb"][not(following-sibling::*)]//tau[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)]/sigma[contains(concat(@false,"$"),"value$")][@xml:lang="en-GB"]//alpha[@class][not(child::node())][following-sibling::mu[contains(concat(@attrib,"$"),"blank$")][@xml:lang="no"][@xml:id="id9"][not(child::node())][following-sibling::tau[@xml:id="id10"][not(following-sibling::*)]/theta[starts-with(@attr,"attrib")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@xml:lang="en-US"][not(child::node())][following-sibling::gamma[@content][@xml:id="id11"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <epsilon attr="solid 1px green" xml:lang="en-GB"> <phi/> @@ -6366,6 +7461,11 @@ </test> <test> <xpath>//rho[@xml:lang="nb"][@xml:id="id1"]//omicron[starts-with(@token,"1")][following-sibling::theta[contains(concat(@content,"$")," value$")][@xml:lang="en"]/beta[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:id="id3"][not(following-sibling::*)]//mu[@xml:lang="en-GB"][not(preceding-sibling::*)]/delta[@xml:lang="en"][not(preceding-sibling::*)]/beta[starts-with(concat(@attribute,"-"),"this-")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[not(child::node())][following-sibling::gamma[@xml:lang="en-US"][not(following-sibling::*)]//iota[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::beta[@content="true"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="nb" xml:id="id1"> <omicron token="123456789"/> @@ -6391,6 +7491,11 @@ </test> <test> <xpath>//alpha[starts-with(@data,"attribute value")][@xml:lang="en-GB"][@xml:id="id1"]//omega[@xml:id="id2"][following-sibling::theta[not(preceding-sibling::theta)]/gamma[@class][@xml:id="id3"][not(preceding-sibling::*)]/beta[contains(@attr,"value")][@xml:lang="en"][not(preceding-sibling::*)]//sigma[contains(concat(@object,"$"),"ttribute value$")][@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=4]][not(child::node())][following-sibling::omega[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::omega[contains(@object,"ru")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[@xml:lang="en-US"][@xml:id="id6"][following-sibling::upsilon[@xml:lang="en-US"][preceding-sibling::*[position() = 4]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <alpha data="attribute value" xml:lang="en-GB" xml:id="id1"> <omega xml:id="id2"/> @@ -6412,6 +7517,11 @@ </test> <test> <xpath>//lambda[contains(@object,"u")]//omicron[not(preceding-sibling::*)][following-sibling::gamma[starts-with(concat(@att,"-"),"another attribute value-")][@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[starts-with(@or,"attribute-")][@xml:lang="nb"][not(child::node())][following-sibling::pi[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::iota[@xml:id="id3"][preceding-sibling::*[position() = 2]]//sigma[@xml:id="id4"][not(following-sibling::*)]/theta[starts-with(@src,"another attri")][@xml:id="id5"][following-sibling::kappa[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::eta[contains(@true,"1")][@xml:lang="en-GB"][@xml:id="id8"][not(child::node())][following-sibling::chi[@xml:id="id9"][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <lambda object="attribute-value"> <omicron/> @@ -6435,6 +7545,11 @@ </test> <test> <xpath>//sigma/iota[starts-with(concat(@data,"-"),"solid 1px green-")][@xml:lang="en"]/kappa[@and="false"][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@string="solid 1px green"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::psi)]/upsilon[starts-with(concat(@false,"-"),"_blank-")][not(preceding-sibling::*)]//pi[contains(concat(@attribute,"$"),"tent$")][not(following-sibling::*)]/alpha[not(following-sibling::*)]/kappa[starts-with(concat(@false,"-"),"this-")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@attr="123456789"][@xml:id="id2"][not(following-sibling::*)]/upsilon[contains(@or,"attrib")][@xml:lang="nb"][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][following-sibling::kappa[contains(concat(@name,"$"),"px green$")][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::rho[@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]/gamma[starts-with(@desciption,"_blan")][@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[following-sibling::epsilon[contains(@attribute,"tribute-value")][@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]//beta[contains(@src,"ue")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::beta)]//alpha[starts-with(@attr,"fals")][not(preceding-sibling::*)]/mu[following-sibling::gamma[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::iota[@xml:lang="no"][@xml:id="id8"][following-sibling::alpha[contains(@attr,"nodeVa")][@xml:lang="en-US"][@xml:id="id9"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>1</nth> + </result> <tree> <sigma> <iota data="solid 1px green" xml:lang="en"> @@ -6477,6 +7592,11 @@ </test> <test> <xpath>//chi[@xml:lang="no"][@xml:id="id1"]//zeta[contains(@data,"another attri")][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@name][not(preceding-sibling::*)][following-sibling::tau[following-sibling::omicron[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::rho[starts-with(concat(@or,"-"),"100%-")][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 3]][following-sibling::upsilon[preceding-sibling::*[position() = 4]][not(following-sibling::*)]/omega[not(preceding-sibling::*)]//eta[@xml:lang="no"]//theta[@token][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/omicron[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@xml:lang="en-US"][@xml:id="id4"]/mu[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[contains(@object,"456789")][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@xml:lang="nb"][not(preceding-sibling::*)]/lambda[@and][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:lang="no"][not(following-sibling::eta)]/nu[contains(@abort,"attribute value")][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="no"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="no" xml:id="id1"> <zeta data="another attribute value"> @@ -6517,6 +7637,11 @@ </test> <test> <xpath>//phi[contains(@abort,"o")]/iota[@xml:id="id1"]/delta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@xml:id="id3"][following-sibling::upsilon[@string][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 2]]//*[@xml:id="id4"][following-sibling::sigma[@xml:lang="no"][@xml:id="id5"]/eta[starts-with(concat(@content,"-"),"attribute value-")][@xml:id="id6"]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <phi abort="content"> <iota xml:id="id1"> @@ -6539,6 +7664,11 @@ </test> <test> <xpath>//sigma//rho[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:id="id1"][preceding-sibling::*[position() = 1]]//nu[@attribute="_blank"][@xml:id="id2"]//tau[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/delta//gamma[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <sigma> <rho xml:lang="nb"/> @@ -6558,6 +7688,11 @@ </test> <test> <xpath>//upsilon[@xml:id="id1"]/nu[starts-with(@content,"f")]//xi[starts-with(@abort,"1")][not(child::node())][following-sibling::mu[@desciption="_blank"][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::*[@xml:lang="nb"][not(child::node())][following-sibling::eta[@xml:lang="no-nb"]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:id="id1"> <nu content="false"> @@ -6573,6 +7708,11 @@ </test> <test> <xpath>//zeta[starts-with(concat(@and,"-"),"this-")]/rho[starts-with(concat(@or,"-"),"this-")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::psi[contains(@and,"ute-value")][@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//epsilon[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[contains(@src,"lse")][@xml:id="id2"][following-sibling::nu[@xml:id="id3"][not(following-sibling::*)]/sigma[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@string][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]/delta[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@token="100%"][@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[starts-with(concat(@class,"-"),"another attribute value-")][@xml:id="id6"][not(preceding-sibling::*)]//psi[@xml:id="id7"][following-sibling::chi[starts-with(concat(@name,"-"),"attribute-")][@xml:lang="no"][preceding-sibling::*[position() = 1]]/chi[@xml:lang="nb"][not(following-sibling::*)]/rho[@title][not(preceding-sibling::*)]/omicron[@string][@xml:lang="en"][not(following-sibling::*)]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <zeta and="this-is-att-value"> <rho or="this-is-att-value" xml:lang="en"/> @@ -6608,6 +7748,11 @@ </test> <test> <xpath>//pi[@xml:lang="no"][@xml:id="id1"]/gamma[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::chi[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[@xml:id="id2"][not(preceding-sibling::*)]/phi[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::delta[@class="123456789"][@xml:lang="no-nb"][not(child::node())][following-sibling::rho[@xml:lang="en-US"][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 3]]/tau[@desciption][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="en-GB"]/beta[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(preceding-sibling::beta)][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[starts-with(concat(@title,"-"),"false-")][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::eta[starts-with(concat(@title,"-"),"false-")][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omicron[@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::tau[@xml:lang="no"][@xml:id="id8"][not(child::node())][following-sibling::gamma[contains(concat(@name,"$"),"value$")][@xml:lang="nb"][preceding-sibling::*[position() = 6]]//lambda[starts-with(@delete,"100%")][@xml:lang="nb"][@xml:id="id9"][not(child::node())][following-sibling::chi[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="no" xml:id="id1"> <gamma xml:lang="en-US"/> @@ -6640,6 +7785,11 @@ </test> <test> <xpath>//kappa[starts-with(concat(@desciption,"-"),"this.nodeValue-")][@xml:lang="nb"]//rho[@attribute="100%"][@xml:lang="en-GB"][following-sibling::delta[contains(@attrib,"c")][@xml:lang="en-US"][following-sibling::zeta[contains(@delete,"gre")][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[not(following-sibling::*)]/phi[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@xml:lang="nb"][not(following-sibling::*)]/phi[contains(concat(@string,"$"),"ibute value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@xml:id="id2"]/tau[starts-with(concat(@attribute,"-"),"solid 1px green-")][@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::tau[@xml:lang="en-GB"][not(following-sibling::*)]//delta[@xml:lang="en-GB"][following-sibling::chi[@xml:lang="en"][@xml:id="id3"][following-sibling::psi[contains(concat(@and,"$"),"e$")]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <kappa desciption="this.nodeValue" xml:lang="nb"> <rho attribute="100%" xml:lang="en-GB"/> @@ -6668,6 +7818,11 @@ </test> <test> <xpath>//pi[@title]/xi[@data][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[contains(@content,"r")][@xml:lang="nb"][not(preceding-sibling::*)]/kappa[@xml:lang="en"][following-sibling::gamma[@or="another attribute value"][@xml:id="id2"][not(following-sibling::*)]//eta[not(following-sibling::*)]//tau[starts-with(@desciption,"attribute")][@xml:id="id3"][following-sibling::iota[starts-with(@content,"_")][@xml:lang="no-nb"][@xml:id="id4"][following-sibling::omicron[@src="another attribute value"][@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//phi[@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)]//kappa[starts-with(@desciption,"this.n")][@xml:id="id7"]//lambda[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>1</nth> + </result> <tree> <pi title="_blank"> <xi data="content" xml:id="id1"> @@ -6695,6 +7850,11 @@ </test> <test> <xpath>//omicron[@xml:id="id1"]//iota[starts-with(@attr,"this-is-att-")][@xml:id="id2"][not(following-sibling::*)]/beta[@string][@xml:lang="no-nb"][not(child::node())][following-sibling::omega[@or][@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//pi[not(following-sibling::*)]/nu[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)]//tau[@xml:id="id5"][not(following-sibling::*)]//theta[@src][@xml:lang="en"][following-sibling::xi[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(preceding-sibling::xi)][not(child::node())][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/rho[starts-with(concat(@false,"-"),"false-")][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)]//phi[@attribute][@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]//omega[starts-with(concat(@abort,"-"),"attribute-")][@xml:lang="en-US"][following-sibling::*[position()=2]][following-sibling::lambda[@attrib="_blank"][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:id="id9"][preceding-sibling::*[position() = 2]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omicron xml:id="id1"> <iota attr="this-is-att-value" xml:id="id2"> @@ -6726,6 +7886,11 @@ </test> <test> <xpath>//tau[@xml:lang="no"]//theta[@xml:id="id1"][not(following-sibling::*)]/upsilon[@xml:id="id2"][not(preceding-sibling::*)]//*[@attribute][@xml:lang="no"]/eta[contains(concat(@string,"$"),"bute-value$")][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@title][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::alpha[@token][@xml:lang="en-US"][@xml:id="id5"][following-sibling::phi[contains(concat(@or,"$"),"e$")][@xml:lang="en"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::chi[@number="123456789"][@xml:lang="no-nb"][following-sibling::epsilon[starts-with(@name,"_blank")][@xml:id="id6"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//omega[@string][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="no-nb"]//omega[@xml:lang="no"][following-sibling::*[position()=3]][not(child::node())][following-sibling::*[@attr][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[contains(@abort,"tr")][@xml:lang="en"][@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::chi[starts-with(concat(@true,"-"),"attribute value-")][@xml:lang="en-GB"][not(following-sibling::*)]//pi[@xml:lang="en-US"][@xml:id="id10"][not(following-sibling::*)][not(following-sibling::pi)]/eta[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::kappa[@data][@xml:id="id11"][not(following-sibling::*)]/sigma[@attribute][not(preceding-sibling::*)][following-sibling::mu[@object][@xml:id="id12"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="no"][not(following-sibling::*)]//delta[@xml:lang="en-GB"][@xml:id="id13"][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]][position() = 1]]]][position() = 1]]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no"> <theta xml:id="id1"> @@ -6767,6 +7932,11 @@ </test> <test> <xpath>//psi[@xml:lang="no"][@xml:id="id1"]/rho[@attrib="this-is-att-value"][@xml:id="id2"][not(preceding-sibling::*)][not(preceding-sibling::rho)][following-sibling::lambda[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@xml:id="id3"][not(child::node())][following-sibling::zeta[starts-with(@content,"true")][@xml:id="id4"]/pi[contains(concat(@attr,"$"),"0%$")][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::iota[@and][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::chi[@xml:lang="nb"][following-sibling::*[position()=3]][not(child::node())][following-sibling::upsilon[starts-with(@desciption,"another attr")][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][following-sibling::eta[starts-with(@number,"this-is-att-valu")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::chi[preceding-sibling::*[position() = 5]]//omega[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)]/upsilon[starts-with(@desciption,"fals")][following-sibling::delta[starts-with(@data,"this.nodeVa")][@xml:lang="no-nb"][@xml:id="id8"][not(following-sibling::*)]//epsilon[@content="false"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::epsilon)]/sigma[contains(@desciption,"9")][@xml:lang="nb"][not(preceding-sibling::*)]//rho[@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[starts-with(concat(@attribute,"-"),"false-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]//delta[@xml:lang="en-GB"][not(following-sibling::delta)][following-sibling::theta[@or="attribute"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[starts-with(@abort,"this.node")][@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@xml:id="id11"][preceding-sibling::*[position() = 3]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no" xml:id="id1"> <rho attrib="this-is-att-value" xml:id="id2"/> @@ -6805,6 +7975,11 @@ </test> <test> <xpath>//nu[contains(concat(@abort,"$"),"blank$")][@xml:lang="en-US"]/nu[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::chi[following-sibling::epsilon[@xml:id="id2"][preceding-sibling::*[position() = 2]]/lambda[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::rho[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[contains(concat(@attribute,"$"),"ank$")][@xml:lang="nb"][@xml:id="id6"][not(child::node())][following-sibling::eta[@delete][preceding-sibling::*[position() = 3]]/beta[@xml:lang="no-nb"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=5]][following-sibling::phi[@content][@xml:id="id8"][following-sibling::nu[following-sibling::zeta[@xml:lang="no-nb"][@xml:id="id9"][following-sibling::delta[@xml:id="id10"][following-sibling::zeta[@xml:lang="en"][@xml:id="id11"][preceding-sibling::*[position() = 5]]]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>1</nth> + </result> <tree> <nu abort="_blank" xml:lang="en-US"> <nu xml:id="id1"/> @@ -6831,6 +8006,11 @@ </test> <test> <xpath>//beta[starts-with(@and,"this-is-at")][@xml:lang="nb"][@xml:id="id1"]/psi[@token][@xml:lang="en-US"][@xml:id="id2"]/tau[@xml:lang="en-GB"][not(following-sibling::*)]/pi[@xml:lang="en-US"][following-sibling::alpha[contains(@content,"tr")][@xml:id="id3"][preceding-sibling::*[position() = 1]]//pi[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::*[contains(concat(@true,"$"),"lue$")][@xml:lang="en-GB"][not(following-sibling::*)]/iota[contains(concat(@number,"$"),"e$")][@xml:lang="en-GB"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="nb"][@xml:id="id6"]/beta[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@xml:lang="nb"][@xml:id="id7"][not(child::node())][following-sibling::epsilon[@content="123456789"][@xml:id="id8"][not(following-sibling::*)]/beta[contains(concat(@and,"$"),"e$")][@xml:lang="no"]/nu[@xml:id="id9"][not(following-sibling::*)]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <beta and="this-is-att-value" xml:lang="nb" xml:id="id1"> <psi token="false" xml:lang="en-US" xml:id="id2"> @@ -6861,6 +8041,11 @@ </test> <test> <xpath>//iota[@xml:lang="no"]/theta[following-sibling::zeta[@src="this.nodeValue"][@xml:lang="nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::psi[@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/chi[not(child::node())][following-sibling::phi[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no"> <theta/> @@ -6876,6 +8061,11 @@ </test> <test> <xpath>//iota[contains(concat(@object,"$"),"en$")][@xml:id="id1"]//omega[not(preceding-sibling::*)]//sigma[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::gamma[@insert="content"][preceding-sibling::*[position() = 1]]//sigma[@xml:lang="en"]/alpha[@xml:id="id3"]//zeta[@xml:lang="no"][@xml:id="id4"][following-sibling::omega[@xml:id="id5"][not(following-sibling::*)]/xi[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[@xml:id="id6"][not(following-sibling::*)]//epsilon[contains(concat(@false,"$"),"e$")][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[starts-with(concat(@and,"-"),"solid 1px green-")][@xml:lang="en"][not(following-sibling::*)]//phi[starts-with(@token,"th")][@xml:lang="en-US"][following-sibling::*[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[@number="true"][@xml:id="id8"][not(child::node())][following-sibling::zeta[starts-with(@data,"so")][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <iota object="solid 1px green" xml:id="id1"> <omega> @@ -6910,6 +8100,11 @@ </test> <test> <xpath>//eta[starts-with(concat(@object,"-"),"attribute value-")][@xml:lang="nb"]//omicron[@xml:lang="en-US"][@xml:id="id1"]/pi[@att="true"][@xml:id="id2"]/omega[@att="123456789"][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::phi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::tau[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/iota[@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[@title="_blank"][not(following-sibling::*)]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <eta object="attribute value" xml:lang="nb"> <omicron xml:lang="en-US" xml:id="id1"> @@ -6929,6 +8124,11 @@ </test> <test> <xpath>//*/upsilon[@att="123456789"][@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)]/rho[@xml:id="id2"][following-sibling::epsilon[starts-with(concat(@abort,"-"),"100%-")][@xml:lang="en-GB"][following-sibling::iota[@xml:lang="en"][@xml:id="id3"]//theta[contains(concat(@desciption,"$")," 1px green$")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::xi[contains(concat(@desciption,"$"),"content$")][@xml:lang="no-nb"][not(child::node())][following-sibling::delta[contains(@attribute,"s-is-a")][@xml:lang="no-nb"]//xi[@data][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=6]][following-sibling::mu[@attribute="123456789"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::epsilon[@insert="this.nodeValue"][@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 3]][following-sibling::psi[@xml:id="id8"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=3]][not(child::node())][following-sibling::mu[contains(@title,"789")][@xml:id="id9"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::xi[@string="123456789"][not(child::node())][following-sibling::beta[@xml:lang="en-GB"][preceding-sibling::*[position() = 7]]/upsilon[@src="attribute value"][@xml:id="id10"][not(child::node())][following-sibling::eta[contains(concat(@attribute,"$"),"rue$")]//gamma[@object][@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[contains(concat(@delete,"$"),"9$")][@xml:id="id12"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]][position() = 1]]][position() = 1]]]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <any> <upsilon att="123456789" xml:lang="nb" xml:id="id1"> @@ -6963,6 +8163,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]/epsilon[@class="false"][@xml:lang="no-nb"][@xml:id="id2"][following-sibling::nu[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[contains(concat(@attrib,"$"),"alue$")][@xml:lang="en-US"]//tau[@xml:id="id3"][not(following-sibling::*)]//beta[@insert="100%"][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]/iota[@xml:lang="no"][@xml:id="id5"][not(following-sibling::*)]/phi[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[not(following-sibling::*)]//pi[@insert][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@xml:id="id7"][not(following-sibling::*)]//zeta[starts-with(@src,"attribu")][@xml:lang="nb"][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <epsilon class="false" xml:lang="no-nb" xml:id="id2"/> @@ -6991,6 +8196,11 @@ </test> <test> <xpath>//beta[@xml:lang="no-nb"]//epsilon[@xml:lang="en"][@xml:id="id1"][not(following-sibling::*)]/alpha[@title="_blank"][@xml:lang="en-US"][@xml:id="id2"][following-sibling::omicron[starts-with(@object,"another a")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/xi[starts-with(@attr,"this.nodeVa")][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[starts-with(@string,"12")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no-nb"> <epsilon xml:lang="en" xml:id="id1"> @@ -7007,6 +8217,11 @@ </test> <test> <xpath>//eta[@attrib][@xml:id="id1"]/zeta[@xml:lang="en-GB"][not(child::node())][following-sibling::delta[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//theta[contains(@attrib,"een")][@xml:id="id3"]/alpha[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@name][@xml:lang="no-nb"][@xml:id="id5"][not(following-sibling::*)]//xi[starts-with(concat(@att,"-"),"true-")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[contains(concat(@abort,"$"),"3456789$")][@xml:id="id7"][not(following-sibling::*)]//phi[starts-with(@att,"this-is-att-value")][following-sibling::*[position()=2]][following-sibling::*[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::xi[@title="true"][not(following-sibling::*)]/chi[not(preceding-sibling::*)]/omicron[starts-with(concat(@true,"-"),"attribute-")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[contains(concat(@src,"$"),"23456789$")][@xml:id="id9"]//lambda[not(preceding-sibling::*)]//delta[@xml:lang="nb"][@xml:id="id10"][not(child::node())][following-sibling::lambda[@xml:lang="en"]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <eta attrib="true" xml:id="id1"> <zeta xml:lang="en-GB"/> @@ -7044,6 +8259,11 @@ </test> <test> <xpath>//tau[@content][@xml:id="id1"]/beta[@xml:lang="en-GB"][not(following-sibling::*)]/upsilon[starts-with(concat(@desciption,"-"),"this-")][@xml:id="id2"]//upsilon[@xml:id="id3"]/xi[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@content][@xml:id="id5"]//*[@xml:lang="nb"][not(preceding-sibling::*)]/psi[contains(@class,"al")][@xml:lang="en"][@xml:id="id6"]/gamma[@insert="100%"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[starts-with(@insert,"attribute-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::tau[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//kappa[@content][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[contains(@attrib,"789")][following-sibling::kappa[contains(concat(@object,"$"),"att-value$")][@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::alpha[@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(following-sibling::alpha)]/xi[following-sibling::*[position()=2]][not(preceding-sibling::xi)][not(child::node())][following-sibling::alpha[@name="_blank"][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//lambda[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::mu[contains(concat(@src,"$"),"s-is-att-value$")][@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)]/nu[starts-with(@token,"this.nod")][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@true][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::omicron[starts-with(concat(@or,"-"),"_blank-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@xml:lang="nb"][@xml:id="id12"][not(following-sibling::*)]][position() = 1]]]]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <tau content="false" xml:id="id1"> <beta xml:lang="en-GB"> @@ -7088,6 +8308,11 @@ </test> <test> <xpath>//pi[@xml:id="id1"]/mu[@xml:lang="en"]/beta[starts-with(concat(@or,"-"),"123456789-")][@xml:lang="no"][not(following-sibling::*)]/alpha[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@title][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::epsilon[@false="attribute value"][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omega[not(preceding-sibling::*)][not(child::node())][following-sibling::iota[following-sibling::*[position()=5]][not(child::node())][following-sibling::zeta[@name="123456789"][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::xi[contains(concat(@true,"$"),"nk$")][@xml:id="id4"][preceding-sibling::*[position() = 3]][following-sibling::eta[@xml:lang="no"][preceding-sibling::*[position() = 4]][following-sibling::xi[@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::sigma[contains(@insert,"alue")][@xml:lang="en"][preceding-sibling::*[position() = 6]]/iota[@attr][@xml:lang="no"][@xml:id="id6"][not(following-sibling::*)]//upsilon[contains(concat(@abort,"$"),"ttribute-value$")][not(preceding-sibling::*)]//kappa[starts-with(@or,"_blan")][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[contains(concat(@src,"$"),"ue$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//*[starts-with(@number,"100%")][not(child::node())][following-sibling::omicron//chi[contains(@title,"ru")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omega[@xml:id="id7"]][position() = 1]]]][position() = 1]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <pi xml:id="id1"> <mu xml:lang="en"> @@ -7127,6 +8352,11 @@ </test> <test> <xpath>//rho[@data="123456789"][@xml:lang="no"]//upsilon[@xml:id="id1"]/omega[not(preceding-sibling::*)][not(following-sibling::*)]//pi[starts-with(concat(@abort,"-"),"this-")][@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]//pi[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//chi[not(following-sibling::*)]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <rho data="123456789" xml:lang="no"> <upsilon xml:id="id1"> @@ -7145,6 +8375,11 @@ </test> <test> <xpath>//omega[@and="another attribute value"][@xml:lang="no-nb"][@xml:id="id1"]/omega[not(preceding-sibling::*)][not(following-sibling::*)]//beta[@attr="this.nodeValue"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[following-sibling::*[position()=6]][following-sibling::iota[@xml:id="id3"][following-sibling::*[position()=5]][not(child::node())][following-sibling::tau[@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::psi[following-sibling::rho[@xml:lang="nb"][@xml:id="id5"][following-sibling::kappa[starts-with(@insert,"100")][@xml:lang="no-nb"][not(child::node())][following-sibling::lambda[@delete][@xml:lang="en"][preceding-sibling::*[position() = 7]]/omicron[starts-with(concat(@content,"-"),"this.nodeValue-")][@xml:lang="en-GB"][not(following-sibling::*)]//nu[@true][@xml:lang="no-nb"][not(following-sibling::*)]/sigma[@xml:lang="no-nb"][@xml:id="id6"][not(following-sibling::*)]//sigma[not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@title][@xml:id="id8"]//nu[@xml:id="id9"]/omicron[contains(concat(@insert,"$"),"eValue$")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:lang="nb"][not(preceding-sibling::*)]//pi[not(preceding-sibling::*)][not(following-sibling::*)]]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omega and="another attribute value" xml:lang="no-nb" xml:id="id1"> <omega> @@ -7183,6 +8418,11 @@ </test> <test> <xpath>//iota[contains(@number,"ue")]//mu[not(following-sibling::*)]//chi[following-sibling::nu[contains(@and,"00")][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[@src="123456789"][not(following-sibling::delta)][following-sibling::tau[@content][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//sigma[@title][@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/*[@xml:lang="en-GB"][not(following-sibling::*)][not(preceding-sibling::any)]//zeta[@src][not(following-sibling::*)]//chi[starts-with(concat(@src,"-"),"solid 1px green-")][@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::delta[contains(@title,"nt")][@xml:id="id5"][not(child::node())][following-sibling::omicron//upsilon[@true][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[@object]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <iota number="this-is-att-value"> <mu> @@ -7214,6 +8454,11 @@ </test> <test> <xpath>//omega/rho[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[@xml:lang="en-GB"][following-sibling::iota[not(following-sibling::*)]//omicron[@xml:id="id2"][not(following-sibling::*)]/eta[starts-with(concat(@true,"-"),"this-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[not(preceding-sibling::*)]//tau[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <omega> <rho xml:id="id1"> @@ -7236,6 +8481,11 @@ </test> <test> <xpath>//rho[@name="this-is-att-value"]/pi[@object][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::delta[starts-with(concat(@src,"-"),"solid 1px green-")][@xml:lang="en-GB"]//tau[@xml:lang="no-nb"][@xml:id="id2"]//nu[@class="123456789"][@xml:id="id3"][not(child::node())][following-sibling::psi[@xml:lang="en-US"][not(preceding-sibling::psi)][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/mu[@xml:lang="en-US"][not(preceding-sibling::*)]//phi[contains(concat(@src,"$"),"ribute value$")][@xml:id="id4"][not(preceding-sibling::*)]//*[@xml:lang="en"][not(preceding-sibling::*)]/zeta[starts-with(@name,"attr")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@xml:lang="no"][@xml:id="id5"]//delta[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@desciption="123456789"][@xml:lang="en"][preceding-sibling::*[position() = 1]]//epsilon[@attr][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::gamma[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]/zeta/phi[not(following-sibling::*)]//rho[@title="_blank"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[starts-with(concat(@name,"-"),"this-")][@xml:id="id8"][not(child::node())][following-sibling::psi[starts-with(@attrib,"solid 1px green")][@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 1]]//tau[starts-with(@and,"another attribu")][position() = 1]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <rho name="this-is-att-value"> <pi object="attribute-value" xml:id="id1"/> @@ -7279,6 +8529,11 @@ </test> <test> <xpath>//tau[@xml:id="id1"]/zeta[@xml:lang="nb"]//upsilon[not(preceding-sibling::*)][not(child::node())][following-sibling::delta[contains(@data,"e")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//theta[following-sibling::*[position()=5]][following-sibling::kappa[starts-with(@src,"conten")][@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::eta[contains(concat(@title,"$"),"23456789$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::mu[starts-with(concat(@attrib,"-"),"123456789-")][@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=2]][following-sibling::zeta[contains(concat(@attribute,"$"),"-is-att-value$")][@xml:id="id4"][preceding-sibling::*[position() = 4]][following-sibling::gamma[@title="123456789"][not(following-sibling::*)]//iota[starts-with(concat(@attr,"-"),"100%-")]//kappa[@object][@xml:lang="en"][following-sibling::*[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omega[@string][@xml:lang="no"][@xml:id="id6"][not(following-sibling::omega)][position() = 1]]]]]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <tau xml:id="id1"> <zeta xml:lang="nb"> @@ -7306,6 +8561,11 @@ </test> <test> <xpath>//alpha[contains(concat(@object,"$"),"ibute value$")][@xml:lang="nb"][@xml:id="id1"]//delta[not(preceding-sibling::*)]//omicron[not(preceding-sibling::*)][not(following-sibling::*)]//nu[not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@name="solid 1px green"][@xml:id="id2"][following-sibling::lambda[@delete="solid 1px green"][@xml:id="id3"][not(child::node())][following-sibling::delta[preceding-sibling::*[position() = 2]][following-sibling::theta[contains(@att,"onte")][@xml:lang="no"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::chi[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 4]]/omega[@xml:id="id5"][not(child::node())][following-sibling::upsilon[@xml:id="id6"][not(following-sibling::*)]//nu[@title][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::omicron[starts-with(@object,"this-is-att-valu")][preceding-sibling::*[position() = 1]]/beta[@abort][@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@src][@xml:lang="no"][not(following-sibling::*)]//chi[@xml:lang="no-nb"][following-sibling::iota[starts-with(@number,"12345678")][@xml:lang="no"][@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:id="id10"][not(child::node())][following-sibling::omicron[@string][preceding-sibling::*[position() = 3]][not(following-sibling::omicron)][following-sibling::nu[@xml:lang="en-US"][@xml:id="id11"][not(following-sibling::*)]/gamma[@class][@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@xml:lang="no-nb"][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>1</nth> + </result> <tree> <alpha object="another attribute value" xml:lang="nb" xml:id="id1"> <delta> @@ -7346,6 +8606,11 @@ </test> <test> <xpath>//kappa[@data][@xml:lang="en-GB"]//lambda[starts-with(@insert,"_blan")][@xml:lang="no"][not(preceding-sibling::*)]/sigma[not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[contains(@token,"e")][@xml:lang="no"]/epsilon[starts-with(@or,"cont")][not(preceding-sibling::*)]/delta[@xml:lang="en-US"][not(preceding-sibling::*)]/xi[@object][not(preceding-sibling::*)][following-sibling::beta[contains(@true,"e")][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::delta[starts-with(concat(@object,"-"),"_blank-")][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::iota[contains(concat(@and,"$"),"e value$")][@xml:lang="no"][preceding-sibling::*[position() = 3]][following-sibling::zeta[@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::theta[preceding-sibling::*[position() = 5]]/sigma[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[contains(@object,"123456789")][@xml:id="id5"][not(following-sibling::*)][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <kappa data="solid 1px green" xml:lang="en-GB"> <lambda insert="_blank" xml:lang="no"> @@ -7377,6 +8642,11 @@ </test> <test> <xpath>//delta[@xml:id="id1"]/nu[@xml:id="id2"][not(following-sibling::*)]//omicron[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="en"][@xml:id="id4"][following-sibling::gamma[not(following-sibling::*)]//rho[starts-with(concat(@string,"-"),"this-")][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:lang="no"][@xml:id="id6"][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::omega[contains(concat(@object,"$"),"nk$")][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(following-sibling::omega)]/rho[not(child::node())][following-sibling::phi[@att="false"][@xml:lang="en"][@xml:id="id7"][following-sibling::pi[@xml:id="id8"]/zeta[contains(concat(@object,"$"),"e$")][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)]//kappa[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@true][@xml:lang="en-US"][not(child::node())][following-sibling::psi[@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(preceding-sibling::psi)][following-sibling::epsilon[not(child::node())][following-sibling::omega[contains(concat(@string,"$"),"100%$")][not(following-sibling::*)]]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <delta xml:id="id1"> <nu xml:id="id2"> @@ -7410,6 +8680,11 @@ </test> <test> <xpath>//tau[starts-with(@delete,"_blank")][@xml:lang="no-nb"][@xml:id="id1"]//*[contains(concat(@title,"$"),"tt-value$")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)]//nu/tau[@attribute][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::iota[contains(@title,"e")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/epsilon[not(preceding-sibling::*)][not(following-sibling::*)]/zeta[contains(@attribute,"t")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[contains(concat(@att,"$"),"rue$")][@xml:id="id5"][not(child::node())][following-sibling::omega[starts-with(@attrib,"10")][@xml:lang="en-GB"][not(child::node())][following-sibling::*[not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 4]]/phi[contains(@false,"lid 1px")][following-sibling::mu[@class][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::alpha[starts-with(concat(@and,"-"),"attribute-")][@xml:id="id6"][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>1</nth> + </result> <tree> <tau delete="_blank" xml:lang="no-nb" xml:id="id1"> <any title="this-is-att-value" xml:lang="en-GB" xml:id="id2"> @@ -7437,6 +8712,11 @@ </test> <test> <xpath>//alpha//mu[@content][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::phi[@token][not(child::node())][following-sibling::pi[@attr][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::alpha[contains(@content,"e")][@xml:lang="en-US"][@xml:id="id2"]/zeta[@xml:id="id3"][not(following-sibling::*)]//kappa[contains(concat(@title,"$"),"ttribute value$")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::delta[starts-with(concat(@desciption,"-"),"attribute-")][preceding-sibling::*[position() = 1]][following-sibling::chi[contains(concat(@token,"$"),"alue$")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@attr][@xml:lang="en-US"][preceding-sibling::*[position() = 3]]/omicron[contains(concat(@and,"$"),"blank$")][@xml:lang="no-nb"][@xml:id="id5"][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <alpha> <mu content="100%" xml:id="id1"/> @@ -7459,6 +8739,11 @@ </test> <test> <xpath>//upsilon[@xml:id="id1"]//omicron[@true][@xml:lang="en-GB"][not(following-sibling::*)]//alpha[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]//theta[@string="solid 1px green"][@xml:lang="nb"][@xml:id="id3"][not(child::node())][following-sibling::beta[@desciption][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[@attr][following-sibling::pi[@xml:lang="en"][preceding-sibling::*[position() = 3]]/psi[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::gamma[@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::psi[@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::lambda[@xml:id="id8"][preceding-sibling::*[position() = 3]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:id="id1"> <omicron true="content" xml:lang="en-GB"> @@ -7481,6 +8766,11 @@ </test> <test> <xpath>//iota//omega[contains(@src,"ibute value")][@xml:lang="no-nb"][@xml:id="id1"][not(child::node())][following-sibling::gamma[@xml:id="id2"][preceding-sibling::*[position() = 1]]/epsilon//omega[@xml:lang="no"]//nu/lambda[@object="content"][@xml:id="id3"][not(following-sibling::*)]//omega[@xml:lang="en"][not(child::node())][following-sibling::eta[starts-with(concat(@number,"-"),"solid 1px green-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::rho[@delete][@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <iota> <omega src="another attribute value" xml:lang="no-nb" xml:id="id1"/> @@ -7505,6 +8795,11 @@ </test> <test> <xpath>//upsilon[contains(@insert,"alue")][@xml:lang="no"][@xml:id="id1"]/alpha[@token][@xml:lang="nb"][@xml:id="id2"]/*[@xml:lang="en-GB"][not(following-sibling::*)]/mu[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]//pi[contains(concat(@object,"$"),"ribute-value$")][@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]/mu[@or][@xml:lang="en-GB"][@xml:id="id5"][following-sibling::sigma[@token][preceding-sibling::*[position() = 1]]/beta[@xml:lang="no"]/delta[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::delta[starts-with(concat(@delete,"-"),"another attribute value-")][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::pi[following-sibling::*[position()=1]][following-sibling::epsilon[contains(concat(@string,"$"),"tribute$")][@xml:id="id7"][preceding-sibling::*[position() = 3]]//theta[contains(concat(@false,"$"),"een$")]//*[@name="_blank"][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>1</nth> + </result> <tree> <upsilon insert="this-is-att-value" xml:lang="no" xml:id="id1"> <alpha token="false" xml:lang="nb" xml:id="id2"> @@ -7535,6 +8830,11 @@ </test> <test> <xpath>//chi[contains(concat(@insert,"$"),"ttribute$")][@xml:lang="nb"][@xml:id="id1"]//delta[@xml:id="id2"][not(preceding-sibling::*)]/beta[@insert][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/chi[@xml:lang="nb"][@xml:id="id4"][following-sibling::delta[following-sibling::*[position()=3]][following-sibling::*[@false][@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::theta[@xml:lang="no"][not(child::node())][following-sibling::beta[@xml:id="id6"][preceding-sibling::*[position() = 4]]//rho[@xml:id="id7"][not(preceding-sibling::*)][not(parent::*/*[position()=2])][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>1</nth> + </result> <tree> <chi insert="attribute" xml:lang="nb" xml:id="id1"> <delta xml:id="id2"> @@ -7555,6 +8855,11 @@ </test> <test> <xpath>//psi[@data][@xml:lang="en-US"]//iota[@xml:lang="nb"][not(following-sibling::*)]//*[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[@title][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="en"][preceding-sibling::*[position() = 1]]//iota[@title][not(preceding-sibling::*)]//sigma[not(preceding-sibling::*)]//iota[@desciption="_blank"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::lambda[starts-with(@abort,"attrib")][@xml:id="id5"][not(following-sibling::*)]/omega[@content][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::omicron[@abort="content"][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <psi data="attribute-value" xml:lang="en-US"> <iota xml:lang="nb"> @@ -7583,6 +8888,11 @@ </test> <test> <xpath>//eta[@false="123456789"][@xml:lang="no-nb"][@xml:id="id1"]/zeta[@xml:id="id2"][not(preceding-sibling::*)]/gamma[@xml:id="id3"]//beta[starts-with(@title,"attr")][following-sibling::xi[contains(@att,"on")][@xml:id="id4"][not(child::node())][following-sibling::sigma[@and][@xml:id="id5"][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/xi[not(following-sibling::*)]/omicron[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <eta false="123456789" xml:lang="no-nb" xml:id="id1"> <zeta xml:id="id2"> @@ -7604,6 +8914,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]//psi[not(preceding-sibling::*)]/pi[not(preceding-sibling::*)]//nu[contains(@src,"ode")][@xml:id="id2"][not(following-sibling::*)]//delta[@xml:lang="en-US"][not(preceding-sibling::delta)][following-sibling::iota[starts-with(concat(@desciption,"-"),"100%-")][@xml:lang="en-US"][@xml:id="id3"][following-sibling::xi[@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:lang="nb"][preceding-sibling::*[position() = 3]]/gamma[@string="attribute value"][@xml:lang="en"][not(preceding-sibling::*)]//theta[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]/eta[@abort][@xml:id="id5"][following-sibling::*[position()=4]][not(child::node())][following-sibling::omicron[@false="this.nodeValue"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:lang="nb"][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@xml:lang="nb"][following-sibling::pi[@delete][@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//xi[starts-with(concat(@number,"-"),"_blank-")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <sigma xml:id="id1"> <psi> @@ -7635,6 +8950,11 @@ </test> <test> <xpath>//lambda//kappa[@xml:lang="no-nb"][@xml:id="id1"][not(child::node())][following-sibling::omega[@xml:lang="no"][following-sibling::*[position()=7]][following-sibling::zeta[@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::omicron[contains(concat(@title,"$"),"0%$")][@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::delta[@object][@xml:id="id4"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::iota[@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::beta[@xml:id="id6"][following-sibling::upsilon[@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 7]][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 8]]/kappa[@and][@xml:id="id8"][following-sibling::beta[@class]//mu[following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@attribute][@xml:lang="no-nb"][@xml:id="id9"][following-sibling::delta[@class][@xml:lang="no"][preceding-sibling::*[position() = 2]]//gamma[starts-with(@object,"soli")][@xml:lang="no-nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[contains(concat(@and,"$"),"nt$")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//tau[@class]/nu/epsilon[@or="content"][@xml:lang="no-nb"][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <lambda> <kappa xml:lang="no-nb" xml:id="id1"/> @@ -7671,6 +8991,11 @@ </test> <test> <xpath>//psi[contains(@attribute,"alue")][@xml:id="id1"]//eta[@class="content"][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::zeta[@object][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[contains(@title,"0%")][@xml:lang="no"][@xml:id="id2"]//nu[starts-with(concat(@string,"-"),"100%-")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[contains(concat(@att,"$"),"e$")][@xml:lang="no"][@xml:id="id4"]/omega[starts-with(@content,"attribute-va")][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)]/beta[@xml:lang="nb"][not(preceding-sibling::*)]/tau[@delete="_blank"][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[not(child::node())][following-sibling::alpha[@attr][following-sibling::*[position()=3]][following-sibling::pi[starts-with(concat(@attrib,"-"),"false-")][@xml:lang="no-nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:id="id7"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <psi attribute="this.nodeValue" xml:id="id1"> <eta class="content" xml:lang="no"/> @@ -7699,6 +9024,11 @@ </test> <test> <xpath>//upsilon[starts-with(@name,"true")][@xml:lang="en-GB"][@xml:id="id1"]/mu[starts-with(@src,"_blank")][not(preceding-sibling::mu)][following-sibling::mu[@xml:lang="nb"][not(following-sibling::*)]/tau[@delete="content"][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::phi[preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][following-sibling::chi[@xml:lang="no-nb"][following-sibling::*[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::theta[@true][@xml:id="id3"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::sigma[contains(@desciption,"deVal")][@xml:lang="no-nb"][following-sibling::iota[@xml:id="id4"]/epsilon[@attr][@xml:lang="en"][not(preceding-sibling::*)]//nu[not(following-sibling::*)]//delta[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::psi[@xml:id="id6"][preceding-sibling::*[position() = 1]]/gamma[@xml:lang="en-GB"]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <upsilon name="true" xml:lang="en-GB" xml:id="id1"> <mu src="_blank"/> @@ -7727,6 +9057,11 @@ </test> <test> <xpath>//omega[@false][@xml:id="id1"]/omicron[@xml:lang="nb"][@xml:id="id2"]//alpha[@attr][@xml:lang="no"]//lambda[@att][@xml:lang="nb"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[starts-with(concat(@true,"-"),"attribute-")][@xml:id="id4"][preceding-sibling::*[position() = 1]]/eta[contains(@or,"e")][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@xml:lang="no"][not(following-sibling::*)]//tau[not(preceding-sibling::*)]/lambda[@src][@xml:lang="nb"][following-sibling::eta[contains(concat(@false,"$"),"e$")][@xml:id="id5"][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <omega false="content" xml:id="id1"> <omicron xml:lang="nb" xml:id="id2"> @@ -7751,6 +9086,11 @@ </test> <test> <xpath>//eta[@xml:id="id1"]/eta[@string][not(preceding-sibling::*)]//tau[@xml:id="id2"][not(child::node())][following-sibling::omicron[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=6]][not(child::node())][following-sibling::alpha[starts-with(concat(@class,"-"),"this-")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::phi[starts-with(concat(@desciption,"-"),"this.nodeValue-")][preceding-sibling::*[position() = 3]][following-sibling::*[position()=4]][following-sibling::phi[@and][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::iota[contains(concat(@number,"$"),"nk$")][@xml:lang="no"][preceding-sibling::*[position() = 5]][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 6]][not(child::node())][following-sibling::*[@and][@xml:lang="en-US"][preceding-sibling::*[position() = 7]][not(following-sibling::*)]/iota[not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id5"][following-sibling::theta[@name][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[@attrib][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::eta[@name][@xml:lang="en-US"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::tau[starts-with(@data,"another attribute")][@xml:lang="no"][@xml:id="id6"][not(following-sibling::*)]/mu[not(preceding-sibling::*)][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[@xml:lang="en-US"][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <eta xml:id="id1"> <eta string="123456789"> @@ -7782,6 +9122,11 @@ </test> <test> <xpath>//iota[@xml:lang="nb"][@xml:id="id1"]//theta[starts-with(concat(@false,"-"),"solid 1px green-")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@xml:lang="en"][not(child::node())][following-sibling::gamma[@src][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[@xml:lang="en-GB"][not(child::node())][following-sibling::rho[following-sibling::gamma[@xml:lang="en"][preceding-sibling::*[position() = 2]]/kappa[starts-with(@data,"this-is-a")][@xml:lang="en-US"][@xml:id="id4"]//kappa[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@name][not(preceding-sibling::*)][following-sibling::nu[@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::delta[@token][@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 2]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="nb" xml:id="id1"> <theta false="solid 1px green" xml:id="id2"> @@ -7807,6 +9152,11 @@ </test> <test> <xpath>//theta/omega[starts-with(@abort,"fal")][not(following-sibling::*)]//rho[@xml:lang="en-GB"][following-sibling::*[position()=4]][following-sibling::sigma[@name="100%"][@xml:lang="en"][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::phi[@xml:lang="en"][@xml:id="id1"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::upsilon[@xml:id="id2"][preceding-sibling::*[position() = 4]][not(following-sibling::*)][not(preceding-sibling::upsilon)]//kappa[@xml:id="id3"][following-sibling::beta[contains(concat(@string,"$"),"ontent$")][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@data="true"][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//lambda[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="nb"][not(following-sibling::*)]//delta[starts-with(concat(@data,"-"),"true-")][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::gamma[@xml:id="id7"][following-sibling::pi[starts-with(@content,"12")][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/rho[@xml:lang="en-GB"][@xml:id="id9"]/kappa[@xml:lang="no-nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]]]]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <theta> <omega abort="false"> @@ -7841,6 +9191,11 @@ </test> <test> <xpath>//delta[@xml:id="id1"]/pi[contains(concat(@att,"$"),"e$")][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[not(preceding-sibling::*)][not(parent::*/*[position()=2])]/zeta[starts-with(concat(@attr,"-"),"123456789-")][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[@xml:id="id4"][not(following-sibling::*)]//nu[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[starts-with(concat(@false,"-"),"solid 1px green-")][@xml:lang="no"][@xml:id="id5"]//gamma[@or][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[starts-with(concat(@true,"-"),"this.nodeValue-")][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <delta xml:id="id1"> <pi att="true"/> @@ -7864,6 +9219,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]//eta[contains(concat(@content,"$"),"olid 1px green$")][@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::epsilon[@data][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[starts-with(concat(@content,"-"),"true-")][@xml:id="id3"]//nu[@xml:lang="no-nb"][not(child::node())][following-sibling::omega[@attr="123456789"][@xml:lang="en-GB"][not(child::node())][following-sibling::pi[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="no"][not(following-sibling::*)]//zeta[@xml:id="id5"][not(following-sibling::*)]/lambda[@name][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::*[@content][preceding-sibling::*[position() = 2]][not(following-sibling::any)]//epsilon[@attr][@xml:id="id6"][not(child::node())][following-sibling::nu[contains(concat(@attr,"$"),"_blank$")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::nu)]/*[starts-with(concat(@false,"-"),"attribute value-")][@xml:lang="en-GB"][not(preceding-sibling::*)]//eta[starts-with(@src,"thi")][@xml:lang="nb"][not(preceding-sibling::*)]/sigma[@xml:lang="en"][not(child::node())][following-sibling::pi[contains(concat(@attribute,"$"),"bute$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:id="id8"][preceding-sibling::*[position() = 2]]//epsilon[not(preceding-sibling::*)]//rho[contains(concat(@title,"$"),"true$")][@xml:id="id9"][not(following-sibling::*)]/epsilon[@xml:lang="en-GB"][@xml:id="id10"][following-sibling::pi[@xml:id="id11"]/epsilon[@xml:id="id12"]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <sigma xml:id="id1"> <eta content="solid 1px green" xml:lang="no" xml:id="id2"/> @@ -7907,6 +9267,11 @@ </test> <test> <xpath>//delta[contains(concat(@att,"$")," 1px green$")][@xml:lang="no"][@xml:id="id1"]/omicron[@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@delete][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[@xml:lang="nb"][not(parent::*/*[position()=2])]/kappa[contains(@desciption,"deV")][not(preceding-sibling::*)][following-sibling::rho[contains(concat(@object,"$"),"nk$")][preceding-sibling::*[position() = 1]][following-sibling::theta[@true="_blank"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/theta[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <delta att="solid 1px green" xml:lang="no" xml:id="id1"> <omicron xml:lang="en"/> @@ -7926,6 +9291,11 @@ </test> <test> <xpath>//beta[contains(@delete,"lue")]/nu[not(preceding-sibling::*)]/delta[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[contains(concat(@att,"$"),".nodeValue$")][following-sibling::psi[@xml:id="id2"]//tau[@xml:lang="nb"]/rho[starts-with(concat(@token,"-"),"true-")][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 1]]//upsilon[@name="attribute value"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[starts-with(concat(@attribute,"-"),"_blank-")][not(following-sibling::*)]//xi[contains(@and,"ttribute ")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][following-sibling::iota[starts-with(@and,"100")][@xml:lang="en"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]//tau[@number][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@xml:lang="en-GB"][not(child::node())][following-sibling::iota[@and][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[@xml:id="id5"]/phi[starts-with(concat(@title,"-"),"_blank-")][@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id7"][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <beta delete="attribute value"> <nu> @@ -7963,6 +9333,11 @@ </test> <test> <xpath>//gamma[@or][@xml:lang="en"]//nu[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[starts-with(concat(@object,"-"),"solid 1px green-")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[contains(concat(@string,"$")," green$")][following-sibling::kappa[@xml:lang="nb"][@xml:id="id3"][following-sibling::eta[starts-with(@token,"another")][@xml:id="id4"][following-sibling::*[position()=3]][following-sibling::nu[contains(@false,"te-value")][preceding-sibling::*[position() = 3]][following-sibling::iota[preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::epsilon[contains(@attr,"olid 1px gre")][@xml:id="id5"][preceding-sibling::*[position() = 5]]/zeta[@true][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[contains(@abort,"t")][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[@xml:id="id7"][following-sibling::omicron[@src][preceding-sibling::*[position() = 1]]//alpha[starts-with(concat(@title,"-"),"content-")][@xml:id="id8"][not(following-sibling::*)]//iota[@abort][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:lang="no-nb"][@xml:id="id9"][not(following-sibling::*)]/alpha[starts-with(@string,"attribut")][@xml:lang="no-nb"][@xml:id="id10"]/kappa[not(child::node())][following-sibling::alpha[starts-with(@class,"123456789")][@xml:id="id11"]]]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>1</nth> + </result> <tree> <gamma or="false" xml:lang="en"> <nu xml:lang="en-GB" xml:id="id1"> @@ -7999,6 +9374,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]/zeta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::kappa[starts-with(@and,"another att")][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/phi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:id="id5"][following-sibling::psi[starts-with(concat(@token,"-"),"attribute-")][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::iota[following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[contains(concat(@content,"$"),"3456789$")][@xml:id="id7"][preceding-sibling::*[position() = 4]][following-sibling::rho[@xml:id="id8"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <alpha xml:id="id1"> <zeta xml:id="id2"/> @@ -8018,6 +9398,11 @@ </test> <test> <xpath>//eta[@attr="100%"][@xml:lang="en"]/chi[@string="attribute-value"][@xml:id="id1"][not(following-sibling::*)]/epsilon[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::gamma[contains(@attrib,"ttribut")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 2]]//nu[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@data][@xml:lang="no-nb"][not(following-sibling::*)]/xi[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]//xi[@xml:id="id3"][not(following-sibling::*)]/nu[contains(concat(@name,"$"),"true$")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <eta attr="100%" xml:lang="en"> <chi string="attribute-value" xml:id="id1"> @@ -8045,6 +9430,11 @@ </test> <test> <xpath>//phi[@xml:lang="no-nb"]//theta[following-sibling::mu[starts-with(concat(@attr,"-"),"attribute-")][@xml:id="id1"][following-sibling::kappa[@xml:id="id2"][not(following-sibling::*)]//theta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//*[contains(concat(@data,"$"),"100%$")][@xml:id="id3"][not(child::node())][following-sibling::delta[@true="123456789"][preceding-sibling::*[position() = 1]]//epsilon[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::zeta/psi[@xml:lang="en-GB"]/kappa[not(preceding-sibling::*)][not(preceding-sibling::kappa)][not(child::node())][following-sibling::nu[starts-with(@abort,"_blan")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[contains(@false,"t")][not(preceding-sibling::*)][not(following-sibling::*)]/chi[following-sibling::omicron[@number="false"][preceding-sibling::*[position() = 1]]/tau[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omega[@class][@xml:lang="en"]//chi[@or][following-sibling::*[position()=1]][following-sibling::eta[@xml:lang="no-nb"][@xml:id="id5"][not(following-sibling::*)]//kappa[starts-with(concat(@or,"-"),"100%-")][@xml:id="id6"]//beta[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][position() = 1]]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="no-nb"> <theta/> @@ -8085,6 +9475,11 @@ </test> <test> <xpath>//lambda[@xml:lang="no-nb"][@xml:id="id1"]//epsilon[@xml:lang="en-GB"][not(following-sibling::*)]//upsilon[contains(@or,"f")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::tau[@object="123456789"][@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[starts-with(concat(@delete,"-"),"123456789-")][@xml:lang="en"]//pi[starts-with(concat(@string,"-"),"false-")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@number][@xml:lang="en-GB"][@xml:id="id4"][not(following-sibling::*)]/nu[contains(concat(@class,"$"),"green$")][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[starts-with(@abort,"tr")][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[starts-with(@src,"at")][@xml:id="id7"][preceding-sibling::*[position() = 2]]/delta[contains(@or,"ute valu")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::upsilon[@object][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/kappa//theta[not(following-sibling::*)]//theta[@xml:lang="no"][not(preceding-sibling::*)]/epsilon[@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[contains(@attrib,"e")][@xml:id="id10"][following-sibling::lambda[preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 2]][following-sibling::iota[not(child::node())][following-sibling::nu[@delete][preceding-sibling::*[position() = 4]][position() = 1]][position() = 1]]]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="no-nb" xml:id="id1"> <epsilon xml:lang="en-GB"> @@ -8127,6 +9522,11 @@ </test> <test> <xpath>//psi[@xml:lang="en-GB"][@xml:id="id1"]//gamma[@xml:id="id2"][not(preceding-sibling::*)]//kappa[@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]/nu[@name="123456789"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@att][following-sibling::gamma[@att][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[starts-with(@or,"attribute")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]//gamma[@xml:id="id5"]//theta[@xml:id="id6"][not(preceding-sibling::*)]/rho[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::nu[starts-with(@content,"another attribute value")][preceding-sibling::*[position() = 1]]/upsilon[@true="100%"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta//alpha[@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id9"][not(following-sibling::*)]//theta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[starts-with(@class,"fal")][@xml:id="id10"][not(preceding-sibling::*)]//alpha[contains(concat(@src,"$"),"alse$")][@xml:id="id11"][following-sibling::tau[@xml:lang="no"][@xml:id="id12"]/omega[not(following-sibling::*)]//alpha[contains(concat(@attribute,"$"),"content$")][@xml:lang="en"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="en-GB" xml:id="id1"> <gamma xml:id="id2"> @@ -8169,6 +9569,11 @@ </test> <test> <xpath>//gamma[@xml:lang="nb"][@xml:id="id1"]//epsilon[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)]//nu[@and="false"][not(preceding-sibling::*)][following-sibling::chi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[@attr][following-sibling::*[position()=2]][following-sibling::chi[@src="_blank"][not(child::node())][following-sibling::chi[@xml:lang="en-US"][preceding-sibling::*[position() = 2]]/chi[@insert="content"][@xml:lang="no"][@xml:id="id3"]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <gamma xml:lang="nb" xml:id="id1"> <epsilon xml:lang="no-nb" xml:id="id2"> @@ -8188,6 +9593,11 @@ </test> <test> <xpath>//nu[@xml:lang="nb"][@xml:id="id1"]//beta[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[not(preceding-sibling::*)][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:lang="en"][not(child::node())][following-sibling::beta[@token][@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//delta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[contains(concat(@abort,"$"),"e$")][@xml:lang="nb"]/epsilon[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::psi[starts-with(@desciption,"tr")][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::tau[starts-with(@object,"attribute")][@xml:id="id5"][preceding-sibling::*[position() = 3]]//omicron[@or][@xml:lang="no-nb"][not(preceding-sibling::*)][not(preceding-sibling::omicron)]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="nb" xml:id="id1"> <beta xml:lang="en" xml:id="id2"/> @@ -8215,6 +9625,11 @@ </test> <test> <xpath>//alpha[@xml:lang="no"][@xml:id="id1"]/pi[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::tau[@insert][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[@abort="_blank"][@xml:lang="no"][not(child::node())][following-sibling::chi[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 3]][following-sibling::epsilon[contains(@true,"another attribute")][not(following-sibling::*)]//sigma[@xml:id="id4"][not(child::node())][following-sibling::lambda[preceding-sibling::*[position() = 1]]//rho[not(preceding-sibling::*)][following-sibling::phi[@xml:id="id5"][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id6"]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="no" xml:id="id1"> <pi xml:lang="no-nb" xml:id="id2"/> @@ -8236,6 +9651,11 @@ </test> <test> <xpath>//phi/epsilon[@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]//iota[@xml:id="id2"][not(following-sibling::*)]/beta[@attrib][@xml:id="id3"][not(preceding-sibling::*)]//lambda[@data="attribute"][@xml:lang="nb"][not(preceding-sibling::*)]/epsilon[starts-with(concat(@string,"-"),"false-")][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)]/xi[@or][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[starts-with(concat(@content,"-"),"123456789-")][@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//kappa[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[contains(@att,"10")][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="no"][@xml:id="id7"]/upsilon[@content][@xml:lang="no-nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[@and="100%"][following-sibling::*[position()=1]][following-sibling::nu[preceding-sibling::*[position() = 2]]/omicron[@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@name="this-is-att-value"][@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)]/nu[contains(concat(@and,"$"),"te value$")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:id="id10"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>1</nth> + </result> <tree> <phi> <epsilon xml:lang="en-GB" xml:id="id1"> @@ -8276,6 +9696,11 @@ </test> <test> <xpath>//beta[contains(concat(@attribute,"$"),"9$")][@xml:lang="nb"]//xi[@xml:id="id1"][following-sibling::*[position()=5]][not(child::node())][following-sibling::pi[@xml:lang="en"][not(child::node())][following-sibling::upsilon[@xml:lang="en"][following-sibling::iota[contains(@title,"lue")][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::theta[starts-with(concat(@attribute,"-"),"attribute-")][@xml:id="id2"][preceding-sibling::*[position() = 4]][following-sibling::omega[contains(@delete,"9")][@xml:lang="en"][not(following-sibling::*)]/tau[@xml:lang="no"][not(preceding-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <beta attribute="123456789" xml:lang="nb"> <xi xml:id="id1"/> @@ -8293,6 +9718,11 @@ </test> <test> <xpath>//lambda[starts-with(concat(@name,"-"),"true-")]//beta[@xml:lang="en"][@xml:id="id1"][following-sibling::nu[contains(concat(@data,"$"),"attribute value$")][@xml:lang="no-nb"]//upsilon[contains(@number,"alue")][following-sibling::delta[@xml:lang="nb"][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id2"][following-sibling::chi[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][following-sibling::epsilon[@attribute][@xml:id="id3"][preceding-sibling::*[position() = 4]][following-sibling::kappa[@abort="123456789"][@xml:lang="no-nb"][not(following-sibling::*)]//omega[@xml:lang="nb"][following-sibling::epsilon[not(following-sibling::*)]//omicron[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::pi//lambda[not(following-sibling::*)]]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <lambda name="true"> <beta xml:lang="en" xml:id="id1"/> @@ -8319,6 +9749,11 @@ </test> <test> <xpath>//phi[@xml:lang="en"][@xml:id="id1"]/kappa[@token][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]//iota[following-sibling::*[position()=1]][following-sibling::pi[@class][@xml:lang="nb"]/iota[starts-with(concat(@attribute,"-"),"content-")][@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/zeta[@xml:lang="en"][not(child::node())][following-sibling::epsilon[@content][not(following-sibling::*)]//lambda[@xml:id="id4"]/lambda[@name][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="nb"]/xi[@xml:id="id5"][not(following-sibling::*)]/iota[starts-with(@src,"100")][@xml:id="id6"][not(following-sibling::*)]/rho[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@insert][@xml:lang="no-nb"][@xml:id="id8"][not(child::node())][following-sibling::omicron[starts-with(concat(@name,"-"),"solid 1px green-")][@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en" xml:id="id1"> <kappa token="attribute" xml:lang="nb"/> @@ -8352,6 +9787,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]//iota[contains(concat(@number,"$"),"odeValue$")][@xml:id="id2"]//iota[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@content][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[following-sibling::rho[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::iota[following-sibling::theta[@true][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 4]][following-sibling::xi[starts-with(concat(@content,"-"),"solid 1px green-")][@xml:lang="en-US"][not(child::node())][following-sibling::rho[contains(@content,"%")][@xml:id="id5"][not(child::node())][following-sibling::upsilon[@abort][@xml:id="id6"][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>2</nth> + </result> <tree> <sigma xml:id="id1"> <iota number="this.nodeValue" xml:id="id2"> @@ -8373,6 +9813,11 @@ </test> <test> <xpath>//iota[starts-with(concat(@or,"-"),"attribute value-")][@xml:id="id1"]/beta[not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:id="id2"]//nu[contains(@class,"e ")][@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//upsilon[not(following-sibling::*)]/tau[@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]//xi[@att="true"][@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@xml:lang="no"][@xml:id="id6"][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <iota or="attribute value" xml:id="id1"> <beta/> @@ -8394,6 +9839,11 @@ </test> <test> <xpath>//mu//alpha[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::theta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@title][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=4]][not(preceding-sibling::rho)][following-sibling::gamma[contains(concat(@att,"$"),"ute$")][@xml:lang="no-nb"][not(child::node())][following-sibling::tau[contains(@object,"b")][@xml:lang="en-US"][preceding-sibling::*[position() = 4]][following-sibling::zeta[@class][@xml:id="id4"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 6]][not(following-sibling::*)]//lambda[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <mu> <alpha xml:id="id1"/> @@ -8412,6 +9862,11 @@ </test> <test> <xpath>//chi/tau[starts-with(@or,"this.nodeValu")][@xml:id="id1"][not(following-sibling::*)]//delta[contains(concat(@number,"$"),"ribute$")][@xml:lang="no-nb"]//alpha[@xml:id="id2"][not(child::node())][following-sibling::nu[starts-with(@false,"attribu")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[@false="attribute-value"][not(preceding-sibling::*)]//mu[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[starts-with(@false,"123")][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]/zeta[contains(concat(@and,"$"),"ontent$")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:lang="nb"][@xml:id="id6"]/delta[@title][@xml:lang="en"][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@true][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <chi> <tau or="this.nodeValue" xml:id="id1"> @@ -8441,6 +9896,11 @@ </test> <test> <xpath>//mu[contains(concat(@attrib,"$"),"nk$")][@xml:id="id1"]/omicron[following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[starts-with(@token,"another attribute va")]//upsilon[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]/omega[@abort][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@content][not(following-sibling::*)]/zeta[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]//gamma[contains(@true,"is-is-att-val")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[not(following-sibling::*)]//omicron[contains(@attr,"ue")][@xml:lang="no-nb"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <mu attrib="_blank" xml:id="id1"> <omicron/> @@ -8466,6 +9926,11 @@ </test> <test> <xpath>//zeta[starts-with(concat(@desciption,"-"),"this.nodeValue-")]//chi[contains(concat(@attrib,"$"),"789$")][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:lang="no"][not(following-sibling::*)]/eta[not(child::node())][following-sibling::chi[@and][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[@title][@xml:lang="en-GB"][not(child::node())][following-sibling::beta[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <zeta desciption="this.nodeValue"> <chi attrib="123456789" xml:id="id1"/> @@ -8483,6 +9948,11 @@ </test> <test> <xpath>//lambda[@att][@xml:lang="en-GB"]/delta[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)]/upsilon[@token][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::delta[starts-with(concat(@att,"-"),"_blank-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/beta[starts-with(concat(@attrib,"-"),"attribute value-")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[@xml:id="id4"][following-sibling::rho[not(following-sibling::*)]/eta[contains(@object,"d 1")][following-sibling::sigma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[contains(concat(@att,"$"),"ank$")][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[@xml:lang="en-US"]//nu[@title][@xml:lang="en"][not(preceding-sibling::*)]/gamma[@delete][@xml:lang="en"][not(following-sibling::*)][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <lambda att="attribute" xml:lang="en-GB"> <delta xml:lang="en-GB" xml:id="id1"> @@ -8513,6 +9983,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="no-nb"][@xml:id="id1"]//chi[@abort][@xml:lang="nb"][@xml:id="id2"][following-sibling::psi[@false][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::theta[@attrib="attribute-value"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[not(child::node())][following-sibling::upsilon[not(following-sibling::*)]/phi[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::epsilon[contains(concat(@abort,"$"),"e$")][not(following-sibling::*)]//delta[@xml:id="id4"][not(following-sibling::*)]//xi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::theta[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omega[contains(@src,"-valu")][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::*[@xml:lang="no-nb"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="en-US"][@xml:id="id8"]/zeta[@attribute][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@attr="attribute-value"][@xml:id="id10"][not(following-sibling::*)]//alpha[@xml:lang="no"]/zeta[@xml:lang="no"][not(following-sibling::*)]/zeta[@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)]//tau[contains(concat(@true,"$"),"3456789$")][@xml:id="id12"][not(following-sibling::*)]/pi[@xml:lang="nb"][following-sibling::iota[@xml:id="id13"]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="no-nb" xml:id="id1"> <chi abort="false" xml:lang="nb" xml:id="id2"/> @@ -8555,6 +10030,11 @@ </test> <test> <xpath>//nu[contains(concat(@or,"$"),"reen$")][@xml:id="id1"]//epsilon[@xml:lang="en"][not(child::node())][following-sibling::epsilon[@xml:lang="en-US"][not(following-sibling::*)]/gamma[@xml:id="id2"][not(following-sibling::*)]//kappa[@abort][@xml:id="id3"][not(child::node())][following-sibling::mu[@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[@xml:lang="en"][@xml:id="id5"]/omicron[following-sibling::tau[starts-with(@attr,"attribu")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::rho[contains(concat(@class,"$"),".nodeValue$")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/tau[not(preceding-sibling::*)][not(following-sibling::*)]/eta[contains(@title,"d")][@xml:id="id6"][not(following-sibling::*)]/xi[@class][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[contains(@title,"456")][@xml:lang="no-nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@attribute][@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 2]]//epsilon[@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[contains(@desciption,"ue")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::lambda[@xml:id="id11"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::eta[@xml:lang="no"][following-sibling::*[contains(@data,"e")][@xml:lang="no"]/*[@xml:lang="en-GB"][@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[contains(@attr,"ttribute")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::theta or following-sibling::theta)]/chi[@xml:lang="en-US"][@xml:id="id13"][position() = 1]][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <nu or="solid 1px green" xml:id="id1"> <epsilon xml:lang="en"/> @@ -8597,6 +10077,11 @@ </test> <test> <xpath>//omicron[@data="attribute-value"]/kappa[@xml:lang="en"][@xml:id="id1"]/beta[@and][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::lambda)][following-sibling::upsilon[@xml:lang="nb"][not(following-sibling::*)]/delta[starts-with(concat(@and,"-"),"true-")][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[contains(concat(@data,"$"),"px green$")]//iota[not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::delta[preceding-sibling::*[position() = 1]][following-sibling::chi[starts-with(concat(@number,"-"),"true-")][@xml:lang="no"][not(child::node())][following-sibling::upsilon[contains(concat(@class,"$"),"100%$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//lambda[@xml:id="id6"][not(preceding-sibling::*)]/sigma[@attribute][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omicron data="attribute-value"> <kappa xml:lang="en" xml:id="id1"> @@ -8629,6 +10114,11 @@ </test> <test> <xpath>//theta[@number="content"][@xml:lang="en-GB"][@xml:id="id1"]//psi[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@attrib="true"][not(following-sibling::*)]//kappa[starts-with(@attrib,"content")][@xml:lang="en-US"][not(following-sibling::*)]//phi[starts-with(concat(@content,"-"),"attribute-")][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[contains(@string,"ue")][@xml:id="id3"][preceding-sibling::*[position() = 1]]/upsilon[@xml:lang="en-US"]//chi[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <theta number="content" xml:lang="en-GB" xml:id="id1"> <psi xml:lang="no-nb" xml:id="id2"> @@ -8650,6 +10140,11 @@ </test> <test> <xpath>//delta[@insert][@xml:lang="no-nb"][@xml:id="id1"]//rho[@false="this-is-att-value"][not(following-sibling::*)]//kappa[contains(@and,"3456")][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@true][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@xml:id="id3"]//chi[starts-with(concat(@object,"-"),"another attribute value-")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::gamma[@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@title][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 2]]/chi[contains(concat(@or,"$"),"een$")][@xml:id="id7"][not(preceding-sibling::*)][not(preceding-sibling::chi)][following-sibling::tau[@content][@xml:lang="no"]//omega[starts-with(@number,"solid 1")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[contains(concat(@src,"$"),"alse$")]/alpha[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[not(child::node())][following-sibling::phi[contains(concat(@abort,"$"),"0%$")][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(preceding-sibling::phi)][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id9"][preceding-sibling::*[position() = 2]][following-sibling::chi[@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][not(preceding-sibling::chi)]/eta[@xml:lang="no"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@token][@xml:lang="en"][not(following-sibling::*)]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <delta insert="this-is-att-value" xml:lang="no-nb" xml:id="id1"> <rho false="this-is-att-value"> @@ -8688,6 +10183,11 @@ </test> <test> <xpath>//chi[@xml:lang="en"]//omicron[@object][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@att="attribute"][@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[starts-with(concat(@title,"-"),"this.nodeValue-")][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[not(child::node())][following-sibling::psi[contains(@delete,"ib")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]//theta[@xml:id="id2"][following-sibling::rho[not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="en"> <omicron object="100%"/> @@ -8707,6 +10207,11 @@ </test> <test> <xpath>//chi[@xml:lang="en-US"]/epsilon[contains(concat(@attrib,"$"),"ent$")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::rho[not(following-sibling::*)]/chi[@true][@xml:lang="no"][@xml:id="id1"]//zeta[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::theta[@xml:id="id3"][not(child::node())][following-sibling::delta[@xml:lang="no"][not(following-sibling::*)]//alpha[@or="true"][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//nu[contains(concat(@attrib,"$"),"ue$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[contains(concat(@delete,"$"),"se$")][@xml:lang="en"][@xml:id="id5"][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id6"][following-sibling::chi[contains(@attribute,"d 1px green")]/nu[@xml:lang="en-US"][@xml:id="id7"][not(following-sibling::*)]//phi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::nu[@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="en-US"> <epsilon attrib="content" xml:lang="en"/> @@ -8739,6 +10244,11 @@ </test> <test> <xpath>//beta[starts-with(concat(@object,"-"),"_blank-")]//iota[not(following-sibling::*)]/theta[starts-with(concat(@number,"-"),"123456789-")][@xml:lang="nb"][@xml:id="id1"]//delta[@true][not(following-sibling::*)]//chi[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]/psi[contains(concat(@number,"$"),"ent$")]/beta[contains(concat(@name,"$"),"ribute value$")][@xml:id="id3"][not(preceding-sibling::*)]//omega[@object="attribute"][not(following-sibling::*)]/beta[not(preceding-sibling::*)][not(following-sibling::*)]//nu[@attribute="this-is-att-value"][@xml:lang="no"][not(child::node())][following-sibling::rho[@content][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[not(child::node())][following-sibling::epsilon[starts-with(concat(@false,"-"),"true-")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]//mu[starts-with(@src,"fals")][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[starts-with(@object,"attribute v")][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::sigma[starts-with(concat(@desciption,"-"),"_blank-")][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:id="id6"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <beta object="_blank"> <iota> @@ -8774,6 +10284,11 @@ </test> <test> <xpath>//pi[@xml:lang="en-US"]//lambda[@data="123456789"][following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:id="id2"][preceding-sibling::*[position() = 2]]//phi[starts-with(concat(@delete,"-"),"true-")][@xml:lang="en"][not(following-sibling::*)]/sigma[contains(@desciption,"lank")][not(following-sibling::*)]//psi[starts-with(@delete,"a")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::delta[starts-with(@attr,"tru")][following-sibling::*[position()=1]][following-sibling::tau[starts-with(concat(@number,"-"),"content-")][preceding-sibling::*[position() = 2]]//gamma[not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=4]][not(child::node())][following-sibling::psi[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::eta[@xml:id="id6"][preceding-sibling::*[position() = 4]][following-sibling::epsilon[@src][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[starts-with(concat(@or,"-"),"false-")][@xml:id="id8"][preceding-sibling::*[position() = 6]][not(following-sibling::*)]//pi[not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@number][@xml:id="id9"]//tau[starts-with(@insert,"tru")][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::upsilon[@xml:lang="nb"][@xml:id="id10"][not(child::node())][following-sibling::upsilon[contains(@desciption,"lue")][@xml:id="id11"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="en-US"> <lambda data="123456789"/> @@ -8809,6 +10324,11 @@ </test> <test> <xpath>//sigma[@true][@xml:lang="en-US"][@xml:id="id1"]/xi[@title][@xml:lang="en-US"][@xml:id="id2"][following-sibling::kappa[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]//omicron[@xml:lang="en-GB"][following-sibling::kappa[not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::omicron[starts-with(concat(@desciption,"-"),"content-")][@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]//gamma[@xml:lang="nb"][not(preceding-sibling::*)]/lambda[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::*[starts-with(concat(@string,"-"),"100%-")][not(following-sibling::*)]/tau[@and][not(preceding-sibling::*)]//psi[starts-with(concat(@string,"-"),"_blank-")][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[not(child::node())][following-sibling::beta[contains(concat(@false,"$"),"ttribute value$")][@xml:id="id7"][preceding-sibling::*[position() = 2]]//rho[@xml:lang="en-GB"][following-sibling::omega[@class][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <sigma true="123456789" xml:lang="en-US" xml:id="id1"> <xi title="attribute-value" xml:lang="en-US" xml:id="id2"/> @@ -8839,6 +10359,11 @@ </test> <test> <xpath>//upsilon[starts-with(@or,"solid 1p")][@xml:id="id1"]/epsilon[starts-with(@or,"100%")][@xml:id="id2"][not(preceding-sibling::*)]/psi[contains(concat(@or,"$"),"alue$")][@xml:id="id3"][not(following-sibling::*)]//theta[starts-with(@insert,"attribute v")][not(preceding-sibling::*)]//theta[contains(concat(@title,"$"),"ibute value$")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>1</nth> + </result> <tree> <upsilon or="solid 1px green" xml:id="id1"> <epsilon or="100%" xml:id="id2"> @@ -8856,6 +10381,11 @@ </test> <test> <xpath>//nu[contains(concat(@object,"$"),"ue$")][@xml:lang="en-GB"][@xml:id="id1"]//gamma[@xml:lang="no"][not(child::node())][following-sibling::*[@xml:lang="no"]//tau[starts-with(concat(@title,"-"),"true-")][@xml:id="id2"][not(preceding-sibling::*)]/gamma[contains(@name,"10")][not(preceding-sibling::*)][following-sibling::beta[contains(concat(@att,"$"),"s.nodeValue$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:lang="no"][following-sibling::*[position()=4]][not(child::node())][following-sibling::psi[@abort][@xml:id="id3"][not(child::node())][following-sibling::psi[contains(concat(@object,"$"),"true$")][following-sibling::delta[@xml:id="id4"][preceding-sibling::*[position() = 5]][following-sibling::alpha[contains(@title,"e")][@xml:id="id5"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <nu object="this-is-att-value" xml:lang="en-GB" xml:id="id1"> <gamma xml:lang="no"/> @@ -8877,6 +10407,11 @@ </test> <test> <xpath>//alpha[@data="attribute"][@xml:lang="en-US"][@xml:id="id1"]/iota[starts-with(@att,"this-is-att-v")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="en"][@xml:id="id3"]/eta[@xml:id="id4"][not(following-sibling::*)]/theta[starts-with(concat(@insert,"-"),"attribute-")][@xml:id="id5"][following-sibling::*[position()=4]][following-sibling::delta[@xml:lang="nb"][not(child::node())][following-sibling::beta[following-sibling::*[position()=2]][following-sibling::upsilon[contains(concat(@insert,"$"),"value$")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::delta[starts-with(concat(@abort,"-"),"attribute-")][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//mu[@xml:lang="en"][@xml:id="id7"][not(child::node())][following-sibling::alpha[@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@xml:lang="nb"][not(following-sibling::*)]/tau[@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[contains(concat(@title,"$"),"ue$")]/phi[@string][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <alpha data="attribute" xml:lang="en-US" xml:id="id1"> <iota att="this-is-att-value" xml:lang="en-GB" xml:id="id2"/> @@ -8907,6 +10442,11 @@ </test> <test> <xpath>//chi//sigma[starts-with(concat(@src,"-"),"true-")][not(following-sibling::*)]/delta[@xml:id="id1"][following-sibling::kappa[preceding-sibling::*[position() = 1]][following-sibling::iota[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/kappa[@or="attribute value"][@xml:lang="no"][not(preceding-sibling::*)]/rho[@xml:lang="no"][@xml:id="id2"]/mu[not(preceding-sibling::*)][following-sibling::nu][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <chi> <sigma src="true"> @@ -8928,6 +10468,11 @@ </test> <test> <xpath>//gamma[contains(concat(@class,"$"),"te$")][@xml:lang="en-US"][@xml:id="id1"]//theta[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)]/lambda[@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[contains(concat(@content,"$"),"ibute-value$")][@xml:lang="en-GB"][@xml:id="id3"]/mu[@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::eta[@xml:lang="en-GB"][@xml:id="id4"][not(following-sibling::*)]//zeta[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[not(child::node())][following-sibling::chi[starts-with(@abort,"an")][@xml:lang="no"][@xml:id="id6"][not(child::node())][following-sibling::epsilon[@number="123456789"][@xml:lang="no-nb"][@xml:id="id7"][not(child::node())][following-sibling::iota[contains(concat(@and,"$"),"odeValue$")][@xml:lang="en-US"][following-sibling::mu[starts-with(@string,"this.")][@xml:id="id8"][preceding-sibling::*[position() = 5]][following-sibling::upsilon[contains(concat(@string,"$"),"lank$")][@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 6]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <gamma class="attribute" xml:lang="en-US" xml:id="id1"> <theta xml:lang="en-GB" xml:id="id2"> @@ -8952,6 +10497,11 @@ </test> <test> <xpath>//eta[@true="100%"]//mu[@xml:lang="no"][not(following-sibling::*)]/omega[@string][@xml:lang="nb"][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::xi[@xml:lang="nb"][@xml:id="id1"][not(following-sibling::*)]/xi[not(following-sibling::*)]//rho[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[following-sibling::kappa[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@delete="attribute"][preceding-sibling::*[position() = 2]][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::nu[starts-with(concat(@abort,"-"),"123456789-")][@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 4]]//eta[contains(concat(@class,"$"),"is-is-att-value$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@attrib][@xml:id="id5"][preceding-sibling::*[position() = 1]]/iota[not(following-sibling::*)]/beta[@string][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]/omega[not(preceding-sibling::*)]][position() = 1]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <eta true="100%"> <mu xml:lang="no"> @@ -8986,6 +10536,11 @@ </test> <test> <xpath>//zeta[@attribute][@xml:lang="en-GB"]//gamma[@string][@xml:lang="en"][not(preceding-sibling::*)]//mu[starts-with(@name,"tru")][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::nu[starts-with(concat(@content,"-"),"true-")][@xml:id="id2"][following-sibling::iota[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::iota[@true][not(child::node())][following-sibling::omicron[@abort][@xml:id="id4"][preceding-sibling::*[position() = 4]]//theta[starts-with(@insert,"at")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@xml:id="id6"]//mu[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::eta[contains(concat(@desciption,"$"),"reen$")][@xml:lang="no-nb"][not(child::node())][following-sibling::eta[starts-with(concat(@attrib,"-"),"attribute-")][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::mu[@xml:id="id8"][following-sibling::lambda[not(following-sibling::*)]/sigma[@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="no"][@xml:id="id9"]/omega[@token][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="nb"]//lambda[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::pi[contains(@token,"x ")][preceding-sibling::*[position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <zeta attribute="attribute-value" xml:lang="en-GB"> <gamma string="this.nodeValue" xml:lang="en"> @@ -9021,6 +10576,11 @@ </test> <test> <xpath>//beta[@xml:lang="nb"][@xml:id="id1"]//iota[contains(concat(@token,"$"),"lank$")][@xml:lang="en"][following-sibling::sigma[starts-with(concat(@token,"-"),"another attribute value-")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][not(child::node())][following-sibling::sigma[@abort][@xml:lang="no"][not(child::node())][following-sibling::rho[not(child::node())][following-sibling::kappa[@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::gamma[@string="100%"][preceding-sibling::*[position() = 5]][following-sibling::epsilon[preceding-sibling::*[position() = 6]]//tau[@xml:id="id3"][not(following-sibling::*)]/beta[starts-with(@and,"fa")][not(following-sibling::*)]/nu[@class][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[contains(concat(@insert,"$"),"this.nodeValue$")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::mu[preceding-sibling::*[position() = 1]][following-sibling::chi[contains(concat(@attrib,"$"),"ute$")][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=4]][following-sibling::*[@xml:id="id7"][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[@xml:lang="no"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=2]][following-sibling::kappa[@xml:lang="en-US"][preceding-sibling::*[position() = 5]][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id8"][not(following-sibling::*)]/kappa[starts-with(concat(@string,"-"),"100%-")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[contains(concat(@content,"$"),"deValue$")][@xml:lang="no"][@xml:id="id9"][not(following-sibling::*)]/theta[contains(@object,"0")][not(following-sibling::*)]//lambda[starts-with(concat(@class,"-"),"this.nodeValue-")][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[starts-with(@insert,"_blan")][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="nb" xml:id="id1"> <iota token="_blank" xml:lang="en"/> @@ -9060,6 +10620,11 @@ </test> <test> <xpath>//theta[contains(concat(@content,"$"),"is.nodeValue$")][@xml:lang="en-US"][@xml:id="id1"]//gamma[starts-with(@or,"t")][@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::beta[@xml:id="id2"][not(following-sibling::*)]//iota[starts-with(@and,"s")][not(preceding-sibling::*)]/psi[starts-with(@attr,"solid 1px")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::kappa[@desciption="attribute"][@xml:lang="nb"][@xml:id="id4"]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <theta content="this.nodeValue" xml:lang="en-US" xml:id="id1"> <gamma or="true" xml:lang="en"/> @@ -9076,6 +10641,11 @@ </test> <test> <xpath>//theta[@xml:lang="nb"]/omicron[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]//xi[contains(concat(@data,"$"),"e$")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[contains(@attribute,"tt-value")][@xml:lang="nb"]/beta[@xml:id="id3"][not(preceding-sibling::*)]/mu[@src][@xml:id="id4"][not(following-sibling::*)]/kappa[@number][@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::eta[@xml:id="id6"][not(following-sibling::*)]/theta[@xml:id="id7"][not(child::node())][following-sibling::theta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::lambda[starts-with(concat(@or,"-"),"another attribute value-")][@xml:lang="en"][following-sibling::xi[@false][@xml:id="id8"][preceding-sibling::*[position() = 3]]//upsilon[@number][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="en"][not(child::node())][following-sibling::eta[@xml:lang="no-nb"]//eta[not(child::node())][following-sibling::eta[@number][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[@src][@xml:id="id10"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="nb"> <omicron xml:lang="nb"/> @@ -9110,6 +10680,11 @@ </test> <test> <xpath>//mu[contains(concat(@name,"$"),"se$")][@xml:lang="no-nb"][@xml:id="id1"]//alpha[@or]/phi[@att="true"][@xml:lang="no-nb"][not(child::node())][following-sibling::beta/gamma[@att][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@insert][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@true][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:id="id3"][following-sibling::omega[contains(concat(@attrib,"$")," value$")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::mu[@abort][@xml:id="id5"][following-sibling::delta[@xml:lang="nb"][preceding-sibling::*[position() = 3]]/iota[@abort][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)]//sigma[@data][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[starts-with(@attrib,"12")][@xml:id="id9"]/pi[@xml:lang="en"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::delta[@xml:lang="en"][@xml:id="id11"][not(child::node())][following-sibling::gamma[@xml:id="id12"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <mu name="false" xml:lang="no-nb" xml:id="id1"> <alpha or="attribute-value"> @@ -9147,6 +10722,11 @@ </test> <test> <xpath>//rho/nu[not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][not(following-sibling::*)]/mu[@xml:lang="no-nb"][not(preceding-sibling::*)]//theta[contains(concat(@number,"$"),".nodeValue$")][@xml:lang="nb"][@xml:id="id1"][not(child::node())][following-sibling::beta[@and="attribute value"][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 2]]//sigma[@attr][@xml:lang="nb"][not(following-sibling::*)]//pi[@content][@xml:id="id3"][not(preceding-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <rho> <nu/> @@ -9168,6 +10748,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]/mu[@xml:id="id2"]/sigma[not(following-sibling::*)]//epsilon[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@and="attribute"][@xml:id="id4"][following-sibling::sigma[contains(@false,"ue")][@xml:id="id5"][preceding-sibling::*[position() = 1]]//iota[@insert][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[starts-with(concat(@attr,"-"),"100%-")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/zeta[@delete][@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::sigma[@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[@xml:id="id10"][not(following-sibling::*)]/pi[contains(concat(@string,"$"),"d 1px green$")][@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)]//psi[@xml:id="id12"]//zeta[not(preceding-sibling::*)][not(preceding-sibling::zeta or following-sibling::zeta)]/eta[@attribute][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:id="id13"]//kappa[@and][@xml:lang="en"][not(following-sibling::*)]/alpha[@abort][@xml:id="id14"]//phi[contains(@title,"ute value")][not(following-sibling::*)]/xi[@xml:lang="no-nb"][@xml:id="id15"][not(following-sibling::*)]/chi[contains(concat(@data,"$"),"ue$")][@xml:lang="no-nb"]//upsilon[@xml:id="id16"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@xml:id="id17"]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <sigma xml:id="id1"> <mu xml:id="id2"> @@ -9217,6 +10802,11 @@ </test> <test> <xpath>//kappa[@xml:id="id1"]/eta[@xml:id="id2"][not(preceding-sibling::*)]//phi[@att="true"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[not(child::node())][following-sibling::omega[@xml:lang="en"][following-sibling::gamma[@xml:id="id4"][following-sibling::alpha[contains(concat(@class,"$"),"lank$")][@xml:lang="en-GB"]/iota[contains(concat(@insert,"$"),"123456789$")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(preceding-sibling::iota)][not(child::node())][following-sibling::rho[contains(@src,"k")][preceding-sibling::*[position() = 1]]/alpha[@string][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::eta[@xml:id="id5"][preceding-sibling::*[position() = 1]]//mu[@insert="this.nodeValue"][not(following-sibling::*)]/pi[contains(concat(@attribute,"$"),"is-att-value$")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="no-nb"][@xml:id="id7"][not(preceding-sibling::*)]//epsilon[@xml:lang="en"][@xml:id="id8"]//omicron[not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::omega[@xml:id="id9"][following-sibling::omega[@and="true"][@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::delta[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="en-US"][following-sibling::nu[following-sibling::phi[@string][@xml:lang="no-nb"][not(following-sibling::*)]/upsilon[contains(concat(@att,"$")," attribute value$")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)]]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <kappa xml:id="id1"> <eta xml:id="id2"> @@ -9260,6 +10850,11 @@ </test> <test> <xpath>//omega/rho[starts-with(concat(@content,"-"),"solid 1px green-")][not(preceding-sibling::*)][not(following-sibling::*)]/iota[contains(@or,"a")][@xml:id="id1"][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@false][@xml:lang="en"][following-sibling::zeta[contains(concat(@title,"$"),"this-is-att-value$")][@xml:lang="nb"][not(following-sibling::*)]//theta[@attr][not(preceding-sibling::*)]/beta[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@string][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[contains(@att,"k")][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::alpha[@false="true"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id7"]//delta[contains(@insert,"bute value")][@xml:lang="en-US"][not(following-sibling::*)]/eta[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::xi[@att][preceding-sibling::*[position() = 1]]/xi[@xml:lang="no"][not(child::node())][following-sibling::alpha[@or="this.nodeValue"]//delta[@title="true"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="no"]/omega[@xml:id="id9"]/sigma[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <omega> <rho content="solid 1px green"> @@ -9303,6 +10898,11 @@ </test> <test> <xpath>//beta[@xml:id="id1"]//chi[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::theta[@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//theta[starts-with(@string,"100")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[not(child::node())][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]//tau[@attr][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@xml:id="id6"][not(preceding-sibling::*)]/zeta[@title="123456789"][@xml:id="id7"][not(preceding-sibling::*)]//xi[@xml:lang="nb"][not(preceding-sibling::*)]//lambda[starts-with(concat(@object,"-"),"false-")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]]/omega[@true][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::delta[@xml:id="id10"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[contains(concat(@true,"$"),"ue$")][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <beta xml:id="id1"> <chi xml:lang="en-GB" xml:id="id2"> @@ -9335,6 +10935,11 @@ </test> <test> <xpath>//nu[starts-with(@name,"123456")][@xml:lang="nb"]//gamma[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id2"]/lambda[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)]//delta[starts-with(concat(@attr,"-"),"another attribute value-")][@xml:lang="en-US"][not(following-sibling::*)]//zeta[@xml:lang="en"][not(following-sibling::*)]//theta[starts-with(concat(@number,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::epsilon[contains(@src,"t")][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@att][@xml:id="id6"][not(child::node())][following-sibling::psi[@xml:lang="en"]//theta[@attribute][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::lambda[@data="attribute value"][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[@object]//mu[@xml:lang="en-GB"][@xml:id="id8"]//tau[@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)]//delta[@xml:lang="en"][not(preceding-sibling::*)]//*[@xml:lang="en-US"][@xml:id="id10"][not(following-sibling::*)]/pi[@xml:lang="no"][@xml:id="id11"][not(child::node())][following-sibling::zeta[@xml:lang="nb"][@xml:id="id12"][preceding-sibling::*[position() = 1]]//gamma[not(preceding-sibling::*)][not(following-sibling::gamma)]/theta[contains(@attrib,"e")][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[starts-with(concat(@or,"-"),"another attribute value-")][@xml:id="id13"][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <nu name="123456789" xml:lang="nb"> <gamma xml:lang="nb" xml:id="id1"/> @@ -9378,6 +10983,11 @@ </test> <test> <xpath>//mu[starts-with(concat(@or,"-"),"_blank-")][@xml:id="id1"]//zeta[@xml:lang="en"][not(following-sibling::*)]//upsilon[@xml:id="id2"][not(preceding-sibling::*)]//eta[@true][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[contains(@content,"on")][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@class][@xml:id="id4"][not(preceding-sibling::iota)][not(child::node())][following-sibling::omega[@false][@xml:lang="en-US"][preceding-sibling::*[position() = 2]]//*[@class][@xml:id="id5"][not(following-sibling::*)]/delta[starts-with(concat(@insert,"-"),"this.nodeValue-")][following-sibling::omega[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:lang="en-US"][@xml:id="id7"][not(following-sibling::*)]//lambda[starts-with(concat(@content,"-"),"this-")][@xml:lang="en-US"][following-sibling::*[position()=4]][not(child::node())][following-sibling::alpha[starts-with(@class,"attribute-v")][preceding-sibling::*[position() = 1]][following-sibling::theta[contains(@false,"bu")][@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 2]][following-sibling::delta[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::beta[@name="_blank"][@xml:id="id9"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//gamma[@xml:lang="en-GB"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::delta[contains(concat(@desciption,"$"),"-is-att-value$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[contains(concat(@attr,"$"),"56789$")][@xml:lang="no"][preceding-sibling::*[position() = 2]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <mu or="_blank" xml:id="id1"> <zeta xml:lang="en"> @@ -9412,6 +11022,11 @@ </test> <test> <xpath>//*[@xml:lang="no-nb"]/*[contains(@class,"k")][@xml:lang="en-GB"]/beta[@desciption="false"][@xml:lang="en-GB"][not(preceding-sibling::*)][not(preceding-sibling::beta)][not(child::node())][following-sibling::sigma[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::pi[contains(concat(@title,"$"),"t$")][@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)]/omega[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@xml:lang="en"][@xml:id="id2"]//mu[contains(@and,"bute va")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[contains(concat(@delete,"$"),"100%$")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::pi[@xml:id="id5"][not(child::node())][following-sibling::phi[contains(@src,"x green")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=6]][following-sibling::tau[contains(@object,"conte")][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=5]][following-sibling::phi[following-sibling::xi[@false="content"][@xml:lang="en-GB"][@xml:id="id7"][preceding-sibling::*[position() = 5]][following-sibling::phi[@xml:lang="no"][@xml:id="id8"][preceding-sibling::*[position() = 6]][following-sibling::*[position()=2]][following-sibling::tau[@xml:id="id9"][preceding-sibling::*[position() = 7]][following-sibling::eta[@xml:id="id10"]//chi[@xml:id="id11"][not(preceding-sibling::*)][following-sibling::alpha[@false][@xml:lang="no"][@xml:id="id12"][not(following-sibling::*)]/iota[not(child::node())][following-sibling::zeta[@xml:lang="no"][@xml:id="id13"][not(following-sibling::*)]//beta[contains(@att,"lue")][@xml:lang="en-US"]/chi[@xml:lang="en-US"][@xml:id="id14"][not(preceding-sibling::*)][position() = 1]]]]][position() = 1]]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="no-nb"> <any class="_blank" xml:lang="en-GB"> @@ -9452,6 +11067,11 @@ </test> <test> <xpath>//mu[@xml:lang="en"][@xml:id="id1"]/eta[@insert][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)]/delta[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::beta[starts-with(@attribute,"another attr")][@xml:lang="en"][@xml:id="id4"]/alpha[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::zeta[contains(@delete,"78")][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@object][@xml:id="id6"]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <mu xml:lang="en" xml:id="id1"> <eta insert="false" xml:lang="en-US" xml:id="id2"> @@ -9469,6 +11089,11 @@ </test> <test> <xpath>//sigma[@number="content"][@xml:id="id1"]//xi[starts-with(concat(@attr,"-"),"this-")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@or][not(preceding-sibling::upsilon)][following-sibling::rho[@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]//psi[@xml:lang="en"][@xml:id="id3"]//beta[@xml:lang="en"][@xml:id="id4"][following-sibling::xi[@xml:lang="nb"][preceding-sibling::*[position() = 1]]/alpha[not(preceding-sibling::*)][following-sibling::xi[starts-with(concat(@token,"-"),"attribute-")][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[contains(@title,"ibute")][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]/gamma[not(preceding-sibling::*)][following-sibling::pi[starts-with(@attr,"s")][@xml:lang="no-nb"][@xml:id="id7"][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/gamma[starts-with(concat(@string,"-"),"_blank-")][not(preceding-sibling::*)]/beta[@desciption][@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omega[contains(@title,"ent")][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="en-US"][not(following-sibling::*)]/eta[contains(@src,"tent")][@xml:lang="no"][@xml:id="id9"][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <sigma number="content" xml:id="id1"> <xi attr="this-is-att-value" xml:lang="no-nb"/> @@ -9502,6 +11127,11 @@ </test> <test> <xpath>//omega[starts-with(@string,"tr")][@xml:lang="en-US"]/chi[@attribute="this.nodeValue"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::chi[not(child::node())][following-sibling::chi[starts-with(concat(@insert,"-"),"false-")][@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]/zeta//upsilon[@data][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[starts-with(@delete,"t")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::mu[not(following-sibling::*)]//iota[contains(concat(@desciption,"$"),"lse$")][@xml:lang="en-GB"][not(following-sibling::*)]//pi[@xml:lang="en"]//pi[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="en"][not(child::node())][following-sibling::chi[@xml:lang="en"][not(child::node())][following-sibling::eta//alpha[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[contains(concat(@insert,"$"),"ute$")][@xml:id="id6"][not(child::node())][following-sibling::lambda[contains(@attribute,"ue")][@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]]/mu[starts-with(concat(@attribute,"-"),"attribute-")][not(following-sibling::*)]//zeta[@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[starts-with(concat(@att,"-"),"solid 1px green-")][preceding-sibling::*[position() = 1]]]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <omega string="true" xml:lang="en-US"> <chi attribute="this.nodeValue"/> @@ -9542,6 +11172,11 @@ </test> <test> <xpath>//beta[@abort="content"]/kappa[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:id="id1"][not(child::node())][following-sibling::rho[contains(@token,"lank")][@xml:lang="no"][preceding-sibling::*[position() = 1]]//nu[@data][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omicron[starts-with(concat(@number,"-"),"attribute-")][not(child::node())][following-sibling::rho[contains(@insert,"1px green")][not(following-sibling::*)]//psi[not(child::node())][following-sibling::beta[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <beta abort="content"> <kappa src="this.nodeValue" xml:id="id1"/> @@ -9560,6 +11195,11 @@ </test> <test> <xpath>//theta[@insert][@xml:lang="en-GB"][@xml:id="id1"]/chi[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::zeta[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]//delta[@or="attribute-value"][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::mu[following-sibling::beta[@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <theta insert="this.nodeValue" xml:lang="en-GB" xml:id="id1"> <chi xml:id="id2"/> @@ -9575,6 +11215,11 @@ </test> <test> <xpath>//epsilon//lambda[@token][@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::kappa[contains(concat(@att,"$"),"ute$")][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/*[@xml:id="id3"][not(following-sibling::*)]//nu[@xml:lang="nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::omega[@string="false"][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 2]]//beta[@number="true"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(@delete,"attr")][@xml:id="id6"][following-sibling::pi[@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]//chi[@xml:id="id8"][not(following-sibling::*)]//zeta[@and="this-is-att-value"][@xml:lang="no-nb"][@xml:id="id9"][not(following-sibling::*)]/kappa[@xml:id="id10"][following-sibling::beta[following-sibling::*[position()=3]][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id11"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::tau[@xml:id="id12"][following-sibling::omega[starts-with(concat(@attr,"-"),"true-")][@xml:lang="en"][@xml:id="id13"]/nu[@attribute="100%"][@xml:lang="no"][@xml:id="id14"][not(following-sibling::*)]/omicron[@xml:lang="en-GB"][@xml:id="id15"]//beta[starts-with(concat(@true,"-"),"attribute value-")][@xml:id="id16"][following-sibling::*[position()=1]][following-sibling::gamma[starts-with(@title,"s")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <epsilon> <lambda token="solid 1px green" xml:lang="no" xml:id="id1"/> @@ -9615,6 +11260,11 @@ </test> <test> <xpath>//nu[starts-with(@class,"at")][@xml:lang="nb"][@xml:id="id1"]//mu[@insert][@xml:id="id2"][not(preceding-sibling::*)]/pi[contains(concat(@content,"$"),"k$")]/sigma[not(following-sibling::*)]//rho[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@and][@xml:id="id5"][following-sibling::*[position()=2]][not(preceding-sibling::omicron)][not(child::node())][following-sibling::beta[@class="true"][@xml:lang="nb"][following-sibling::rho[@xml:id="id6"][not(following-sibling::*)]//epsilon[not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/gamma[contains(concat(@src,"$"),"0%$")][@xml:lang="en"][@xml:id="id7"][following-sibling::lambda[starts-with(@desciption,"_bla")][@xml:id="id8"][preceding-sibling::*[position() = 1]]/sigma[@xml:id="id9"][not(following-sibling::*)]//eta[contains(@delete,"nt")][@xml:lang="nb"][@xml:id="id10"][not(following-sibling::*)][not(preceding-sibling::eta)]//alpha[following-sibling::*[position()=3]][following-sibling::upsilon[not(child::node())][following-sibling::omega[@number="solid 1px green"][not(child::node())][following-sibling::omega[@xml:lang="en-US"][@xml:id="id11"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/gamma[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][@xml:id="id12"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <nu class="attribute-value" xml:lang="nb" xml:id="id1"> <mu insert="solid 1px green" xml:id="id2"> @@ -9653,6 +11303,11 @@ </test> <test> <xpath>//kappa[@class="another attribute value"][@xml:lang="en-GB"][@xml:id="id1"]//nu[contains(concat(@att,"$"),"green$")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]//alpha[contains(@false,"100")][@xml:id="id3"][following-sibling::mu[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::tau[starts-with(concat(@class,"-"),"this.nodeValue-")][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 2]][following-sibling::nu[starts-with(@desciption,"f")][@xml:lang="no"][not(following-sibling::*)]/alpha[contains(concat(@content,"$"),"ue$")][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::eta[@token][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::delta[starts-with(concat(@class,"-"),"100%-")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/iota[starts-with(@true,"thi")][@xml:lang="no"][@xml:id="id8"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[contains(concat(@attrib,"$"),"content$")][@xml:lang="no"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <kappa class="another attribute value" xml:lang="en-GB" xml:id="id1"> <nu att="solid 1px green" xml:lang="nb" xml:id="id2"> @@ -9676,6 +11331,11 @@ </test> <test> <xpath>//eta[@xml:lang="no"][@xml:id="id1"]/gamma[contains(concat(@number,"$"),"ue$")][@xml:id="id2"]//beta[@src="true"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omega[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::kappa//alpha[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::kappa[starts-with(concat(@string,"-"),"attribute-")][not(following-sibling::*)]//zeta[@xml:lang="en-US"]//omicron[contains(@abort,"al")][@xml:lang="no"][not(following-sibling::omicron)][not(child::node())][following-sibling::epsilon[@xml:id="id3"][following-sibling::sigma[starts-with(@class,"100")][@xml:lang="en-US"][not(following-sibling::*)]//upsilon[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[contains(@att,"lid 1px gr")][@xml:lang="no-nb"][@xml:id="id5"]//delta[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::theta[@src][@xml:lang="no"][@xml:id="id6"][not(child::node())][following-sibling::upsilon[@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::eta[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/tau[@xml:lang="en"][@xml:id="id9"][following-sibling::*[position()=2]][following-sibling::phi[@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@insert][not(following-sibling::*)]]]]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="no" xml:id="id1"> <gamma number="true" xml:id="id2"> @@ -9712,6 +11372,11 @@ </test> <test> <xpath>//*[@xml:lang="nb"][@xml:id="id1"]//phi[starts-with(@or,"12345")][@xml:lang="en-US"][following-sibling::*[position()=4]][following-sibling::kappa[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@xml:lang="no-nb"][following-sibling::beta[@xml:id="id3"]/zeta[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@attr="attribute-value"][preceding-sibling::*[position() = 1]]//upsilon[contains(@delete,"e")][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[@xml:lang="en-US"][@xml:id="id5"][following-sibling::gamma[@name]//alpha[@xml:id="id6"]/phi[@insert][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="en-US"][@xml:id="id7"]/omicron[@attrib][following-sibling::zeta[@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:lang="no"][@xml:id="id9"][not(following-sibling::*)]/beta[not(child::node())][following-sibling::tau[contains(@class,"89")][@xml:lang="no"][@xml:id="id10"]//iota[@data][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::theta[@token="another attribute value"][@xml:lang="en-US"][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="nb" xml:id="id1"> <phi or="123456789" xml:lang="en-US"/> @@ -9749,6 +11414,11 @@ </test> <test> <xpath>//*[@xml:lang="nb"]//*[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::lambda[@attrib][preceding-sibling::*[position() = 1]][following-sibling::tau[contains(concat(@desciption,"$"),"789$")][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//rho[not(preceding-sibling::*)]/gamma[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:id="id4"][not(child::node())][following-sibling::nu[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::*[@xml:lang="en-US"][not(child::node())][following-sibling::pi[@xml:id="id5"][following-sibling::omicron[contains(concat(@attrib,"$"),"alse$")][@xml:lang="en"][not(child::node())][following-sibling::xi[@name="content"][@xml:lang="en-US"][preceding-sibling::*[position() = 6]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>1</nth> + </result> <tree> <any xml:lang="nb"> <any xml:id="id1"/> @@ -9771,6 +11441,11 @@ </test> <test> <xpath>//kappa[@name][@xml:lang="no"][@xml:id="id1"]/zeta[starts-with(@or,"attribu")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[contains(concat(@and,"$"),"his-is-att-value$")][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)]//omicron[@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]//rho[starts-with(concat(@false,"-"),"attribute value-")][@xml:id="id5"][not(preceding-sibling::*)]/omega[starts-with(concat(@attrib,"-"),"attribute-")][following-sibling::*[position()=2]][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::rho[starts-with(concat(@abort,"-"),"content-")][preceding-sibling::*[position() = 2]]//kappa[@false="false"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:id="id7"][preceding-sibling::*[position() = 1]]/delta[@xml:id="id8"]//sigma[contains(@false,"x gree")][@xml:lang="en-US"][@xml:id="id9"][following-sibling::pi[@xml:lang="no-nb"][not(following-sibling::*)]/upsilon[contains(concat(@token,"$"),"solid 1px green$")][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="en"]/upsilon[@xml:lang="no"][not(following-sibling::*)]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <kappa name="solid 1px green" xml:lang="no" xml:id="id1"> <zeta or="attribute-value" xml:id="id2"> @@ -9804,6 +11479,11 @@ </test> <test> <xpath>//gamma[contains(@attrib,"lse")][@xml:lang="en-US"][@xml:id="id1"]//xi[contains(@string,"t")][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[contains(@attr,"ri")][@xml:id="id2"]/theta[contains(@data,"tent")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@true][@xml:lang="no-nb"][not(following-sibling::*)]/kappa[@false][@xml:lang="no"][following-sibling::*[position()=2]][following-sibling::tau[@or][@xml:id="id4"][not(child::node())][following-sibling::omicron[@attrib="content"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/sigma[contains(concat(@object,"$"),"attribute$")][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::chi[not(following-sibling::*)]//*[@xml:lang="en"][@xml:id="id5"]/mu[contains(concat(@name,"$"),"tribute value$")][not(child::node())][following-sibling::xi[@xml:id="id6"][preceding-sibling::*[position() = 1]]/beta[starts-with(@delete,"att")][@xml:id="id7"][not(child::node())][following-sibling::delta[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@title][@xml:id="id10"][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <gamma attrib="false" xml:lang="en-US" xml:id="id1"> <xi string="this-is-att-value"/> @@ -9837,6 +11517,11 @@ </test> <test> <xpath>//tau[@name][@xml:lang="no"][@xml:id="id1"]/nu[@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 1]]//pi[@data="attribute"][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::epsilon[starts-with(@src,"this.")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(@token,"a")][@xml:id="id4"][following-sibling::theta[contains(concat(@class,"$"),"100%$")][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=3]][following-sibling::alpha[starts-with(@attrib,"at")][following-sibling::*[position()=2]][following-sibling::eta[@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 5]][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[preceding-sibling::*[position() = 6]][not(following-sibling::*)]//*[contains(concat(@att,"$"),"true$")][following-sibling::omicron[not(following-sibling::*)][not(preceding-sibling::omicron)]/gamma[@token="solid 1px green"][@xml:lang="no-nb"][not(following-sibling::*)]//xi[starts-with(@att,"attribute-va")][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[starts-with(concat(@token,"-"),"123456789-")][@xml:id="id8"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <tau name="content" xml:lang="no" xml:id="id1"> <nu xml:lang="nb" xml:id="id2"/> @@ -9864,6 +11549,11 @@ </test> <test> <xpath>//lambda//mu[@attr="true"][@xml:lang="en-US"][@xml:id="id1"][following-sibling::sigma[preceding-sibling::*[position() = 1]][following-sibling::iota[not(child::node())][following-sibling::eta[contains(concat(@true,"$"),"attribute value$")][not(following-sibling::*)]//chi[not(child::node())][following-sibling::psi[@xml:id="id2"][not(child::node())][following-sibling::tau[@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//gamma[@true][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=9]][following-sibling::lambda[not(child::node())][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=7]][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::*[@xml:lang="en"][not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::zeta[@xml:id="id5"][not(child::node())][following-sibling::kappa[@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::zeta[@xml:id="id7"][not(child::node())][following-sibling::delta[@attr][@xml:lang="en"][preceding-sibling::*[position() = 9]]//omicron[contains(@class,"ttrib")][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <lambda> <mu attr="true" xml:lang="en-US" xml:id="id1"/> @@ -9894,6 +11584,11 @@ </test> <test> <xpath>//omicron/upsilon[contains(@token,"56789")][@xml:lang="en"][@xml:id="id1"][following-sibling::*[position()=6]][following-sibling::theta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[@data][@xml:id="id2"][not(child::node())][following-sibling::psi[contains(concat(@name,"$"),"k$")][@xml:id="id3"][preceding-sibling::*[position() = 3]][following-sibling::chi[@object][@xml:id="id4"][not(child::node())][following-sibling::rho[@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::eta[@xml:lang="en"][@xml:id="id6"]//alpha[@desciption="content"][@xml:id="id7"][not(preceding-sibling::*)]//pi[@attribute][not(preceding-sibling::*)][not(preceding-sibling::pi)]/zeta[contains(@data,"t")][@xml:lang="en"][@xml:id="id8"][not(child::node())][following-sibling::kappa[@false][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[starts-with(concat(@abort,"-"),"content-")][@xml:lang="en-US"][not(following-sibling::*)]/beta[@or][@xml:lang="en-GB"][following-sibling::mu[@token][@xml:id="id10"]//alpha[contains(concat(@and,"$"),"00%$")]//xi[@number][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:id="id11"][not(following-sibling::*)]//tau[@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[contains(@insert,"so")][@xml:id="id13"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@xml:id="id14"]][position() = 1]]][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omicron> <upsilon token="123456789" xml:lang="en" xml:id="id1"/> @@ -9933,6 +11628,11 @@ </test> <test> <xpath>//omicron/phi[@xml:id="id1"][not(following-sibling::*)]/omicron[starts-with(@false,"attri")][@xml:id="id2"][not(child::node())][following-sibling::delta[@xml:id="id3"][preceding-sibling::*[position() = 1]]/gamma[following-sibling::psi[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][following-sibling::chi[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::*[starts-with(concat(@data,"-"),"false-")][@xml:id="id5"][following-sibling::*[position()=2]][following-sibling::omega[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 5]][following-sibling::epsilon[@xml:lang="no"][@xml:id="id7"][not(following-sibling::*)]//beta[@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id9"]//theta[@number][not(following-sibling::*)]//psi[@xml:lang="nb"][@xml:id="id10"][following-sibling::sigma[@string="solid 1px green"]//epsilon[@xml:lang="en-GB"][@xml:id="id11"][not(following-sibling::*)]/kappa[contains(concat(@class,"$"),"nk$")][@xml:lang="no-nb"][not(preceding-sibling::*)]//sigma[@xml:lang="no-nb"][@xml:id="id12"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>1</nth> + </result> <tree> <omicron> <phi xml:id="id1"> @@ -9969,6 +11669,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-GB"][@xml:id="id1"]/psi[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@title="another attribute value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/lambda[starts-with(concat(@token,"-"),"solid 1px green-")][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::mu[contains(@delete,"%")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::eta[preceding-sibling::*[position() = 2]][not(following-sibling::eta)][following-sibling::delta[@token][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-GB" xml:id="id1"> <psi xml:lang="nb"/> @@ -9986,6 +11691,11 @@ </test> <test> <xpath>//rho[@xml:lang="en-GB"]//xi[not(preceding-sibling::*)]//omicron[@xml:lang="en"][@xml:id="id1"][not(following-sibling::*)]/xi[contains(concat(@or,"$"),"lue$")][@xml:lang="en-US"][not(following-sibling::*)]//delta[not(following-sibling::*)][not(preceding-sibling::delta)]/*[@desciption="solid 1px green"][@xml:lang="en-US"]/sigma[@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::mu[@xml:lang="no-nb"]/delta[@desciption][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//lambda[starts-with(@title,"10")][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[contains(@class,"fa")][@xml:id="id3"][preceding-sibling::*[position() = 1]]/delta[not(child::node())][following-sibling::zeta[starts-with(concat(@token,"-"),"attribute-")]/kappa[@token="this.nodeValue"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[@xml:id="id5"][not(preceding-sibling::*)]//kappa[contains(concat(@string,"$"),"ibute-value$")][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::tau[contains(@desciption,"789")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="en-GB"> <xi> @@ -10026,6 +11736,11 @@ </test> <test> <xpath>//epsilon[starts-with(@and,"false")][@xml:lang="no"][@xml:id="id1"]/xi[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[not(following-sibling::*)]/lambda[not(following-sibling::*)]/xi[@class="attribute-value"][@xml:id="id3"]/omicron[not(preceding-sibling::*)][following-sibling::omega[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/*[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::delta[contains(concat(@true,"$"),"value$")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::xi[@desciption][@xml:id="id7"][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <epsilon and="false" xml:lang="no" xml:id="id1"> <xi xml:lang="no" xml:id="id2"/> @@ -10048,6 +11763,11 @@ </test> <test> <xpath>//sigma//zeta[@xml:lang="no"][not(following-sibling::*)]/beta[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::beta)][not(child::node())][following-sibling::pi[starts-with(concat(@name,"-"),"false-")][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/iota[starts-with(@att,"co")][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[starts-with(concat(@attribute,"-"),"another attribute value-")][@xml:id="id3"]/alpha[starts-with(concat(@title,"-"),"another attribute value-")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@true="content"][@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]//pi[not(preceding-sibling::*)][not(following-sibling::*)]/alpha[not(preceding-sibling::*)][following-sibling::nu[starts-with(concat(@attr,"-"),"another attribute value-")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 2]][following-sibling::epsilon[@xml:id="id6"][following-sibling::lambda[@att][@xml:lang="en-GB"][preceding-sibling::*[position() = 4]]/*[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <sigma> <zeta xml:lang="no"> @@ -10078,6 +11798,11 @@ </test> <test> <xpath>//xi[@xml:lang="no-nb"][@xml:id="id1"]/kappa[contains(@object,"co")][not(following-sibling::*)]/xi[@false][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[not(preceding-sibling::*)][following-sibling::rho[@attrib][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//iota[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="no-nb"]/phi[starts-with(@true,"this.nodeVal")][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::chi[@xml:id="id4"][not(following-sibling::*)]/lambda[contains(@title,"3456789")][not(preceding-sibling::*)]//epsilon[contains(concat(@false,"$"),"se$")][@xml:id="id5"]/alpha[@src="false"][@xml:lang="en-GB"][following-sibling::beta[not(preceding-sibling::beta)][not(child::node())][following-sibling::zeta[@attr="this.nodeValue"][@xml:id="id6"][not(following-sibling::*)]//phi//kappa[not(following-sibling::*)]//iota[contains(@src,"ue")][not(preceding-sibling::*)][not(following-sibling::*)]/psi[not(preceding-sibling::*)][not(following-sibling::*)]/phi[@object="another attribute value"][not(preceding-sibling::*)][not(following-sibling::phi)]//beta[not(following-sibling::*)]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <xi xml:lang="no-nb" xml:id="id1"> <kappa object="content"> @@ -10119,6 +11844,11 @@ </test> <test> <xpath>//nu[@xml:lang="no"][@xml:id="id1"]//delta[contains(concat(@att,"$"),"ribute-value$")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)]//phi[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::*[preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::eta[@xml:id="id5"]//eta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@desciption][@xml:lang="no"][not(following-sibling::*)]/chi[starts-with(@data,"attribut")][not(preceding-sibling::*)]/chi[following-sibling::omega[@xml:lang="nb"][@xml:id="id6"][not(child::node())][following-sibling::beta[@insert="another attribute value"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::rho[starts-with(@src,"true")][preceding-sibling::*[position() = 3]][following-sibling::pi[starts-with(@token,"1")][@xml:lang="en-GB"][@xml:id="id7"][following-sibling::iota[@xml:id="id8"][preceding-sibling::*[position() = 5]]//kappa[contains(@abort,"lue")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@token="false"][@xml:lang="no-nb"][@xml:id="id9"][not(following-sibling::*)][not(preceding-sibling::eta)]/mu[@insert="another attribute value"][@xml:id="id10"][not(child::node())][following-sibling::chi[@attrib][not(following-sibling::*)]/xi[@name][@xml:id="id11"][not(preceding-sibling::*)]/theta[contains(@title,"no")][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]]]]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="no" xml:id="id1"> <delta att="attribute-value" xml:lang="no" xml:id="id2"> @@ -10156,6 +11886,11 @@ </test> <test> <xpath>//psi[@xml:lang="en-GB"]/rho[@xml:lang="en"][not(following-sibling::*)]//eta[@token="123456789"][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa[starts-with(@or,"tru")][@xml:id="id1"][not(following-sibling::*)]/delta[starts-with(@desciption,"this.")][@xml:id="id2"]//phi[starts-with(@token,"100%")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::alpha[preceding-sibling::*[position() = 1]][following-sibling::mu[@xml:id="id4"][preceding-sibling::*[position() = 2]]//psi[@xml:id="id5"]//zeta[@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)]/phi[@src][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(preceding-sibling::tau)]/eta[contains(concat(@title,"$"),"true$")][@xml:id="id7"]//delta[contains(concat(@number,"$"),"attribute value$")][@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)]//chi[@desciption][@xml:id="id9"]//phi[@token][@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@attribute][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id11"]//zeta[@xml:lang="en-US"][@xml:id="id12"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@number][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:lang="no-nb"][@xml:id="id13"][not(child::node())][following-sibling::delta[@data="_blank"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="en-GB"> <rho xml:lang="en"> @@ -10198,6 +11933,11 @@ </test> <test> <xpath>//omega[@true][@xml:lang="en-US"][@xml:id="id1"]/delta[following-sibling::chi[@abort][@xml:lang="en"][following-sibling::kappa[preceding-sibling::*[position() = 2]]//lambda//tau[@xml:lang="nb"][@xml:id="id2"]//beta[contains(concat(@token,"$"),"false$")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="no"][not(following-sibling::*)]//iota[starts-with(@desciption,"_")][@xml:id="id5"][not(following-sibling::*)]//xi[@xml:id="id6"][following-sibling::rho[@attr][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[starts-with(concat(@name,"-"),"100%-")][@xml:lang="en-US"][not(preceding-sibling::*)]//alpha[@xml:lang="no-nb"][@xml:id="id8"]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <omega true="true" xml:lang="en-US" xml:id="id1"> <delta/> @@ -10229,6 +11969,11 @@ </test> <test> <xpath>//zeta/kappa[contains(@desciption,"nk")][not(preceding-sibling::*)][following-sibling::omega[@abort="another attribute value"][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::lambda[@class="true"][@xml:lang="no-nb"][@xml:id="id1"][not(child::node())][following-sibling::iota[contains(@insert,"ute val")][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <zeta> <kappa desciption="_blank"/> @@ -10243,6 +11988,11 @@ </test> <test> <xpath>//*[@xml:lang="en-GB"]//eta[contains(@attr,"23")][not(following-sibling::*)]/lambda[contains(concat(@true,"$"),"789$")][@xml:lang="en-GB"][@xml:id="id1"]/xi[@xml:lang="en"][@xml:id="id2"]/beta[contains(@data,"%")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::chi[contains(@or,"ibu")][@xml:id="id3"][following-sibling::upsilon[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@number][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//chi[not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[starts-with(@att,"attri")][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[starts-with(concat(@object,"-"),"another attribute value-")][@xml:lang="no"]//omicron[not(preceding-sibling::*)][not(following-sibling::*)]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-GB"> <eta attr="123456789"> @@ -10268,6 +12018,11 @@ </test> <test> <xpath>//beta[starts-with(@object,"attribut")][@xml:lang="no-nb"]/mu[@xml:lang="en"][not(following-sibling::*)][not(following-sibling::mu)]/theta[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::theta[@true="attribute"][@xml:lang="nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//phi[contains(concat(@string,"$"),"nt$")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::epsilon[@title][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <beta object="attribute" xml:lang="no-nb"> <mu xml:lang="en"> @@ -10285,6 +12040,11 @@ </test> <test> <xpath>//omega[@xml:id="id1"]//tau[contains(@insert,"00%")][@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[starts-with(@object,"attribute ")][@xml:lang="no-nb"][@xml:id="id3"]/beta[starts-with(@desciption,"solid 1px ")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@true][@xml:id="id5"][not(following-sibling::*)]//alpha[contains(concat(@desciption,"$"),"e$")][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)]/omicron[contains(concat(@insert,"$"),"0%$")][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)]/kappa[contains(concat(@delete,"$"),"rue$")][@xml:lang="en-US"][@xml:id="id8"][not(preceding-sibling::*)]//omega[@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)]//nu[@xml:lang="no"][@xml:id="id10"]/kappa[@insert][@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::kappa[starts-with(concat(@name,"-"),"content-")][@xml:lang="en"][not(following-sibling::*)]/phi[not(preceding-sibling::*)][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <omega xml:id="id1"> <tau insert="100%" xml:lang="en" xml:id="id2"/> @@ -10316,6 +12076,11 @@ </test> <test> <xpath>//nu[@xml:lang="no"][@xml:id="id1"]/iota[starts-with(@content,"this-is-att-valu")][not(preceding-sibling::iota)]/zeta[@title][not(following-sibling::*)]//sigma[@delete="this-is-att-value"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[following-sibling::*[preceding-sibling::*[position() = 2]]/iota[@xml:id="id3"][not(child::node())][following-sibling::omega[@delete][following-sibling::iota[@desciption][@xml:lang="en"][preceding-sibling::*[position() = 2]]//upsilon[following-sibling::*[position()=2]][not(following-sibling::upsilon)][not(child::node())][following-sibling::chi[@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::alpha[@att][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="no" xml:id="id1"> <iota content="this-is-att-value"> @@ -10340,6 +12105,11 @@ </test> <test> <xpath>//delta[contains(@title,"his")][@xml:lang="en-US"]/tau[@xml:lang="en"][not(following-sibling::*)]//rho[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::iota[@xml:lang="en"][@xml:id="id2"][following-sibling::theta[@att="123456789"][@xml:id="id3"][following-sibling::gamma[@or="solid 1px green"]/delta[starts-with(concat(@desciption,"-"),"100%-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:id="id4"][following-sibling::*[contains(@attribute,"t")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//delta[@string="attribute-value"][@xml:lang="no-nb"][following-sibling::pi[following-sibling::tau[@att][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/mu[starts-with(@abort,"co")][@xml:lang="no"][not(preceding-sibling::*)][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <delta title="this.nodeValue" xml:lang="en-US"> <tau xml:lang="en"> @@ -10365,6 +12135,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en-GB"][@xml:id="id1"]//rho[contains(@src,"ute va")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::chi[starts-with(concat(@string,"-"),"attribute-")][@xml:lang="en-GB"][following-sibling::*[position()=3]][not(child::node())][following-sibling::chi[@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:lang="en-US"][not(child::node())][following-sibling::sigma[@data][preceding-sibling::*[position() = 4]][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en-GB" xml:id="id1"> <rho src="attribute value" xml:lang="en-GB"/> @@ -10379,6 +12154,11 @@ </test> <test> <xpath>//mu[@attribute="true"][@xml:lang="no-nb"]/zeta[@and="attribute-value"][not(preceding-sibling::*)]//lambda[starts-with(@class,"attribute")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::sigma[@xml:id="id1"][not(child::node())][following-sibling::*[starts-with(@attribute,"content")][@xml:id="id2"][following-sibling::beta[@token][@xml:lang="en-US"][preceding-sibling::*[position() = 3]][following-sibling::kappa[@token][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::mu[contains(concat(@title,"$"),"te$")]//phi[@title="false"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::*[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[not(following-sibling::*)]//phi[starts-with(@number,"123")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::*[@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::sigma[starts-with(@content,"this.n")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::kappa[not(child::node())][following-sibling::omega[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 4]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <mu attribute="true" xml:lang="no-nb"> <zeta and="attribute-value"> @@ -10409,6 +12189,11 @@ </test> <test> <xpath>//chi[@attribute]//kappa[starts-with(concat(@number,"-"),"attribute value-")][@xml:id="id1"][not(following-sibling::*)]//lambda[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[starts-with(@attribute,"100")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]]/*[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]//beta[@xml:id="id5"][not(following-sibling::*)]/psi[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[@number][not(child::node())][following-sibling::beta[starts-with(@object,"sol")]//upsilon[starts-with(@or,"false")][not(preceding-sibling::*)][not(following-sibling::*)]//psi[contains(concat(@abort,"$"),"reen$")][@xml:lang="no-nb"][@xml:id="id6"][not(child::node())][following-sibling::omicron[@or][not(following-sibling::*)]//xi[@insert][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::phi[@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@xml:id="id9"][not(child::node())][following-sibling::eta[@or][@xml:id="id10"][not(child::node())][following-sibling::omicron//iota[@xml:lang="nb"][following-sibling::iota[@xml:lang="en"][@xml:id="id11"]//psi[contains(@attribute,"0")][not(preceding-sibling::*)]//iota[@xml:lang="no-nb"][@xml:id="id12"][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <chi attribute="attribute value"> <kappa number="attribute value" xml:id="id1"> @@ -10451,6 +12236,11 @@ </test> <test> <xpath>//chi[starts-with(@attr,"another attribu")][@xml:id="id1"]/omicron[@attr="123456789"][not(preceding-sibling::*)]/delta[not(preceding-sibling::*)][not(child::node())][following-sibling::chi[starts-with(@insert,"a")][@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::lambda[contains(@object,"se")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omicron[@xml:lang="no-nb"][not(following-sibling::*)]//*[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[contains(@name,"_blan")][@xml:lang="en"][@xml:id="id5"][following-sibling::*[position()=2]][following-sibling::upsilon[@xml:id="id6"][following-sibling::epsilon[@xml:lang="no"][@xml:id="id7"]/*[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::mu[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::epsilon[@delete][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][following-sibling::eta[@xml:id="id9"][preceding-sibling::*[position() = 3]][following-sibling::omega[@desciption="_blank"][@xml:id="id10"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//rho[@att="another attribute value"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@xml:id="id12"][not(preceding-sibling::*)]//theta[@xml:id="id13"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <chi attr="another attribute value" xml:id="id1"> <omicron attr="123456789"> @@ -10484,6 +12274,11 @@ </test> <test> <xpath>//gamma[@xml:id="id1"]//theta[@xml:lang="en"]/nu[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[@src="this.nodeValue"][not(child::node())][following-sibling::gamma[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/omicron[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <gamma xml:id="id1"> <theta xml:lang="en"> @@ -10500,6 +12295,11 @@ </test> <test> <xpath>//iota[contains(concat(@content,"$"),"px green$")][@xml:id="id1"]//lambda[contains(concat(@false,"$"),"0%$")][@xml:lang="en-GB"]//nu[starts-with(concat(@name,"-"),"attribute value-")][@xml:id="id2"][not(preceding-sibling::*)]//nu/beta[contains(concat(@number,"$"),"rue$")][not(preceding-sibling::*)]/chi[@xml:id="id3"]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <iota content="solid 1px green" xml:id="id1"> <lambda false="100%" xml:lang="en-GB"> @@ -10518,6 +12318,11 @@ </test> <test> <xpath>//alpha[contains(@content,"ibute v")][@xml:id="id1"]/kappa[@number][@xml:lang="en-US"][not(preceding-sibling::*)]//*[@xml:lang="nb"][not(following-sibling::*)]/gamma[@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[not(following-sibling::*)]/phi[@string="attribute-value"][@xml:lang="no"][not(child::node())][following-sibling::epsilon[contains(concat(@string,"$"),"56789$")][not(following-sibling::*)]/sigma[@att][@xml:id="id4"]//nu[@xml:lang="en-GB"][following-sibling::pi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[contains(@insert,"ue")][@xml:lang="no-nb"][@xml:id="id5"][following-sibling::delta[@content][@xml:lang="nb"][@xml:id="id6"][following-sibling::sigma[contains(@string,"ls")][@xml:id="id7"][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <alpha content="attribute value" xml:id="id1"> <kappa number="attribute-value" xml:lang="en-US"> @@ -10546,6 +12351,11 @@ </test> <test> <xpath>//omicron[@xml:lang="en"]/omega[starts-with(concat(@name,"-"),"solid 1px green-")][not(preceding-sibling::*)]/mu[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@attr][not(following-sibling::*)]/eta[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[contains(@false,"e")][@xml:lang="no-nb"][not(preceding-sibling::*)]//omicron[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[contains(concat(@att,"$"),"lue$")][not(child::node())][following-sibling::eta[starts-with(concat(@false,"-"),"100%-")][@xml:id="id2"][not(child::node())][following-sibling::mu[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//omicron[@xml:lang="nb"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::zeta[@xml:id="id5"][not(following-sibling::*)]//upsilon[@token][@xml:lang="en-US"]//rho[@xml:lang="nb"]//pi[@xml:lang="en"][@xml:id="id6"]/*[@attr]//omega[@token="attribute value"]/gamma[@src="attribute-value"][@xml:id="id7"]/mu[@xml:id="id8"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>1</nth> + </result> <tree> <omicron xml:lang="en"> <omega name="solid 1px green"> @@ -10588,6 +12398,11 @@ </test> <test> <xpath>//eta[starts-with(@att,"tru")][@xml:lang="no-nb"][@xml:id="id1"]//*[@name="false"][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::psi[@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::zeta[not(child::node())][following-sibling::iota[@insert][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::xi[@xml:id="id5"][not(following-sibling::*)]/theta[starts-with(concat(@attrib,"-"),"attribute-")][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:id="id6"][not(preceding-sibling::*)]/kappa[starts-with(concat(@true,"-"),"solid 1px green-")][@xml:id="id7"][not(child::node())][following-sibling::iota[starts-with(concat(@name,"-"),"attribute value-")][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][following-sibling::omicron[following-sibling::iota[starts-with(@title,"this-is-att-val")][@xml:lang="en-GB"][@xml:id="id9"]/xi[contains(@title,"attribut")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[contains(concat(@att,"$"),"true$")]/*[@src][@xml:lang="en"][following-sibling::*[position()=4]][not(child::node())][following-sibling::kappa[@xml:lang="en-US"][@xml:id="id10"][not(child::node())][following-sibling::nu[@string][following-sibling::delta[starts-with(concat(@insert,"-"),"_blank-")][@xml:lang="en-US"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:id="id11"][preceding-sibling::*[position() = 4]]//zeta[@att="100%"][@xml:lang="en-GB"][not(following-sibling::*)]//pi[@xml:id="id12"][following-sibling::lambda[@xml:id="id13"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <eta att="true" xml:lang="no-nb" xml:id="id1"> <any name="false" xml:lang="en" xml:id="id2"/> @@ -10627,6 +12442,11 @@ </test> <test> <xpath>//omicron[@xml:lang="en-GB"]//pi[@xml:id="id1"]/sigma[@xml:lang="no-nb"][@xml:id="id2"][not(child::node())][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id4"]//chi[@xml:lang="en-US"][not(preceding-sibling::chi)]//alpha[starts-with(@insert,"c")][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="en-GB"> <pi xml:id="id1"> @@ -10646,6 +12466,11 @@ </test> <test> <xpath>//zeta[contains(@delete,"alse")][@xml:lang="en"][@xml:id="id1"]//beta[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota/zeta[@or="true"][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:id="id3"]/tau[contains(@attribute,"ibu")][@xml:lang="en-US"]//pi[@attr][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <zeta delete="false" xml:lang="en" xml:id="id1"> <beta xml:lang="no-nb" xml:id="id2"/> @@ -10664,6 +12489,11 @@ </test> <test> <xpath>//omega[@xml:lang="nb"][@xml:id="id1"]//alpha[starts-with(@object,"con")][not(preceding-sibling::*)]//rho[starts-with(concat(@true,"-"),"another attribute value-")][@xml:lang="en"][@xml:id="id2"]/eta[@xml:lang="en-GB"][@xml:id="id3"][following-sibling::upsilon[@abort][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/nu[@xml:lang="en"][following-sibling::gamma[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[starts-with(@content,"_")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::sigma[@xml:id="id5"][not(child::node())][following-sibling::epsilon[@object="123456789"]//upsilon[@true][not(following-sibling::*)]//*[contains(@att,"123456789")][@xml:lang="nb"][@xml:id="id6"][following-sibling::sigma[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[starts-with(concat(@name,"-"),"this.nodeValue-")][@xml:lang="en-US"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="nb" xml:id="id1"> <alpha object="content"> @@ -10693,6 +12523,11 @@ </test> <test> <xpath>//xi[@xml:lang="en-GB"][@xml:id="id1"]/kappa[@and][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@xml:id="id2"]/tau[not(preceding-sibling::*)][following-sibling::zeta[@string="true"][@xml:lang="nb"][following-sibling::theta[@delete="solid 1px green"][@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]//omicron[@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="en"][preceding-sibling::*[position() = 1]]//zeta[@and][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[starts-with(@number,"attribute value")][@xml:id="id5"][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <xi xml:lang="en-GB" xml:id="id1"> <kappa and="attribute" xml:lang="no-nb"/> @@ -10714,6 +12549,11 @@ </test> <test> <xpath>//omicron[starts-with(@attr,"attribute val")][@xml:id="id1"]/pi[@xml:lang="en-US"][not(preceding-sibling::*)]//upsilon[starts-with(concat(@true,"-"),"attribute-")][following-sibling::nu[@or][@xml:id="id2"][not(following-sibling::*)]//delta[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::xi/omicron[starts-with(concat(@string,"-"),"another attribute value-")]/rho[@false][@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]/*[@xml:lang="no-nb"]/mu[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:id="id6"][preceding-sibling::*[position() = 1]]//lambda[contains(@data,"ttribute-va")][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omicron attr="attribute value" xml:id="id1"> <pi xml:lang="en-US"> @@ -10743,6 +12583,11 @@ </test> <test> <xpath>//zeta[@class][@xml:lang="en"][@xml:id="id1"]/*[contains(concat(@insert,"$"),"attribute-value$")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)]//chi[contains(@title,"tt-value")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[not(child::node())][following-sibling::rho[starts-with(@true,"at")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[contains(concat(@and,"$"),"blank$")][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]/eta[@xml:lang="no"][following-sibling::xi[@xml:lang="en-GB"]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <zeta class="_blank" xml:lang="en" xml:id="id1"> <any insert="attribute-value" xml:lang="no" xml:id="id2"> @@ -10762,6 +12607,11 @@ </test> <test> <xpath>//beta//*[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:lang="en-GB"][not(following-sibling::*)]/psi[@xml:lang="en"][@xml:id="id2"]//kappa[starts-with(concat(@abort,"-"),"another attribute value-")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@or][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::nu or following-sibling::nu)]//gamma[@xml:id="id3"][not(following-sibling::*)]/beta[starts-with(@true,"this.node")][@xml:lang="no"][@xml:id="id4"]//omega[@number][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@xml:lang="en-GB"][@xml:id="id6"]/xi[@xml:id="id7"]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <beta> <any xml:lang="no" xml:id="id1"/> @@ -10791,6 +12641,11 @@ </test> <test> <xpath>//*[@name="123456789"][@xml:id="id1"]//iota[@attribute][following-sibling::omicron[@string][not(following-sibling::*)]//mu[not(preceding-sibling::*)][following-sibling::gamma[@and][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::gamma)]//upsilon[not(preceding-sibling::*)][following-sibling::phi[contains(@string,"attribute-value")][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[starts-with(@delete,"solid")][preceding-sibling::*[position() = 2]]//xi[not(following-sibling::*)]/zeta[@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <any name="123456789" xml:id="id1"> <iota attribute="this-is-att-value"/> @@ -10813,6 +12668,11 @@ </test> <test> <xpath>//psi[starts-with(@or,"this.nodeVa")][@xml:lang="no"]/phi[@xml:lang="nb"][not(child::node())][following-sibling::nu[@data="this.nodeValue"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:id="id1"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/iota[starts-with(@src,"conten")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::iota)][following-sibling::chi[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <psi or="this.nodeValue" xml:lang="no"> <phi xml:lang="nb"/> @@ -10829,6 +12689,11 @@ </test> <test> <xpath>//mu[starts-with(concat(@and,"-"),"attribute-")]//mu[@xml:id="id1"]//sigma[not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 1]]/chi[starts-with(concat(@attr,"-"),"attribute value-")][@xml:lang="no-nb"][@xml:id="id2"][not(child::node())][following-sibling::eta[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[contains(concat(@or,"$"),"ontent$")][@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//upsilon/upsilon[starts-with(concat(@attrib,"-"),"false-")][@xml:lang="no-nb"][@xml:id="id6"][following-sibling::*[position()=4]][following-sibling::epsilon[contains(concat(@name,"$"),"tribute value$")][@xml:lang="en"][@xml:id="id7"][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[contains(concat(@desciption,"$"),"ute$")][preceding-sibling::*[position() = 2]][following-sibling::beta[@xml:id="id8"][preceding-sibling::*[position() = 3]][following-sibling::phi[@xml:lang="en-US"][@xml:id="id9"][not(following-sibling::*)]//kappa[contains(concat(@attrib,"$"),"ribute value$")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@src][@xml:lang="en"][following-sibling::xi[@insert][@xml:id="id10"][following-sibling::zeta[@xml:id="id11"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::kappa[starts-with(concat(@name,"-"),"content-")][@xml:lang="en-GB"][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][preceding-sibling::*[position() = 4]]//sigma[@data][@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::*[@xml:id="id12"][preceding-sibling::*[position() = 1]]//kappa[@src][@xml:lang="en-GB"][@xml:id="id13"][not(following-sibling::*)]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <mu and="attribute"> <mu xml:id="id1"> @@ -10870,6 +12735,11 @@ </test> <test> <xpath>//alpha[starts-with(@attr,"this.no")][@xml:id="id1"]//xi[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[starts-with(@insert,"attribu")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[@string="solid 1px green"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::mu[contains(concat(@string,"$"),"e$")][@xml:lang="en-GB"][@xml:id="id4"][following-sibling::lambda[@token="100%"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::beta[@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][following-sibling::upsilon[preceding-sibling::*[position() = 4]][following-sibling::alpha[starts-with(concat(@object,"-"),"100%-")][@xml:id="id5"][preceding-sibling::*[position() = 5]][following-sibling::sigma[@class][@xml:lang="no-nb"][preceding-sibling::*[position() = 6]][not(following-sibling::*)][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <alpha attr="this.nodeValue" xml:id="id1"> <xi xml:lang="no-nb" xml:id="id2"/> @@ -10889,6 +12759,11 @@ </test> <test> <xpath>//pi[@xml:lang="no-nb"]//epsilon[not(preceding-sibling::*)][not(following-sibling::*)]//delta[@xml:lang="no-nb"][@xml:id="id1"][following-sibling::*[position()=3]][not(child::node())][following-sibling::tau[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="nb"][following-sibling::*[position()=2]][following-sibling::kappa[@attr="123456789"][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[contains(@title,"e")][@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/psi[starts-with(@content,"attrib")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::pi[contains(concat(@and,"$"),"0%$")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:lang="nb"][preceding-sibling::*[position() = 2]]/zeta[@xml:id="id5"][not(child::node())][following-sibling::lambda[starts-with(@true,"this.nodeVa")][@xml:id="id6"][preceding-sibling::*[position() = 1]]/theta[starts-with(@title,"f")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)]/delta[contains(concat(@name,"$"),"alue$")][@xml:lang="no-nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[contains(@attribute,"ttribu")][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::theta[@or][@xml:id="id9"]//rho[@abort="another attribute value"][not(following-sibling::*)]/phi[not(child::node())][following-sibling::iota[@xml:lang="en"][@xml:id="id10"][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 2]][following-sibling::delta[preceding-sibling::*[position() = 3]][not(following-sibling::*)]/omega[@xml:lang="nb"][not(preceding-sibling::*)]/lambda[starts-with(concat(@content,"-"),"_blank-")][@xml:id="id11"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="no-nb"> <epsilon> @@ -10928,6 +12803,11 @@ </test> <test> <xpath>//rho/iota[contains(concat(@object,"$"),"89$")][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::gamma[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[@xml:lang="nb"][not(following-sibling::*)]//nu[@xml:lang="en-GB"][@xml:id="id3"]//kappa[@number][@xml:lang="en-US"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::*[@att][not(child::node())][following-sibling::iota[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//gamma[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::omicron[@attr][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(following-sibling::omicron)][following-sibling::beta[starts-with(@attrib,"a")]//mu[contains(@content,"se")][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[starts-with(concat(@number,"-"),"another attribute value-")][@xml:id="id5"][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::kappa[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//alpha[starts-with(@insert,"attr")][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::omicron[@xml:id="id8"][preceding-sibling::*[position() = 1]]//iota[@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <rho> <iota object="123456789" xml:id="id1"/> @@ -10961,6 +12841,11 @@ </test> <test> <xpath>//chi[contains(concat(@insert,"$"),"ontent$")]//delta[contains(@and,"l")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[contains(concat(@class,"$"),"lse$")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@xml:lang="nb"][following-sibling::delta[starts-with(concat(@token,"-"),"attribute value-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[starts-with(concat(@or,"-"),"this-")][following-sibling::*[position()=7]][following-sibling::kappa[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::gamma[@false][@xml:id="id3"][following-sibling::kappa[following-sibling::alpha[contains(@and,"lue")][@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::delta[not(child::node())][following-sibling::pi[@insert][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 7]][not(following-sibling::*)]]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <chi insert="content"> <delta and="solid 1px green" xml:lang="en-GB"> @@ -10985,6 +12870,11 @@ </test> <test> <xpath>//xi[starts-with(@attr,"thi")]/rho[contains(concat(@title,"$"),"ttribute$")][@xml:lang="no-nb"][following-sibling::epsilon[@xml:lang="en-GB"][@xml:id="id1"][following-sibling::omicron[@xml:lang="en"][not(following-sibling::*)]//beta[starts-with(concat(@att,"-"),"attribute-")][@xml:lang="no"][not(preceding-sibling::*)]/iota[@xml:lang="nb"]/lambda[@xml:id="id2"][not(preceding-sibling::*)]/omega[not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(concat(@false,"-"),"attribute-")][@xml:id="id3"]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <xi attr="this-is-att-value"> <rho title="attribute" xml:lang="no-nb"/> @@ -11006,6 +12896,11 @@ </test> <test> <xpath>//theta[@false]/mu[@attrib][@xml:id="id1"][not(following-sibling::*)]//lambda[@and][@xml:lang="en-GB"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id3"]/epsilon[following-sibling::delta[@xml:id="id4"][preceding-sibling::*[position() = 1]]/mu[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]]//theta[@xml:lang="en-GB"][@xml:id="id7"][following-sibling::pi[contains(@name,"en")][@xml:lang="en-GB"][@xml:id="id8"]//zeta[@title][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[not(following-sibling::*)]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <theta false="this-is-att-value"> <mu attrib="false" xml:id="id1"> @@ -11032,6 +12927,11 @@ </test> <test> <xpath>//psi[starts-with(concat(@name,"-"),"solid 1px green-")][@xml:lang="nb"]//pi[not(preceding-sibling::*)]/xi[starts-with(concat(@src,"-"),"100%-")][@xml:lang="en"][not(child::node())][following-sibling::omicron[contains(@delete,"l")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::upsilon[@src="this-is-att-value"][@xml:lang="en-US"][preceding-sibling::*[position() = 3]][following-sibling::beta[@xml:id="id2"][preceding-sibling::*[position() = 4]]//nu[@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]/delta[@xml:lang="en-GB"][not(following-sibling::*)]//omega[@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]/gamma[@xml:id="id5"][not(child::node())][following-sibling::lambda[starts-with(concat(@insert,"-"),"true-")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::tau[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[@abort="_blank"]//mu[@xml:lang="no-nb"][not(child::node())][following-sibling::pi[not(following-sibling::*)]//chi[@xml:lang="en-US"]/gamma[@false][@xml:lang="en-US"][not(preceding-sibling::*)][not(preceding-sibling::gamma)][following-sibling::rho[contains(concat(@content,"$"),"e$")][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::rho)]//epsilon[@xml:id="id7"][not(following-sibling::*)]/beta[@class][@xml:lang="no"][@xml:id="id8"]//alpha[starts-with(concat(@src,"-"),"solid 1px green-")][@xml:lang="en-US"][not(following-sibling::*)]]]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <psi name="solid 1px green" xml:lang="nb"> <pi> @@ -11073,6 +12973,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]/delta[not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::*[@number][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id4"]/gamma[@xml:lang="no"][not(preceding-sibling::*)]/rho[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa//eta[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::chi[starts-with(concat(@name,"-"),"this.nodeValue-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[contains(concat(@insert,"$"),"false$")][following-sibling::*[position()=1]][following-sibling::alpha[starts-with(@title,"t")][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <phi xml:id="id1"> <delta> @@ -11101,6 +13006,11 @@ </test> <test> <xpath>//psi[@xml:lang="en"][@xml:id="id1"]//*[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::kappa[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::chi[@desciption][@xml:lang="no-nb"]/*[following-sibling::*[position()=2]][following-sibling::mu[not(child::node())][following-sibling::omicron[@and][@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="en" xml:id="id1"> <any/> @@ -11118,6 +13028,11 @@ </test> <test> <xpath>//omicron[contains(@title,"lank")][@xml:id="id1"]/theta[starts-with(@data,"10")][@xml:lang="en"][not(child::node())][following-sibling::beta[starts-with(concat(@number,"-"),"another attribute value-")][@xml:id="id2"][following-sibling::*[position()=4]][following-sibling::gamma[starts-with(@token,"solid 1p")][preceding-sibling::*[position() = 2]][following-sibling::alpha[@attribute][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::mu[@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::*[not(following-sibling::*)]//sigma[@xml:lang="no-nb"]/iota[following-sibling::pi[starts-with(concat(@object,"-"),"attribute-")][@xml:lang="en"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <omicron title="_blank" xml:id="id1"> <theta data="100%" xml:lang="en"/> @@ -11138,6 +13053,11 @@ </test> <test> <xpath>//upsilon[starts-with(concat(@content,"-"),"solid 1px green-")][@xml:id="id1"]/kappa[contains(@number,"olid ")][@xml:lang="nb"][not(preceding-sibling::*)]/mu[contains(@true,"ute v")][@xml:id="id2"][following-sibling::phi[@class][preceding-sibling::*[position() = 1]]/sigma[starts-with(@attr,"attribut")][@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]/omicron[@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:id="id4"][not(following-sibling::*)]//pi[contains(concat(@object,"$"),"another attribute value$")][not(preceding-sibling::*)][following-sibling::phi[@attr][@xml:id="id5"][following-sibling::omicron[starts-with(@att,"1234")][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <upsilon content="solid 1px green" xml:id="id1"> <kappa number="solid 1px green" xml:lang="nb"> @@ -11160,6 +13080,11 @@ </test> <test> <xpath>//mu[@xml:lang="no"]//kappa[starts-with(@or,"_b")][@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]//xi[@xml:id="id2"][not(preceding-sibling::*)]//alpha[starts-with(concat(@object,"-"),"123456789-")][@xml:id="id3"][following-sibling::omicron[contains(concat(@attrib,"$"),"nt$")][@xml:lang="no"][not(child::node())][following-sibling::lambda[@insert][@xml:lang="en-US"][@xml:id="id4"][following-sibling::phi[contains(@name,"ut")][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]//beta[@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[contains(@insert,"his.node")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//iota[not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::nu[not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <mu xml:lang="no"> <kappa or="_blank" xml:lang="en-US" xml:id="id1"> @@ -11184,6 +13109,11 @@ </test> <test> <xpath>//lambda//iota[@xml:lang="no-nb"][@xml:id="id1"][following-sibling::epsilon[starts-with(concat(@attribute,"-"),"attribute-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@insert][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::*[@attr]/tau[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <lambda> <iota xml:lang="no-nb" xml:id="id1"/> @@ -11199,6 +13129,11 @@ </test> <test> <xpath>//epsilon[@attrib="attribute value"][@xml:lang="en-US"]//zeta[starts-with(@true,"cont")][@xml:id="id1"][not(following-sibling::*)]//xi[@xml:lang="no"][following-sibling::sigma[preceding-sibling::*[position() = 1]]//xi[starts-with(@desciption,"fa")][not(child::node())][following-sibling::beta[starts-with(@token,"_blank")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::psi[starts-with(@data,"fal")][@xml:id="id3"][following-sibling::zeta[@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::sigma[@string][preceding-sibling::*[position() = 5]][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[starts-with(concat(@true,"-"),"true-")][@xml:id="id5"][preceding-sibling::*[position() = 6]][following-sibling::pi[@xml:lang="en"][@xml:id="id6"]/sigma[contains(concat(@class,"$"),"-att-value$")][@xml:lang="en-GB"]/alpha[not(following-sibling::*)]/mu[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]/lambda[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@att][not(preceding-sibling::*)]//mu[@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 1]]//delta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <epsilon attrib="attribute value" xml:lang="en-US"> <zeta true="content" xml:id="id1"> @@ -11237,6 +13172,11 @@ </test> <test> <xpath>//theta[contains(@title,"r")][@xml:id="id1"]//beta[@xml:lang="en-GB"][not(preceding-sibling::*)]/kappa[@xml:lang="en"][@xml:id="id2"][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:lang="nb"][following-sibling::rho[contains(concat(@object,"$"),"nodeValue$")][@xml:lang="en"][not(child::node())][following-sibling::lambda[@data="100%"][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 4]][following-sibling::kappa[contains(concat(@attr,"$"),"-is-att-value$")][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="en-US"][@xml:id="id4"]//phi[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(preceding-sibling::phi)][following-sibling::kappa[contains(@token,"t-va")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[@xml:lang="en-US"][@xml:id="id6"][not(child::node())][following-sibling::rho[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//psi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[contains(@false,"ue")][@xml:lang="no-nb"][@xml:id="id8"][not(following-sibling::*)]//omicron[@insert][@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <theta title="true" xml:id="id1"> <beta xml:lang="en-GB"> @@ -11266,6 +13206,11 @@ </test> <test> <xpath>//xi[@insert="100%"]/phi[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[not(preceding-sibling::*)][following-sibling::delta[contains(@title,"ribute")][@xml:lang="en-US"]/eta[starts-with(concat(@desciption,"-"),"true-")][following-sibling::beta[preceding-sibling::*[position() = 1]]/zeta[@class="attribute value"][@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)]//psi[@title="solid 1px green"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[starts-with(@att,"_blank")][@xml:id="id2"]//zeta[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@class][@xml:lang="en-GB"][@xml:id="id3"]//rho[not(preceding-sibling::*)][not(following-sibling::rho)][following-sibling::chi[@xml:lang="en-GB"][@xml:id="id4"][not(following-sibling::*)]//gamma[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::chi[starts-with(@desciption,"con")][@xml:lang="no-nb"][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::eta[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::tau[@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/*[@xml:lang="en"][@xml:id="id9"][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>1</nth> + </result> <tree> <xi insert="100%"> <phi xml:lang="no"> @@ -11302,6 +13247,11 @@ </test> <test> <xpath>//omega[@xml:lang="en"]/upsilon[contains(concat(@attribute,"$"),"ttribute$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[contains(concat(@and,"$"),"00%$")][@xml:lang="nb"][following-sibling::lambda[@xml:lang="no"][@xml:id="id1"][preceding-sibling::*[position() = 2]][following-sibling::phi[contains(@and,"se")][@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::alpha[following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[contains(@number,"lse")][@xml:lang="no-nb"][@xml:id="id2"]/tau[contains(concat(@name,"$"),"e$")][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::epsilon[not(following-sibling::*)]/nu[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::eta[starts-with(concat(@abort,"-"),"false-")][@xml:lang="no"][@xml:id="id5"][not(following-sibling::*)]//omicron[contains(@abort,"value")][@xml:lang="en-GB"][@xml:id="id6"][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en"> <upsilon attribute="attribute" xml:lang="no-nb"/> @@ -11327,6 +13277,11 @@ </test> <test> <xpath>//chi[@string][@xml:lang="no-nb"][@xml:id="id1"]//kappa[contains(concat(@att,"$"),"odeValue$")][following-sibling::*[position()=2]][following-sibling::tau[contains(concat(@and,"$"),"ribute$")][@xml:lang="en"][not(child::node())][following-sibling::psi[starts-with(concat(@attrib,"-"),"solid 1px green-")][@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 2]]//delta[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:lang="no-nb"][not(following-sibling::*)]/tau[@true][@xml:id="id4"]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <chi string="content" xml:lang="no-nb" xml:id="id1"> <kappa att="this.nodeValue"/> @@ -11345,6 +13300,11 @@ </test> <test> <xpath>//beta[contains(concat(@abort,"$"),"%$")][@xml:lang="en"][@xml:id="id1"]//epsilon[@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]/pi[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(@data,"tru")][not(child::node())][following-sibling::phi[contains(@string,"e")][@xml:id="id4"][following-sibling::theta[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::xi[@xml:lang="no-nb"][@xml:id="id6"]/mu[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:lang="no-nb"]//phi[starts-with(concat(@string,"-"),"attribute-")][not(child::node())][following-sibling::nu[@xml:lang="no-nb"][following-sibling::upsilon[@xml:id="id8"]//nu[@or][@xml:lang="no"][not(preceding-sibling::*)]//theta[contains(concat(@false,"$"),"bute value$")][@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::omega[preceding-sibling::*[position() = 1]][following-sibling::tau[not(following-sibling::*)]/omicron[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::iota[@attribute="true"][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="en-US"][@xml:id="id11"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/nu[contains(concat(@desciption,"$"),"d 1px green$")][@xml:id="id12"][not(preceding-sibling::*)]/alpha[contains(concat(@attribute,"$"),"ontent$")][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <beta abort="100%" xml:lang="en" xml:id="id1"> <epsilon xml:lang="no" xml:id="id2"> @@ -11383,6 +13343,11 @@ </test> <test> <xpath>//nu[@attr][@xml:id="id1"]/psi[contains(@insert,"tribute-value")][following-sibling::pi[preceding-sibling::*[position() = 1]]/omicron[@class="true"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@attr="this-is-att-value"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/zeta[@and][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::mu[starts-with(concat(@insert,"-"),"content-")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@true="123456789"][@xml:lang="en"][@xml:id="id4"]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <nu attr="123456789" xml:id="id1"> <psi insert="attribute-value"/> @@ -11401,6 +13366,11 @@ </test> <test> <xpath>//upsilon[starts-with(@insert,"10")][@xml:lang="no"][@xml:id="id1"]/mu[not(preceding-sibling::*)][not(following-sibling::*)]/pi[@class="_blank"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@xml:lang="no-nb"][@xml:id="id2"]//zeta[starts-with(@desciption,"at")][not(following-sibling::*)]/theta/lambda[@content="_blank"][@xml:lang="nb"][@xml:id="id3"][not(child::node())][following-sibling::chi[@xml:lang="no-nb"][not(following-sibling::*)]/delta[@number][@xml:lang="en-US"][not(following-sibling::*)]//iota[contains(@and,"s-att-va")][@xml:id="id4"][not(preceding-sibling::*)]//upsilon[@xml:lang="no-nb"][@xml:id="id5"][following-sibling::chi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@xml:lang="nb"]//kappa[contains(concat(@title,"$"),"123456789$")][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(@class,"co")][@xml:lang="no"][following-sibling::alpha[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//zeta[@name][@xml:id="id8"][not(following-sibling::*)]/lambda[@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <upsilon insert="100%" xml:lang="no" xml:id="id1"> <mu> @@ -11440,6 +13410,11 @@ </test> <test> <xpath>//psi[@xml:lang="en-US"][@xml:id="id1"]//nu[starts-with(concat(@desciption,"-"),"this.nodeValue-")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[contains(@false,"lue")][@xml:lang="nb"][@xml:id="id3"]/gamma[@src][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::eta[starts-with(@and,"another attribute val")]//psi[not(preceding-sibling::*)]/zeta[starts-with(@false,"attribute val")][not(child::node())][following-sibling::tau[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::pi)]//gamma[starts-with(@title,"another attribute valu")][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::rho)]/lambda[@xml:lang="no"][@xml:id="id7"][following-sibling::omicron[not(following-sibling::*)]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>1</nth> + </result> <tree> <psi xml:lang="en-US" xml:id="id1"> <nu desciption="this.nodeValue" xml:lang="en" xml:id="id2"> @@ -11468,6 +13443,11 @@ </test> <test> <xpath>//nu[starts-with(concat(@src,"-"),"attribute-")][@xml:id="id1"]//chi[contains(@attribute,"_")][@xml:lang="no"][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][@xml:id="id2"]//beta[@xml:id="id3"][not(child::node())][following-sibling::upsilon[@token][@xml:lang="no"][not(following-sibling::*)]//theta[@xml:lang="no"]/lambda[contains(concat(@false,"$"),"bute$")][@xml:lang="no"][not(following-sibling::*)]/delta[not(following-sibling::*)]/gamma[@attribute][@xml:lang="no-nb"][not(preceding-sibling::*)]/sigma[@att="this.nodeValue"][@xml:lang="nb"][@xml:id="id4"][following-sibling::nu[@xml:id="id5"][preceding-sibling::*[position() = 1]]/omega[@xml:lang="en-US"][following-sibling::*[position()=2]][not(child::node())][following-sibling::pi[@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/eta[starts-with(concat(@object,"-"),"123456789-")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]]/zeta[contains(concat(@attrib,"$"),"e$")][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[@xml:id="id8"][not(child::node())][following-sibling::epsilon/tau[not(preceding-sibling::*)]//kappa[@xml:lang="nb"][following-sibling::rho[@class][@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//iota[starts-with(concat(@string,"-"),"this-")][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@xml:lang="no-nb"][not(following-sibling::*)]]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <nu src="attribute-value" xml:id="id1"> <chi attribute="_blank" xml:lang="no"/> @@ -11514,6 +13494,11 @@ </test> <test> <xpath>//tau[starts-with(concat(@delete,"-"),"_blank-")]/zeta[starts-with(@attr,"fal")][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//eta[starts-with(@src,"another attribute")][following-sibling::pi[@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 1]]//gamma[@insert][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@content][not(following-sibling::*)]/chi[@object="this-is-att-value"][@xml:lang="no-nb"][not(following-sibling::*)]/gamma[@or][@xml:lang="en-US"][not(following-sibling::*)]//beta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omicron[not(preceding-sibling::*)]/iota[starts-with(concat(@class,"-"),"attribute-")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::chi[starts-with(concat(@src,"-"),"attribute-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <tau delete="_blank"> <zeta attr="false" xml:lang="no"/> @@ -11543,6 +13528,11 @@ </test> <test> <xpath>//psi[contains(@att,"bute val")][@xml:lang="no-nb"]/psi[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[starts-with(concat(@or,"-"),"content-")][preceding-sibling::*[position() = 1]]/xi[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::rho[@false="_blank"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::phi[@xml:lang="en-GB"][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 4]][following-sibling::eta[@attrib][@xml:lang="en-US"][@xml:id="id4"][following-sibling::nu[@xml:lang="en-GB"][preceding-sibling::*[position() = 6]]/upsilon[@xml:lang="en"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::kappa[@title][preceding-sibling::*[position() = 1]]]]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <psi att="attribute value" xml:lang="no-nb"> <psi xml:id="id1"> @@ -11567,6 +13557,11 @@ </test> <test> <xpath>//phi[contains(concat(@abort,"$"),"te value$")][@xml:lang="en"][@xml:id="id1"]/lambda[following-sibling::*[position()=1]][following-sibling::delta[not(following-sibling::*)]/iota[contains(@attr,"tent")][@xml:lang="en"][not(preceding-sibling::*)]//lambda[@desciption="_blank"][@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::xi[@attribute][@xml:id="id3"][preceding-sibling::*[position() = 1]]//nu[@xml:id="id4"][not(child::node())][following-sibling::*[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <phi abort="attribute value" xml:lang="en" xml:id="id1"> <lambda/> @@ -11586,6 +13581,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]/gamma[@content][@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]//iota[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[starts-with(concat(@attribute,"-"),"solid 1px green-")][@xml:id="id3"][not(following-sibling::*)]/gamma[not(preceding-sibling::*)][following-sibling::psi[@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::chi[@title][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::sigma[starts-with(@attribute,"at")][@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/phi[@xml:lang="no"][following-sibling::*[position()=2]][not(child::node())][following-sibling::gamma[@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@number][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau[@name][@xml:lang="en-GB"][@xml:id="id6"]/nu[contains(@class,"tru")][@xml:lang="en-US"][following-sibling::zeta[contains(@abort,"tent")][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::iota[@xml:lang="en"][@xml:id="id8"][not(following-sibling::*)]/tau[@att][@xml:lang="en-GB"][not(following-sibling::*)]//alpha[starts-with(concat(@data,"-"),"another attribute value-")][@xml:lang="en-GB"][@xml:id="id9"]/kappa[@string][not(preceding-sibling::*)]]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>1</nth> + </result> <tree> <iota xml:id="id1"> <gamma content="attribute" xml:lang="en-GB" xml:id="id2"> @@ -11621,6 +13621,11 @@ </test> <test> <xpath>//mu[contains(concat(@token,"$"),"%$")]//alpha[starts-with(concat(@src,"-"),"this-")][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[contains(concat(@desciption,"$"),"00%$")][@xml:id="id1"][not(following-sibling::*)]/zeta[@xml:lang="nb"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[not(following-sibling::*)]/pi[starts-with(@abort,"another attribute v")][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::beta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@number]//iota[@xml:lang="no-nb"][@xml:id="id4"][following-sibling::pi[not(child::node())][following-sibling::sigma[@xml:id="id5"][preceding-sibling::*[position() = 2]]/mu[contains(concat(@class,"$"),"t-value$")][@xml:lang="en-GB"][not(following-sibling::*)]//alpha[starts-with(@title,"this-i")][@xml:id="id6"][not(child::node())][following-sibling::iota[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@xml:lang="no-nb"][not(child::node())][following-sibling::eta[@xml:id="id7"][preceding-sibling::*[position() = 1]]//omicron[@and="this.nodeValue"][@xml:id="id8"][not(preceding-sibling::*)]/lambda[@abort][@xml:lang="en"]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <mu token="100%"> <alpha src="this-is-att-value"/> @@ -11655,6 +13660,11 @@ </test> <test> <xpath>//omega[starts-with(concat(@token,"-"),"true-")]/gamma[@attribute]//pi[starts-with(concat(@desciption,"-"),"_blank-")][@xml:id="id1"][not(child::node())][following-sibling::*[contains(@token,"attrib")][@xml:id="id2"][preceding-sibling::*[position() = 1]]//chi[not(preceding-sibling::*)][following-sibling::nu[@attribute][@xml:lang="en-US"]/epsilon[@false="attribute"][@xml:lang="nb"][not(child::node())][following-sibling::delta[@xml:id="id3"][not(following-sibling::*)]//upsilon[not(child::node())][following-sibling::rho[@xml:lang="en-GB"][following-sibling::xi[contains(concat(@string,"$"),"alue$")][following-sibling::mu[@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//kappa[contains(concat(@and,"$"),"nodeValue$")][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <omega token="true"> <gamma attribute="false"> @@ -11681,6 +13691,11 @@ </test> <test> <xpath>//nu[starts-with(@attr,"_")][@xml:lang="nb"]//alpha[not(following-sibling::*)]/phi[not(following-sibling::*)]/theta[contains(concat(@abort,"$"),"k$")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@number,"$"),"-att-value$")][@xml:id="id1"][not(child::node())][following-sibling::upsilon[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/*[contains(@abort," 1px green")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::rho[@xml:lang="no"][preceding-sibling::*[position() = 1]]//xi[@xml:lang="en"][not(preceding-sibling::*)]//xi[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[contains(concat(@attrib,"$"),"-value$")][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@object,"$"),"alse$")][@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]]/iota[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@att][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 2]]/lambda[@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@xml:id="id8"][preceding-sibling::*[position() = 1]]//chi[@number][@xml:lang="en-GB"][following-sibling::mu[@abort][@xml:id="id9"][not(following-sibling::*)]]]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <nu attr="_blank" xml:lang="nb"> <alpha> @@ -11719,6 +13734,11 @@ </test> <test> <xpath>//sigma//gamma[not(following-sibling::*)]/kappa[@attr="_blank"][@xml:lang="en-GB"][not(following-sibling::*)]/nu[@xml:lang="en"][@xml:id="id1"][following-sibling::kappa[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[not(child::node())][following-sibling::psi[@or][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(preceding-sibling::psi)]//gamma[@true][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::pi[@data][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omicron[@token][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//psi[contains(@false,"se")][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::zeta[@class="attribute"][@xml:lang="no-nb"][@xml:id="id7"][following-sibling::lambda[@title="another attribute value"]/chi[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[starts-with(concat(@attribute,"-"),"attribute value-")][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::epsilon[@xml:id="id9"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::zeta[@xml:id="id10"][preceding-sibling::*[position() = 3]]/beta[@xml:lang="en-US"][@xml:id="id11"][not(following-sibling::*)]//rho[@xml:id="id12"][not(following-sibling::*)]/iota[@xml:id="id13"][not(preceding-sibling::*)][not(following-sibling::*)]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <sigma> <gamma> @@ -11757,6 +13777,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]//theta[starts-with(concat(@true,"-"),"123456789-")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::pi[contains(concat(@attr,"$"),"value$")][@xml:lang="en-US"][not(child::node())][following-sibling::phi[following-sibling::*[position()=1]][following-sibling::beta[contains(concat(@true,"$"),"e$")][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//zeta[following-sibling::eta[starts-with(concat(@number,"-"),"attribute-")][preceding-sibling::*[position() = 1]][not(preceding-sibling::eta or following-sibling::eta)]//omicron[not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:id="id4"]/kappa[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[not(preceding-sibling::*)][not(following-sibling::*)]//pi[following-sibling::epsilon[contains(concat(@att,"$"),"e$")][not(following-sibling::*)]/lambda[contains(@true,"00%")][@xml:lang="en-US"][not(following-sibling::*)]/omega[@xml:lang="no"][not(preceding-sibling::*)]]]]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <rho xml:id="id1"> <theta true="123456789" xml:lang="en-US" xml:id="id2"/> @@ -11787,6 +13812,11 @@ </test> <test> <xpath>//psi[starts-with(concat(@attribute,"-"),"true-")][@xml:lang="en-US"][@xml:id="id1"]//chi[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@or][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::iota[starts-with(concat(@insert,"-"),"123456789-")][@xml:lang="en-GB"][@xml:id="id3"]/epsilon[starts-with(@false,"this-")][not(preceding-sibling::*)]/rho[not(following-sibling::*)]/gamma[@xml:lang="no-nb"]/alpha[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[starts-with(concat(@data,"-"),"attribute-")][@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::tau[contains(@desciption," value")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[starts-with(concat(@and,"-"),"attribute-")][@xml:lang="no"][not(child::node())][following-sibling::chi[starts-with(@string,"another at")][@xml:id="id5"][following-sibling::xi[preceding-sibling::*[position() = 2]]/alpha[contains(@class,"s-att-value")][not(following-sibling::*)]//eta[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@content][preceding-sibling::*[position() = 1]]//psi[not(preceding-sibling::*)][not(child::node())][following-sibling::pi[starts-with(concat(@true,"-"),"another attribute value-")][@xml:lang="en-US"][@xml:id="id7"][not(following-sibling::*)]/theta[@xml:lang="nb"][position() = 1]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <psi attribute="true" xml:lang="en-US" xml:id="id1"> <chi xml:id="id2"/> @@ -11824,6 +13854,11 @@ </test> <test> <xpath>//xi/eta[contains(@content,"bla")][@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[contains(concat(@number,"$"),"bute value$")][preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]/epsilon[contains(@delete,"alue")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[contains(concat(@att,"$"),"00%$")][@xml:id="id2"][not(child::node())][following-sibling::iota[following-sibling::*[position()=5]][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][not(child::node())][following-sibling::epsilon[@false="this-is-att-value"][@xml:lang="en"][not(child::node())][following-sibling::omega[following-sibling::chi[starts-with(concat(@desciption,"-"),"content-")][@xml:lang="en"][preceding-sibling::*[position() = 5]][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 6]][not(following-sibling::*)]/rho[not(preceding-sibling::*)][following-sibling::lambda[preceding-sibling::*[position() = 1]][following-sibling::theta[@attribute="_blank"]//epsilon[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)]//*[starts-with(@object,"conte")][@xml:lang="no"][@xml:id="id5"][following-sibling::*[@attribute][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@content][@xml:lang="en"][following-sibling::upsilon//gamma[starts-with(concat(@class,"-"),"attribute value-")][not(following-sibling::*)]//rho[@src][@xml:id="id6"][not(following-sibling::*)]//beta[@xml:id="id7"][not(preceding-sibling::*)][position() = 1]]]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <xi> <eta content="_blank" xml:lang="no-nb" xml:id="id1"/> @@ -11864,6 +13899,11 @@ </test> <test> <xpath>//omicron[@xml:lang="nb"]//upsilon[contains(concat(@number,"$"),"e value$")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[starts-with(concat(@abort,"-"),"attribute value-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[starts-with(@insert,"_")][@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:id="id2"][not(child::node())][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::delta[starts-with(concat(@attribute,"-"),"solid 1px green-")][@xml:lang="en"][preceding-sibling::*[position() = 2]]/omega[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::beta[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::psi[@name][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omicron[@title="attribute value"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//kappa[starts-with(concat(@title,"-"),"attribute-")][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:id="id5"][not(following-sibling::*)]//alpha[following-sibling::rho[preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:lang="nb"]/nu[@number][not(child::node())][following-sibling::pi[starts-with(@object,"false")][@xml:id="id6"]//psi[@false][@xml:id="id7"][not(preceding-sibling::*)]/epsilon[contains(concat(@false,"$"),"nk$")][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[following-sibling::*[position()=2]][not(child::node())][following-sibling::lambda[contains(@object,"bute value")][@xml:id="id8"][not(child::node())][following-sibling::pi[contains(concat(@desciption,"$"),"s.nodeValue$")][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="nb"> <upsilon number="attribute value"/> @@ -11904,6 +13944,11 @@ </test> <test> <xpath>//*[@xml:lang="en-US"]/psi[contains(@data,"e")][not(preceding-sibling::*)]//tau[@xml:lang="no-nb"][@xml:id="id1"][not(child::node())][following-sibling::zeta[not(child::node())][following-sibling::iota[@xml:lang="en-GB"][not(child::node())][following-sibling::mu[@attr="attribute-value"][@xml:lang="no"][not(following-sibling::*)]/delta[@xml:id="id2"]//kappa[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::*[starts-with(concat(@abort,"-"),"this-")][@xml:id="id4"][following-sibling::rho[@xml:id="id5"][following-sibling::alpha[@object="this-is-att-value"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 4]]/delta[contains(concat(@content,"$"),"blank$")][not(following-sibling::*)]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-US"> <psi data="true"> @@ -11929,6 +13974,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]/theta[@true][@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::delta[following-sibling::omicron[contains(concat(@desciption,"$"),"ribute$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::kappa[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]//beta[@attrib][@xml:lang="en"][@xml:id="id4"][not(child::node())][following-sibling::upsilon[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <alpha xml:id="id1"> <theta true="attribute-value" xml:lang="no" xml:id="id2"/> @@ -11945,6 +13995,11 @@ </test> <test> <xpath>//chi[starts-with(concat(@object,"-"),"this.nodeValue-")][@xml:lang="no"]/iota[@attr][following-sibling::eta[preceding-sibling::*[position() = 1]]/psi[following-sibling::*[position()=1]][following-sibling::lambda[@abort][@xml:lang="no"][@xml:id="id1"]/*[@xml:lang="no"][@xml:id="id2"]//phi[starts-with(concat(@abort,"-"),"true-")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:id="id4"][not(child::node())][following-sibling::iota[@xml:id="id5"]//phi[contains(@src,"10")][@xml:id="id6"][not(preceding-sibling::*)][not(preceding-sibling::phi or following-sibling::phi)][following-sibling::tau[not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]//delta[@data][@xml:lang="nb"][not(child::node())][following-sibling::omega[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[contains(@false,"r")]/xi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[position() = 1]][position() = 1]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <chi object="this.nodeValue" xml:lang="no"> <iota attr="solid 1px green"/> @@ -11979,6 +14034,11 @@ </test> <test> <xpath>//xi[@xml:lang="en-GB"]//omicron[@xml:id="id1"][not(preceding-sibling::*)]//*[@true="this-is-att-value"][@xml:id="id2"][following-sibling::chi[@xml:id="id3"][not(following-sibling::*)]//alpha//epsilon[@object][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@src][not(preceding-sibling::*)]/kappa[starts-with(concat(@false,"-"),"another attribute value-")]/xi[starts-with(concat(@number,"-"),"123456789-")][@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::mu[contains(@delete,"r")][not(following-sibling::*)]//xi[starts-with(@name,"_blan")][following-sibling::*[@xml:id="id6"][not(following-sibling::*)]/*[@object][@xml:lang="no-nb"][not(following-sibling::*)]/eta[@xml:lang="no-nb"][not(following-sibling::*)]/epsilon[@or="attribute value"][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::psi[@delete][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::kappa[@xml:id="id8"]//omega[@data][@xml:lang="en-US"][not(preceding-sibling::*)]/mu[starts-with(concat(@attribute,"-"),"true-")][@xml:id="id9"][not(following-sibling::*)]//eta[contains(concat(@number,"$"),"ue$")][@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[starts-with(concat(@attrib,"-"),"attribute-")][@xml:lang="en"][not(preceding-sibling::*)]/eta[@true][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::alpha[@data="100%"][@xml:id="id11"]//omicron[@src="this-is-att-value"][@xml:id="id12"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <xi xml:lang="en-GB"> <omicron xml:id="id1"> @@ -12027,6 +14087,11 @@ </test> <test> <xpath>//eta[@xml:lang="en-US"]//zeta[@attribute][@xml:id="id1"][not(preceding-sibling::*)]//lambda[@attr="100%"][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]//rho[contains(concat(@src,"$"),"Value$")][@xml:lang="en-US"][not(preceding-sibling::*)]/rho[contains(@name,"e")][not(preceding-sibling::*)]/psi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[@or][@xml:id="id3"][not(following-sibling::*)]//psi//chi[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::tau[@string="false"][preceding-sibling::*[position() = 2]][following-sibling::delta[@xml:id="id4"]/kappa[@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::omicron[starts-with(@string,"tr")][@xml:lang="no"][@xml:id="id6"][not(following-sibling::*)]//kappa[starts-with(@abort,"attr")]//omega[@desciption][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="nb"][preceding-sibling::*[position() = 1]]//delta[starts-with(@attribute,"_b")][@xml:id="id7"][following-sibling::mu[@number][@xml:lang="no"][@xml:id="id8"]/chi[@xml:lang="no-nb"][@xml:id="id9"]/eta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:id="id10"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="en-US"> <zeta attribute="false" xml:id="id1"> @@ -12069,6 +14134,11 @@ </test> <test> <xpath>//omega[@name][@xml:lang="en-GB"]/lambda[@content][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@xml:lang="no"][@xml:id="id2"]/beta[starts-with(@abort,"1")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:id="id3"][not(child::node())][following-sibling::*[@xml:lang="en-GB"][not(child::node())][following-sibling::rho[starts-with(@true,"th")][@xml:lang="no"][preceding-sibling::*[position() = 2]]//phi[starts-with(concat(@object,"-"),"attribute value-")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::sigma[starts-with(@insert,"tru")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[@xml:lang="en"][not(child::node())][following-sibling::delta[@xml:lang="en"][@xml:id="id5"][not(following-sibling::*)]//theta[contains(@or,"tribute")][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::iota[preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[starts-with(@and,"_b")][@xml:lang="nb"][following-sibling::psi[contains(@attribute,"att-value")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/phi[@xml:lang="en-US"][position() = 1]][position() = 1]]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <omega name="attribute" xml:lang="en-GB"> <lambda content="false" xml:id="id1"/> @@ -12098,6 +14168,11 @@ </test> <test> <xpath>//eta[@xml:id="id1"]/eta[following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[contains(concat(@class,"$"),"er attribute value$")][@xml:lang="en-US"][not(following-sibling::*)]/alpha[@class][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:id="id2"][not(child::node())][following-sibling::kappa[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//rho[starts-with(concat(@insert,"-"),"attribute-")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::nu[@number][@xml:lang="no-nb"]/upsilon[@xml:id="id4"][not(following-sibling::*)]/eta[@insert][@xml:id="id5"][not(following-sibling::*)]//alpha[contains(@title,"ttribu")][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@object="true"][@xml:id="id7"][following-sibling::nu[@attr][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//kappa[@token][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::kappa[@true="100%"][@xml:id="id9"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>1</nth> + </result> <tree> <eta xml:id="id1"> <eta/> @@ -12127,6 +14202,11 @@ </test> <test> <xpath>//sigma[@xml:lang="en"][@xml:id="id1"]//omega[starts-with(concat(@name,"-"),"content-")][not(preceding-sibling::*)]//epsilon[@xml:id="id2"][not(preceding-sibling::*)]/upsilon[@false="content"][@xml:lang="en"][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/sigma[contains(@abort,"t")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::alpha[not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::mu[not(following-sibling::*)]/delta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="en" xml:id="id1"> <omega name="content"> @@ -12153,6 +14233,11 @@ </test> <test> <xpath>//theta[@xml:lang="no-nb"][@xml:id="id1"]//omega[starts-with(@number,"soli")][not(preceding-sibling::*)]//mu[@xml:lang="en-GB"][not(child::node())][following-sibling::eta[starts-with(concat(@false,"-"),"_blank-")][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/nu[contains(@false,"%")][not(preceding-sibling::*)]/psi[@and][@xml:lang="en-GB"][following-sibling::eta[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::alpha[following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//nu[@xml:lang="en-GB"][not(preceding-sibling::*)]//pi[contains(concat(@title,"$"),"e$")][following-sibling::theta[starts-with(concat(@attr,"-"),"false-")][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="no-nb" xml:id="id1"> <omega number="solid 1px green"> @@ -12179,6 +14264,11 @@ </test> <test> <xpath>//alpha[@true][@xml:lang="en-US"]//nu[@xml:lang="nb"]//xi[@xml:lang="no-nb"][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::delta[@object][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//psi[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon//omega[contains(concat(@title,"$"),"id 1px green$")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@xml:id="id4"][not(preceding-sibling::*)]/omicron[@attribute][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:id="id5"]/upsilon[@attribute][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@attribute="attribute-value"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[contains(concat(@delete,"$"),"ibute-value$")][@xml:lang="en-US"][following-sibling::phi[@src="this-is-att-value"][@xml:id="id8"][following-sibling::rho[@xml:lang="en"][@xml:id="id9"][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <alpha true="this.nodeValue" xml:lang="en-US"> <nu xml:lang="nb"> @@ -12208,6 +14298,11 @@ </test> <test> <xpath>//pi/tau[@xml:lang="en-US"][not(child::node())][following-sibling::*[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[contains(concat(@number,"$"),"789$")][not(following-sibling::*)]//tau[@xml:lang="nb"]/theta[@xml:lang="en"][not(child::node())][following-sibling::zeta[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@xml:lang="nb"][@xml:id="id1"][following-sibling::lambda[@xml:id="id2"][not(child::node())][following-sibling::nu[contains(concat(@attribute,"$"),"content$")][@xml:lang="en-GB"][not(following-sibling::*)]//omicron[@xml:id="id3"][not(preceding-sibling::*)]/pi[@xml:id="id4"][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(preceding-sibling::nu)][not(child::node())][following-sibling::theta[@xml:lang="no-nb"][@xml:id="id5"][not(following-sibling::*)]//kappa[@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]//kappa[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@token="attribute value"][@xml:id="id7"][not(preceding-sibling::*)]//chi[@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)]/*[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <pi> <tau xml:lang="en-US"/> @@ -12245,6 +14340,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]/sigma[contains(concat(@abort,"$"),"his.nodeValue$")]//beta[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]/beta[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::beta)][not(child::node())][following-sibling::phi[contains(concat(@delete,"$"),"ute$")][@xml:id="id4"][following-sibling::omega[@class][@xml:lang="en"][following-sibling::iota[starts-with(concat(@data,"-"),"this.nodeValue-")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//upsilon[@false="_blank"][@xml:id="id5"][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>1</nth> + </result> <tree> <chi xml:id="id1"> <sigma abort="this.nodeValue"> @@ -12264,6 +14364,11 @@ </test> <test> <xpath>//xi[@string]//delta[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[starts-with(concat(@delete,"-"),"123456789-")][not(preceding-sibling::*)]/omicron[not(child::node())][following-sibling::zeta[@attrib][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[starts-with(concat(@class,"-"),"true-")][@xml:lang="en"][@xml:id="id2"][not(child::node())][following-sibling::alpha[@desciption][@xml:id="id3"]//lambda[@xml:lang="en-US"][not(following-sibling::*)]/mu[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[not(following-sibling::*)]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <xi string="false"> <delta xml:lang="en" xml:id="id1"> @@ -12287,6 +14392,11 @@ </test> <test> <xpath>//sigma[@xml:lang="en-US"][@xml:id="id1"]/kappa[@xml:id="id2"][not(preceding-sibling::*)]//sigma[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[contains(@and,"blan")][not(following-sibling::*)]//upsilon[not(child::node())][following-sibling::chi[starts-with(concat(@abort,"-"),"true-")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::epsilon[starts-with(@src,"co")]/pi[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::phi[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 2]]/epsilon[@data="this.nodeValue"][@xml:lang="nb"][not(preceding-sibling::*)]//nu[@xml:lang="no"]//omega[@string="attribute value"][not(following-sibling::*)]/pi[not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[not(preceding-sibling::*)][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="en-US" xml:id="id1"> <kappa xml:id="id2"> @@ -12322,6 +14432,11 @@ </test> <test> <xpath>//epsilon[@xml:id="id1"]//upsilon[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[contains(concat(@src,"$"),"ibute value$")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[not(following-sibling::*)]/gamma[not(preceding-sibling::*)]//phi[not(preceding-sibling::*)][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//sigma[@att="attribute"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[contains(@true,"ttribute v")][@xml:id="id6"][not(following-sibling::*)]/rho//zeta[position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:id="id1"> <upsilon xml:id="id2"/> @@ -12349,6 +14464,11 @@ </test> <test> <xpath>//psi[@xml:lang="no-nb"][@xml:id="id1"]/xi[@xml:lang="no-nb"][following-sibling::omicron[starts-with(@string,"_")][@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]/lambda[@xml:id="id3"][not(preceding-sibling::*)][not(preceding-sibling::lambda)][following-sibling::iota[@true][@xml:lang="en-GB"][following-sibling::kappa[starts-with(concat(@object,"-"),"attribute-")][@xml:lang="nb"][following-sibling::epsilon[starts-with(concat(@title,"-"),"_blank-")][@xml:lang="en-US"][@xml:id="id4"][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no-nb" xml:id="id1"> <xi xml:lang="no-nb"/> @@ -12365,6 +14485,11 @@ </test> <test> <xpath>//mu[starts-with(concat(@attr,"-"),"123456789-")]//lambda[@xml:lang="nb"][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::delta[contains(@desciption,"ute-value")][not(following-sibling::*)]//xi[contains(concat(@or,"$"),"ank$")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[@xml:id="id2"][following-sibling::delta[starts-with(@insert,"this-is-att-valu")][preceding-sibling::*[position() = 1]][following-sibling::*[not(following-sibling::*)]/theta[@number][not(child::node())][following-sibling::xi[@xml:lang="nb"][not(child::node())][following-sibling::psi[@xml:lang="nb"][following-sibling::rho[@token][@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::phi[@xml:id="id3"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[not(following-sibling::*)]//xi[starts-with(concat(@class,"-"),"_blank-")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::pi[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[not(following-sibling::*)]/beta[not(preceding-sibling::*)]/chi[@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:id="id7"][not(child::node())][following-sibling::chi[starts-with(@content,"fal")][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::gamma[@class="attribute"][@xml:id="id9"][preceding-sibling::*[position() = 3]]][position() = 1]]]]][position() = 1]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <mu attr="123456789"> <lambda xml:lang="nb" xml:id="id1"/> @@ -12401,6 +14526,11 @@ </test> <test> <xpath>//delta[@xml:lang="en"]//alpha[starts-with(@string,"solid 1px green")][@xml:lang="no"][not(following-sibling::*)]/gamma[@xml:id="id1"][not(child::node())][following-sibling::gamma[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@object][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[contains(concat(@att,"$"),"alse$")][@xml:lang="en-GB"][not(child::node())][following-sibling::rho[@xml:lang="nb"]//tau[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@class][@xml:id="id5"]//mu[@class][not(preceding-sibling::*)][following-sibling::epsilon[contains(concat(@token,"$"),"%$")][@xml:lang="nb"][not(following-sibling::*)]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en"> <alpha string="solid 1px green" xml:lang="no"> @@ -12425,6 +14555,11 @@ </test> <test> <xpath>//beta[@xml:lang="no"][@xml:id="id1"]//omicron[contains(concat(@true,"$"),"odeValue$")][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::epsilon[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[@class="100%"][not(preceding-sibling::*)][following-sibling::omega[following-sibling::zeta[@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no" xml:id="id1"> <omicron true="this.nodeValue" xml:id="id2"/> @@ -12440,6 +14575,11 @@ </test> <test> <xpath>//omicron[@content]//xi[@xml:id="id1"]/omicron[@xml:lang="no-nb"][@xml:id="id2"][following-sibling::nu[@false][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::alpha[preceding-sibling::*[position() = 2]]/gamma[@xml:id="id4"][not(preceding-sibling::*)]//zeta[@number="attribute-value"][@xml:lang="no"][not(child::node())][following-sibling::psi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::omicron[contains(concat(@delete,"$"),"ue$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/upsilon[starts-with(@title,"another attribute value")][@xml:lang="en"][following-sibling::iota[starts-with(@or,"fal")][@xml:id="id5"][preceding-sibling::*[position() = 1]]/beta[@insert][@xml:lang="no-nb"][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::beta[@xml:lang="no"][@xml:id="id7"][not(child::node())][following-sibling::epsilon[@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/theta[starts-with(@true,"this.nodeValu")][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>1</nth> + </result> <tree> <omicron content="true"> <xi xml:id="id1"> @@ -12469,6 +14609,11 @@ </test> <test> <xpath>//chi[@data]/gamma[@data="123456789"][@xml:lang="en-US"][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::upsilon[@xml:lang="en-US"][@xml:id="id2"]//gamma[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)]//chi[@xml:id="id4"][not(child::node())][following-sibling::zeta[contains(concat(@class,"$"),"is-att-value$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::chi[starts-with(concat(@number,"-"),"attribute-")][@xml:lang="en-US"]//pi[@xml:lang="en"]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <chi data="_blank"> <gamma data="123456789" xml:lang="en-US" xml:id="id1"/> @@ -12490,6 +14635,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]/delta[starts-with(@true,"t")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)]/theta[starts-with(concat(@and,"-"),"100%-")][not(child::node())][following-sibling::delta[starts-with(@att,"attri")][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[contains(concat(@data,"$"),"ue$")][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::phi[starts-with(@insert,"attribute valu")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]//omega[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::psi[contains(@desciption,"t-value")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::psi[not(following-sibling::*)]//xi[@insert][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[starts-with(@number,"t")][@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[contains(concat(@src,"$")," 1px green$")][@xml:lang="no"][@xml:id="id9"][not(child::node())][following-sibling::alpha[@token="attribute-value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//iota[@xml:id="id10"][not(preceding-sibling::*)][following-sibling::gamma//alpha[@and][@xml:lang="en-US"]//epsilon[starts-with(concat(@abort,"-"),"attribute-")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:id="id11"][preceding-sibling::*[position() = 1]]//rho[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="en-GB"][@xml:id="id12"][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <delta true="true" xml:lang="en-US" xml:id="id2"> @@ -12533,6 +14683,11 @@ </test> <test> <xpath>//alpha[contains(concat(@class,"$"),"blank$")][@xml:lang="en-GB"][@xml:id="id1"]/zeta[@string="attribute-value"][@xml:id="id2"][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"][not(child::node())][following-sibling::sigma[@attribute="attribute"][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::beta[@xml:lang="no-nb"][not(following-sibling::*)]//chi[@data="false"][@xml:id="id5"][not(preceding-sibling::*)]//tau[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@xml:lang="no"][not(following-sibling::upsilon)][following-sibling::chi[@class][@xml:lang="nb"][following-sibling::psi[@xml:id="id7"][following-sibling::*[position()=2]][following-sibling::psi[@xml:lang="no"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::psi[@name="_blank"][@xml:lang="no"][@xml:id="id8"][preceding-sibling::*[position() = 4]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <alpha class="_blank" xml:lang="en-GB" xml:id="id1"> <zeta string="attribute-value" xml:id="id2"/> @@ -12557,6 +14712,11 @@ </test> <test> <xpath>//omicron//theta[not(preceding-sibling::*)]/omega[@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]/tau[@xml:lang="en-US"][not(following-sibling::*)]//nu[@xml:lang="nb"]/theta[@desciption="123456789"][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::upsilon[@number="content"][@xml:lang="en"][following-sibling::tau[starts-with(@attr,"this-is-att")][@xml:id="id3"][preceding-sibling::*[position() = 2]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>1</nth> + </result> <tree> <omicron> <theta> @@ -12577,6 +14737,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]/kappa[@false]/phi[@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::xi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@xml:lang="no"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::omega[@attrib][@xml:lang="nb"][@xml:id="id4"]//sigma[@xml:lang="en-GB"][not(following-sibling::*)]//theta//omicron[not(preceding-sibling::*)]/rho[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en-GB"][not(following-sibling::*)]//rho[@abort][@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)]/omega[not(child::node())][following-sibling::sigma[contains(concat(@content,"$"),"e value$")][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::sigma)][following-sibling::lambda[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[contains(@attrib,"e")][@xml:lang="en"][@xml:id="id8"][following-sibling::*[position()=2]][not(child::node())][following-sibling::lambda[@and="solid 1px green"][@xml:lang="no"][@xml:id="id9"][not(child::node())][following-sibling::sigma[@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 5]][position() = 1]]]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <iota xml:id="id1"> <kappa false="100%"> @@ -12610,6 +14775,11 @@ </test> <test> <xpath>//xi[contains(@true,"e")][@xml:id="id1"]//nu[following-sibling::*[position()=5]][following-sibling::mu[@delete][@xml:id="id2"][not(child::node())][following-sibling::gamma[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::*[contains(concat(@false,"$"),"is-is-att-value$")][@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::theta[@and][preceding-sibling::*[position() = 4]][following-sibling::theta[@xml:lang="nb"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//delta[contains(concat(@attrib,"$"),"false$")][@xml:id="id5"][not(preceding-sibling::*)]/mu[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(concat(@content,"$"),"true$")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::iota[@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[not(child::node())][following-sibling::xi[contains(@att,"56789")][@xml:id="id8"][following-sibling::chi[preceding-sibling::*[position() = 5]][position() = 1]][position() = 1]]]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <xi true="solid 1px green" xml:id="id1"> <nu/> @@ -12634,6 +14804,11 @@ </test> <test> <xpath>//tau[@token][@xml:id="id1"]//theta[starts-with(@insert,"10")][@xml:lang="en-US"][not(following-sibling::*)]/kappa[@and][@xml:id="id2"]//alpha[contains(@data,"nt")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@src][preceding-sibling::*[position() = 1]]//delta[@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::*[@attribute="this.nodeValue"][@xml:id="id4"][not(following-sibling::*)]/omicron[@title][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//phi[starts-with(@string,"this-")][@xml:id="id6"][following-sibling::rho[starts-with(@name,"f")][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::zeta[not(following-sibling::*)]/gamma[contains(@token,"odeValue")][not(following-sibling::*)]/theta[contains(concat(@abort,"$"),"his.nodeValue$")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:id="id8"]//kappa[@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)]//upsilon[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@number][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[contains(concat(@desciption,"$"),"s-is-att-value$")][@xml:lang="en"][@xml:id="id10"][following-sibling::sigma[@xml:id="id11"][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <tau token="attribute value" xml:id="id1"> <theta insert="100%" xml:lang="en-US"> @@ -12674,6 +14849,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]/xi[@xml:lang="nb"][@xml:id="id2"]/alpha[@number][not(preceding-sibling::*)][following-sibling::zeta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/delta[@or][not(child::node())][following-sibling::mu[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::lambda[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/xi[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@name][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[starts-with(@att,"soli")][following-sibling::delta[@number="_blank"][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]/beta[@xml:lang="en-GB"]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <phi xml:id="id1"> <xi xml:lang="nb" xml:id="id2"> @@ -12700,6 +14880,11 @@ </test> <test> <xpath>//*[@xml:lang="en-US"]//lambda[not(preceding-sibling::*)]//mu[@xml:lang="no-nb"][not(following-sibling::*)]//pi[@class][@xml:lang="no"][not(following-sibling::*)]/nu[@token][@xml:lang="no"][@xml:id="id1"]//xi[@xml:id="id2"][not(following-sibling::*)]//omega[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::zeta[preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[contains(concat(@attr,"$"),"tribute$")][@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::psi[@attribute="false"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//beta[contains(@false,"ut")][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@object][@xml:lang="en"]/*[@xml:lang="no-nb"][not(following-sibling::*)]//zeta[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::upsilon[@true][preceding-sibling::*[position() = 1]]//phi[@xml:id="id7"][following-sibling::iota[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[starts-with(concat(@object,"-"),"solid 1px green-")][preceding-sibling::*[position() = 2]]//pi[@content="this-is-att-value"][@xml:id="id8"][following-sibling::*[position()=2]][following-sibling::*[@xml:lang="no-nb"][not(child::node())][following-sibling::gamma[@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/beta[@att][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[@number][@xml:lang="no"][not(following-sibling::*)][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-US"> <lambda> @@ -12743,6 +14928,11 @@ </test> <test> <xpath>//lambda[@xml:lang="en-GB"]/alpha[@xml:id="id1"][following-sibling::phi[contains(@data,"_bl")][@xml:lang="nb"][@xml:id="id2"][following-sibling::rho[@xml:lang="en-GB"][not(following-sibling::*)]/upsilon[contains(concat(@title,"$"),"this.nodeValue$")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::epsilon[@false="another attribute value"][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//pi[@xml:lang="no"][not(child::node())][following-sibling::eta[@desciption="attribute"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:id="id5"]/iota[@data][@xml:id="id6"]/iota[contains(concat(@false,"$"),"e$")][following-sibling::*[position()=3]][not(child::node())][following-sibling::mu[@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@xml:lang="en-GB"][@xml:id="id8"][not(child::node())][following-sibling::omega[starts-with(concat(@attr,"-"),"attribute value-")][@xml:id="id9"][preceding-sibling::*[position() = 3]]//phi//beta[@xml:lang="en-US"][@xml:id="id10"][not(following-sibling::*)]//sigma[not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::omicron[@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[contains(concat(@number,"$"),"e$")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id12"]//mu[contains(@delete,"olid 1px")][@xml:lang="nb"][@xml:id="id13"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::mu)]/psi[@class="content"][@xml:lang="no"][not(preceding-sibling::psi)][not(child::node())][following-sibling::upsilon[@xml:lang="en-US"][@xml:id="id14"][preceding-sibling::*[position() = 1]][following-sibling::tau[@xml:lang="nb"][@xml:id="id15"]]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="en-GB"> <alpha xml:id="id1"/> @@ -12784,6 +14974,11 @@ </test> <test> <xpath>//sigma[@att="123456789"][@xml:id="id1"]//omega[not(child::node())][following-sibling::upsilon[@xml:lang="no"]//sigma[@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::lambda[starts-with(concat(@object,"-"),"true-")][@xml:lang="en-US"]//sigma[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]//delta[@true][@xml:lang="en-GB"][@xml:id="id3"]/chi[following-sibling::*[position()=1]][following-sibling::beta[contains(@src,"lid 1px gr")][@xml:lang="no-nb"][not(following-sibling::*)]/*[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[contains(@insert,"-at")][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::*[@att][@xml:id="id6"][not(following-sibling::*)]//omega[@or="_blank"][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::phi[starts-with(concat(@attrib,"-"),"content-")][following-sibling::omega[not(following-sibling::*)]/kappa[@true="false"][@xml:id="id7"][not(following-sibling::*)]//omega[@xml:id="id8"][not(preceding-sibling::*)]/beta[@string][@xml:id="id9"][following-sibling::kappa[@desciption][@xml:id="id10"][preceding-sibling::*[position() = 1]]/pi[@attrib="false"][@xml:lang="no"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::pi[@xml:id="id12"][not(following-sibling::*)]//epsilon[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <sigma att="123456789" xml:id="id1"> <omega/> @@ -12826,6 +15021,11 @@ </test> <test> <xpath>//eta[@attrib="another attribute value"][@xml:lang="en-GB"]//upsilon[@xml:id="id1"][not(preceding-sibling::*)]/tau[starts-with(concat(@token,"-"),"false-")][@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]//delta[@string][not(preceding-sibling::*)][following-sibling::phi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[starts-with(@abort,"conten")][not(preceding-sibling::nu)][following-sibling::epsilon[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::beta[starts-with(@delete,"solid 1px gre")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id5"]/mu[not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-GB"][not(child::node())][following-sibling::epsilon[@xml:lang="en"][@xml:id="id6"][following-sibling::alpha[not(child::node())][following-sibling::rho[@number="true"][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/delta[@xml:lang="no"]//nu[@true="solid 1px green"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::alpha[@desciption][@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 2]]]]]]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <eta attrib="another attribute value" xml:lang="en-GB"> <upsilon xml:id="id1"> @@ -12861,6 +15061,11 @@ </test> <test> <xpath>//gamma[starts-with(@src,"_bla")][@xml:lang="en-GB"]/nu[@xml:lang="en-US"][@xml:id="id1"]//theta//chi[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@number][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@token="_blank"][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[starts-with(@content,"tru")]//omicron[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::nu[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]]//upsilon[not(preceding-sibling::*)][following-sibling::gamma[not(following-sibling::*)]//delta[starts-with(@number,"1")]//psi[@xml:id="id9"][not(following-sibling::*)]//omicron[contains(concat(@class,"$"),"false$")][@xml:id="id10"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:id="id11"][preceding-sibling::*[position() = 1]]//psi[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <gamma src="_blank" xml:lang="en-GB"> <nu xml:lang="en-US" xml:id="id1"> @@ -12902,6 +15107,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]//tau[@desciption="attribute"][@xml:lang="en"][not(child::node())][following-sibling::rho[@and="true"][@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:id="id3"][not(preceding-sibling::*)]//epsilon[contains(@content,"ttr")][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::gamma)][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/gamma[@insert][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:lang="no-nb"][@xml:id="id6"][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <tau desciption="attribute" xml:lang="en"/> @@ -12922,6 +15132,11 @@ </test> <test> <xpath>//sigma[contains(concat(@class,"$"),"9$")]/nu[@string][@xml:lang="en"][@xml:id="id1"][not(child::node())][following-sibling::iota[starts-with(concat(@abort,"-"),"attribute-")][@xml:lang="en"][@xml:id="id2"][following-sibling::mu[starts-with(concat(@number,"-"),"123456789-")][preceding-sibling::*[position() = 2]][not(preceding-sibling::mu)]//nu[@xml:lang="en-US"][@xml:id="id3"]/upsilon[@or="123456789"][@xml:lang="no"]//phi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::iota[starts-with(concat(@false,"-"),"100%-")][@xml:id="id4"]/chi[@number][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 1]][following-sibling::tau[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[preceding-sibling::*[position() = 3]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <sigma class="123456789"> <nu string="_blank" xml:lang="en" xml:id="id1"/> @@ -12946,6 +15161,11 @@ </test> <test> <xpath>//zeta[starts-with(@desciption,"_blank")]/theta[starts-with(@title,"_bl")][following-sibling::lambda[starts-with(@object,"1234")][not(following-sibling::*)]/phi[@xml:id="id1"]//omicron[not(preceding-sibling::*)][following-sibling::zeta[starts-with(@insert,"_blank")][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <zeta desciption="_blank"> <theta title="_blank"/> @@ -12962,6 +15182,11 @@ </test> <test> <xpath>//beta[@xml:id="id1"]//zeta[contains(@object,"de")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[not(preceding-sibling::*)]//lambda[@xml:lang="en-US"][not(following-sibling::*)]/psi[contains(concat(@number,"$"),"e$")][not(preceding-sibling::*)][not(following-sibling::*)]//xi[contains(concat(@name,"$"),"her attribute value$")][@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::omega[@xml:lang="no-nb"]//tau[@xml:id="id3"]/gamma[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <beta xml:id="id1"> <zeta object="this.nodeValue" xml:lang="en-US" xml:id="id2"> @@ -12985,6 +15210,11 @@ </test> <test> <xpath>//delta[@attr="solid 1px green"][@xml:lang="no"][@xml:id="id1"]//beta[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//eta[@src="attribute value"][@xml:id="id2"][not(following-sibling::*)]/phi[@token="true"][@xml:lang="en"][not(child::node())][following-sibling::phi[following-sibling::lambda[@xml:lang="en"][preceding-sibling::*[position() = 2]]/pi[contains(concat(@or,"$"),"lse$")][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <delta attr="solid 1px green" xml:lang="no" xml:id="id1"> <beta xml:lang="en-US"/> @@ -13005,6 +15235,11 @@ </test> <test> <xpath>//iota[@xml:lang="en-US"][@xml:id="id1"]/iota[@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@xml:id="id3"]/*[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[following-sibling::*[position()=1]][following-sibling::xi[@number][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/mu[@src][@xml:lang="nb"][not(child::node())][following-sibling::delta[contains(concat(@abort,"$")," green$")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::nu[not(following-sibling::*)]/xi[starts-with(@name,"th")][@xml:lang="no"][not(following-sibling::*)][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>1</nth> + </result> <tree> <iota xml:lang="en-US" xml:id="id1"> <iota xml:id="id2"/> @@ -13026,6 +15261,11 @@ </test> <test> <xpath>//gamma[@xml:lang="en-US"][@xml:id="id1"]//iota[@data][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::beta[contains(concat(@class,"$"),"x green$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::epsilon[starts-with(concat(@desciption,"-"),"solid 1px green-")][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@object][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::upsilon[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 4]]/psi[@xml:id="id5"][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 1]]//iota[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[not(following-sibling::*)]//theta[@xml:id="id7"][not(preceding-sibling::*)]/omega[contains(concat(@insert,"$"),"deValue$")][@xml:id="id8"][not(preceding-sibling::*)]/theta[@object][@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@token][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id11"][not(following-sibling::*)]/pi[contains(concat(@name,"$"),"rue$")][@xml:id="id12"][not(preceding-sibling::pi or following-sibling::pi)][not(child::node())][following-sibling::delta[@xml:lang="en-US"][@xml:id="id13"]//omicron[position() = 1]][position() = 1]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <gamma xml:lang="en-US" xml:id="id1"> <iota data="_blank" xml:id="id2"/> @@ -13060,6 +15300,11 @@ </test> <test> <xpath>//omicron[@xml:lang="en-US"]//sigma[contains(concat(@object,"$"),"reen$")][not(preceding-sibling::*)]//nu[contains(concat(@delete,"$"),"te value$")][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="no"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::chi[@xml:lang="en-US"][preceding-sibling::*[position() = 2]]/mu[starts-with(concat(@name,"-"),"100%-")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[starts-with(concat(@data,"-"),"123456789-")][not(following-sibling::*)]/sigma[@abort][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:id="id3"][not(following-sibling::*)]//psi[@delete="true"][@xml:lang="no-nb"]/epsilon[contains(concat(@attribute,"$"),"ent$")][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@attr="this.nodeValue"][@xml:lang="nb"]/epsilon[@object][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[starts-with(@attrib,"c")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::beta[@attrib="solid 1px green"][@xml:lang="nb"][not(child::node())][following-sibling::pi[@xml:lang="no-nb"]//delta[contains(concat(@abort,"$"),"00%$")][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@xml:id="id6"][not(child::node())][following-sibling::eta[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@desciption]/delta[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@delete="another attribute value"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="en-US"> <sigma object="solid 1px green"> @@ -13102,6 +15347,11 @@ </test> <test> <xpath>//pi[@and][@xml:lang="nb"]//mu[@content][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/*[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/zeta[starts-with(@content,"_b")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::eta[starts-with(concat(@name,"-"),"content-")][preceding-sibling::*[position() = 1]][following-sibling::*[@abort="true"][not(child::node())][following-sibling::eta[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 3]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <pi and="attribute" xml:lang="nb"> <mu content="100%" xml:lang="en-GB" xml:id="id1"/> @@ -13120,6 +15370,11 @@ </test> <test> <xpath>//omega[starts-with(concat(@false,"-"),"solid 1px green-")][@xml:id="id1"]//*[@class][@xml:lang="en-GB"][@xml:id="id2"][following-sibling::alpha[@xml:lang="en-US"][following-sibling::upsilon[@insert="attribute value"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/omicron[starts-with(@content,"this-is-att-v")][@xml:lang="no-nb"]/*[starts-with(@title,"solid 1px")][@xml:lang="en"][not(following-sibling::*)]//rho[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]/nu[contains(concat(@data,"$"),"bute$")][following-sibling::omega[not(child::node())][following-sibling::upsilon[not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/chi[contains(concat(@token,"$"),"ue$")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)]/theta[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::omicron[@string][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[contains(concat(@src,"$"),"ute value$")][@xml:id="id8"][not(child::node())][following-sibling::omega[starts-with(concat(@delete,"-"),"this.nodeValue-")][preceding-sibling::*[position() = 1]][following-sibling::psi[starts-with(concat(@false,"-"),"attribute value-")][@xml:lang="en-GB"][following-sibling::zeta[@data][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]]//phi[starts-with(@token,"a")][@xml:lang="nb"][@xml:id="id9"][following-sibling::epsilon[starts-with(concat(@data,"-"),"false-")][@xml:lang="no"][@xml:id="id10"]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <omega false="solid 1px green" xml:id="id1"> <any class="123456789" xml:lang="en-GB" xml:id="id2"/> @@ -13157,6 +15412,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en"]/mu[@false][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[@delete][@xml:lang="en-US"][@xml:id="id1"][not(child::node())][following-sibling::beta[@xml:id="id2"][preceding-sibling::*[position() = 1]]/sigma[@xml:id="id3"][not(following-sibling::*)]//psi[@content][@xml:id="id4"][following-sibling::epsilon[@attribute][@xml:id="id5"][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en"> <mu false="attribute value" xml:lang="en"> @@ -13175,6 +15435,11 @@ </test> <test> <xpath>//*[@insert][@xml:id="id1"]//omicron[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta//beta[@xml:id="id2"][not(preceding-sibling::*)]/rho[@xml:lang="en-US"][following-sibling::*[position()=1]][following-sibling::upsilon[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[contains(concat(@attribute,"$"),"px green$")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@and][@xml:lang="en"]//eta[not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::psi[@content][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::psi[contains(concat(@attr,"$"),"is-is-att-value$")][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <any insert="another attribute value" xml:id="id1"> <omicron xml:lang="en"> @@ -13200,6 +15465,11 @@ </test> <test> <xpath>//omega[@or][@xml:lang="no-nb"][@xml:id="id1"]/phi[starts-with(@or,"a")][@xml:lang="en-US"][not(child::node())][following-sibling::eta[@xml:lang="en-GB"][not(following-sibling::*)]/psi[contains(@name,"s-is-att-value")][@xml:lang="en"][not(child::node())][following-sibling::theta[@xml:id="id2"]/epsilon[@or][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]//tau[contains(concat(@and,"$"),"ue$")][not(child::node())][following-sibling::*[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[following-sibling::*[position()=5]][following-sibling::epsilon[@abort="123456789"][@xml:id="id4"][following-sibling::*[position()=4]][following-sibling::epsilon[@desciption="another attribute value"][@xml:lang="en-US"][not(child::node())][following-sibling::mu[@name][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::nu[@name][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][following-sibling::tau[contains(@name,"another attribute value")][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 5]]/alpha[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@class][not(child::node())][following-sibling::phi[@delete][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::nu[following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@desciption][@xml:id="id8"][preceding-sibling::*[position() = 4]]//delta[@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::delta)]/chi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::psi[starts-with(@data,"tr")][@xml:lang="no"][@xml:id="id10"]//xi[@number][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <omega or="attribute value" xml:lang="no-nb" xml:id="id1"> <phi or="attribute value" xml:lang="en-US"/> @@ -13240,6 +15510,11 @@ </test> <test> <xpath>//omega[contains(@token,"his-is-")][@xml:id="id1"]/omicron[@xml:lang="en-GB"][not(preceding-sibling::*)]//pi[starts-with(@object,"tr")][not(child::node())][following-sibling::eta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[@xml:lang="en"][@xml:id="id2"][not(child::node())][following-sibling::chi[@xml:lang="no"][not(following-sibling::*)]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <omega token="this-is-att-value" xml:id="id1"> <omicron xml:lang="en-GB"> @@ -13255,6 +15530,11 @@ </test> <test> <xpath>//tau[starts-with(concat(@desciption,"-"),"false-")]/chi[@att][@xml:lang="no"][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[starts-with(concat(@token,"-"),"content-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/sigma[contains(concat(@number,"$")," attribute value$")][@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::delta[@false][@xml:lang="nb"][@xml:id="id3"][not(child::node())][following-sibling::eta[@attr][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::eta[@class="123456789"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/iota[starts-with(concat(@title,"-"),"true-")][@xml:lang="nb"][not(preceding-sibling::*)]//psi[starts-with(concat(@number,"-"),"100%-")][@xml:lang="no"][@xml:id="id5"]//omicron[@attribute="true"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@true][@xml:id="id7"][not(preceding-sibling::*)][not(preceding-sibling::beta or following-sibling::beta)]//pi[starts-with(concat(@number,"-"),"solid 1px green-")][@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::sigma[contains(@or,"t")][@xml:lang="en-GB"][not(following-sibling::*)]/chi[contains(concat(@abort,"$"),"%$")][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="no"][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/omicron[@or][not(preceding-sibling::*)]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <tau desciption="false"> <chi att="false" xml:lang="no" xml:id="id1"/> @@ -13288,6 +15568,11 @@ </test> <test> <xpath>//delta[@xml:id="id1"]//pi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[@attrib][preceding-sibling::*[position() = 1]]//nu[@xml:id="id2"][not(following-sibling::*)]//chi[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[contains(concat(@true,"$"),"value$")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::*[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[starts-with(@attrib,"_bla")][@xml:lang="nb"][@xml:id="id5"]//mu[@token][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::kappa[@name="attribute"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[@data][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omicron[@att="solid 1px green"][@xml:id="id8"][not(following-sibling::*)]/delta[starts-with(@att,"attribute-")][@xml:id="id9"][not(following-sibling::*)]/sigma[@delete][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id10"][following-sibling::delta[@number][@xml:lang="no"]/tau[@false][@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[starts-with(@string,"12345")][@xml:lang="en-US"][@xml:id="id12"][not(following-sibling::*)]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <delta xml:id="id1"> <pi xml:lang="no-nb"/> @@ -13323,6 +15608,11 @@ </test> <test> <xpath>//mu[@and]//*[starts-with(concat(@content,"-"),"attribute value-")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::epsilon[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::zeta[starts-with(@content,"another a")][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/mu[@name][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::sigma[not(child::node())][following-sibling::gamma[@xml:lang="no"]/upsilon[@xml:id="id3"][not(preceding-sibling::*)]//omicron[@att][@xml:lang="en"][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::gamma[@xml:lang="en"][not(following-sibling::*)]//gamma[@att="solid 1px green"]//epsilon[contains(concat(@attrib,"$"),"ue$")][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][following-sibling::chi[@abort][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omega[@xml:id="id7"][preceding-sibling::*[position() = 3]]//nu[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <mu and="false"> <any content="attribute value" xml:lang="en-US" xml:id="id1"/> @@ -13355,6 +15645,11 @@ </test> <test> <xpath>//mu[@xml:lang="en"]/chi[contains(concat(@and,"$"),"solid 1px green$")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)]//mu[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]/*[@xml:lang="nb"][not(child::node())][following-sibling::omega[@token="content"][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//beta[@att="attribute value"][@xml:lang="en-US"][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"][following-sibling::kappa[contains(concat(@object,"$"),"content$")][@xml:lang="en-GB"][not(following-sibling::*)]/gamma][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <mu xml:lang="en"> <chi and="solid 1px green" xml:lang="en-US" xml:id="id1"> @@ -13376,6 +15671,11 @@ </test> <test> <xpath>//alpha[@xml:lang="nb"]//rho[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::theta[starts-with(@data,"f")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[not(following-sibling::pi)][not(child::node())][following-sibling::delta[@xml:lang="en"]//zeta[not(child::node())][following-sibling::epsilon[@xml:id="id2"][not(child::node())][following-sibling::lambda[contains(@or,"gre")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/kappa[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(following-sibling::kappa)][not(child::node())][following-sibling::sigma[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::iota[following-sibling::*[position()=1]][not(preceding-sibling::iota)][not(child::node())][following-sibling::omicron[starts-with(@class,"a")][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:lang="no-nb"][@xml:id="id8"][following-sibling::omega[@src][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[starts-with(@name,"a")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id10"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="nb"> <rho xml:lang="en-US" xml:id="id1"/> @@ -13410,6 +15710,11 @@ </test> <test> <xpath>//eta[contains(concat(@data,"$"),"ntent$")][@xml:lang="en-GB"][@xml:id="id1"]/xi[starts-with(concat(@false,"-"),"false-")][not(preceding-sibling::*)]/*[@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::epsilon[@false][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/*[@xml:lang="en-US"][not(child::node())][following-sibling::beta[@true="attribute"][@xml:lang="no"][not(following-sibling::*)]/mu[@abort="another attribute value"][not(child::node())][following-sibling::upsilon[@attrib][following-sibling::nu[contains(concat(@att,"$"),"ue$")]//alpha[@xml:id="id4"][not(following-sibling::*)]/omicron[@object][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::sigma[@number="this.nodeValue"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[starts-with(concat(@content,"-"),"this-")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::beta[@xml:lang="no-nb"]//*[not(preceding-sibling::*)][not(following-sibling::*)]/chi[not(preceding-sibling::*)][following-sibling::theta[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <eta data="content" xml:lang="en-GB" xml:id="id1"> <xi false="false"> @@ -13444,6 +15749,11 @@ </test> <test> <xpath>//iota[starts-with(@false,"attribute ")]//lambda[@or][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[@attr][@xml:lang="en"][not(following-sibling::*)]/xi[@number][@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::xi)][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 2]][following-sibling::sigma[@xml:lang="en-GB"][not(child::node())][following-sibling::iota[@delete="attribute"]//beta[starts-with(concat(@class,"-"),"content-")][@xml:lang="en-US"][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[@insert][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::*[starts-with(concat(@title,"-"),"attribute-")]/psi[not(preceding-sibling::*)][not(following-sibling::*)]//tau[@xml:id="id4"][following-sibling::iota[starts-with(@attribute,"th")][@xml:lang="en-US"][following-sibling::tau[contains(@attr,"bute-value")][@xml:lang="en"][not(following-sibling::*)]//mu[@insert][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::eta[@string][@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::eta[@xml:lang="nb"][@xml:id="id6"]/rho[not(child::node())][following-sibling::*[@or][@xml:lang="en"]/xi[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <iota false="attribute value"> <lambda or="this-is-att-value"/> @@ -13480,6 +15790,11 @@ </test> <test> <xpath>//mu/omega[@xml:id="id1"][not(preceding-sibling::*)]//iota[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[starts-with(@true,"100%")][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[starts-with(@title,"tru")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//lambda[@delete][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::upsilon[not(following-sibling::*)]//sigma[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[starts-with(concat(@att,"-"),"true-")][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[starts-with(@and,"conten")][not(following-sibling::*)]//xi[@class][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@or="_blank"][@xml:lang="en-US"][@xml:id="id8"][not(following-sibling::*)]/nu[starts-with(concat(@title,"-"),"attribute value-")][@xml:lang="en-GB"][@xml:id="id9"]//psi[@xml:id="id10"][not(child::node())][following-sibling::delta[@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 1]]//iota[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <mu> <omega xml:id="id1"> @@ -13515,6 +15830,11 @@ </test> <test> <xpath>//sigma[starts-with(@token,"this.no")]//*//*[@xml:lang="no-nb"][@xml:id="id1"][not(child::node())][following-sibling::tau[@attrib][@xml:id="id2"][preceding-sibling::*[position() = 1]]//*[@and][following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[starts-with(@class,"this-is-at")][@xml:lang="en-US"][following-sibling::omicron[contains(concat(@true,"$"),"attribute$")][@xml:lang="en-US"][@xml:id="id4"]/alpha[@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::beta[@xml:id="id6"][following-sibling::rho[not(child::node())][following-sibling::upsilon[@attr="false"][@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=4]][following-sibling::rho[@xml:lang="en-US"][preceding-sibling::*[position() = 4]][following-sibling::zeta[not(child::node())][following-sibling::nu[starts-with(concat(@desciption,"-"),"false-")][@xml:lang="en"][preceding-sibling::*[position() = 6]][following-sibling::sigma[@xml:lang="en-GB"][@xml:id="id8"]/zeta[starts-with(@string,"attribute valu")][@xml:lang="nb"][not(child::node())][following-sibling::epsilon[@token][@xml:lang="en-US"][@xml:id="id9"][not(following-sibling::*)]//mu[starts-with(concat(@insert,"-"),"123456789-")][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>1</nth> + </result> <tree> <sigma token="this.nodeValue"> <any> @@ -13547,6 +15867,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]/xi[starts-with(concat(@content,"-"),"123456789-")][following-sibling::rho[@insert][@xml:lang="no"][not(following-sibling::*)]//*[@content][@xml:lang="no-nb"][@xml:id="id2"]/iota[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::pi[@xml:id="id3"][not(child::node())][following-sibling::eta[@xml:lang="en"][not(following-sibling::*)][not(preceding-sibling::eta)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <alpha xml:id="id1"> <xi content="123456789"/> @@ -13564,6 +15889,11 @@ </test> <test> <xpath>//phi[@xml:id="id1"]//psi[contains(concat(@true,"$"),"en$")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[@src="content"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//tau[contains(@name,"23")][not(following-sibling::*)]/chi[@xml:lang="nb"][@xml:id="id4"][following-sibling::eta[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[starts-with(@object,"this-is-")][@xml:lang="en"][@xml:id="id5"][not(child::node())][following-sibling::delta[contains(concat(@number,"$"),"reen$")][@xml:lang="no"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::sigma[starts-with(@insert,"1")][@xml:id="id6"][not(following-sibling::*)]//chi[@att][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@number][@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]//theta[@string][@xml:lang="en"][not(preceding-sibling::*)]//kappa[not(preceding-sibling::*)][not(following-sibling::*)]//xi[contains(concat(@data,"$"),"ue$")][@xml:lang="no"][not(following-sibling::*)]//pi[@attr][not(following-sibling::*)]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <phi xml:id="id1"> <psi true="solid 1px green" xml:id="id2"/> @@ -13595,6 +15925,11 @@ </test> <test> <xpath>//epsilon[@or][@xml:lang="en"][@xml:id="id1"]/rho[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]/tau[@attrib][@xml:id="id3"]/xi[not(preceding-sibling::*)][not(child::node())][following-sibling::chi[contains(concat(@number,"$"),"true$")][@xml:lang="nb"][following-sibling::nu[contains(@name,"ue")][@xml:lang="en-US"]//lambda[@xml:lang="en"]//omicron[not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//upsilon[@xml:lang="en-GB"][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 2]][following-sibling::iota[@xml:id="id5"][not(following-sibling::*)]/omega[@xml:lang="nb"][not(preceding-sibling::*)]//alpha[@xml:id="id6"][not(following-sibling::*)]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <epsilon or="attribute value" xml:lang="en" xml:id="id1"> <rho xml:lang="en-US" xml:id="id2"> @@ -13625,6 +15960,11 @@ </test> <test> <xpath>//chi[@xml:lang="no"]/theta[@attribute][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(concat(@token,"$"),"t-value$")][not(following-sibling::*)]//gamma[starts-with(@delete,"solid 1px")][@xml:id="id1"]/phi[starts-with(@and,"f")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)]/*[following-sibling::*[position()=7]][following-sibling::lambda[@xml:lang="en"][@xml:id="id3"][following-sibling::delta[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::lambda[@content="_blank"][@xml:lang="en-GB"][following-sibling::*[position()=4]][following-sibling::epsilon[@false][@xml:lang="en"][preceding-sibling::*[position() = 4]][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@class][not(child::node())][following-sibling::alpha[starts-with(@or,"f")]/lambda[@xml:id="id5"]/xi//gamma[starts-with(@content,"tr")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)]/lambda[starts-with(concat(@delete,"-"),"_blank-")][@xml:lang="no"][@xml:id="id7"][not(child::node())][following-sibling::*[contains(concat(@true,"$"),"ute-value$")][@xml:id="id8"][following-sibling::*[position()=2]][following-sibling::zeta[@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi//mu[starts-with(concat(@and,"-"),"false-")][@xml:lang="no-nb"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[contains(@delete,"ibute value")][@xml:lang="no-nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@class][@xml:lang="en-US"][position() = 1]]][position() = 1]]]]]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="no"> <theta attribute="solid 1px green"/> @@ -13664,6 +16004,11 @@ </test> <test> <xpath>//zeta[@class]//sigma[not(preceding-sibling::*)]//alpha[@xml:lang="en-US"][@xml:id="id1"][not(child::node())][following-sibling::beta[contains(concat(@delete,"$"),"nt$")][@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//iota[starts-with(concat(@attribute,"-"),"true-")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[starts-with(concat(@attr,"-"),"solid 1px green-")][@xml:lang="nb"]//omicron[@delete][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::gamma[preceding-sibling::*[position() = 1]]//mu[@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <zeta class="attribute-value"> <sigma> @@ -13685,6 +16030,11 @@ </test> <test> <xpath>//omicron[starts-with(concat(@token,"-"),"solid 1px green-")][@xml:id="id1"]//chi[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[contains(@attr,"ibute valu")][not(following-sibling::*)]/nu[contains(@and," value")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::psi[starts-with(@delete,"fals")][@xml:lang="en-GB"]/omicron[contains(@and,"eValue")][@xml:id="id3"][not(following-sibling::*)]/chi[@xml:lang="no"]/sigma[@xml:lang="no"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::nu[not(child::node())][following-sibling::tau[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(following-sibling::tau)]//theta[@xml:lang="no"][@xml:id="id5"]/upsilon[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::nu[contains(concat(@string,"$"),"ibute$")][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::chi[contains(concat(@and,"$"),"_blank$")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::beta[starts-with(@string,"another attribute ")][not(following-sibling::*)]/beta[@xml:lang="no-nb"][@xml:id="id7"][not(child::node())][following-sibling::beta[@xml:id="id8"][preceding-sibling::*[position() = 1]]//eta[@xml:lang="no"][not(following-sibling::*)]/nu[not(following-sibling::*)]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <omicron token="solid 1px green" xml:id="id1"> <chi xml:lang="en-GB" xml:id="id2"> @@ -13722,6 +16072,11 @@ </test> <test> <xpath>//omega[@xml:lang="nb"]//chi[@xml:id="id1"]//delta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[contains(concat(@data,"$"),"ttribute value$")][preceding-sibling::*[position() = 1]]/chi[not(preceding-sibling::*)]//upsilon[@attrib][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[starts-with(concat(@true,"-"),"true-")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::*[not(child::node())][following-sibling::omicron[@src][not(child::node())][following-sibling::xi[@token="content"][not(following-sibling::*)]//omicron[@title][not(following-sibling::*)]/upsilon[@title][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::mu[@xml:lang="no-nb"][not(child::node())][following-sibling::sigma[starts-with(@insert,"attribut")][not(following-sibling::*)]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="nb"> <chi xml:id="id1"> @@ -13749,6 +16104,11 @@ </test> <test> <xpath>//omicron[contains(@false,"k")][@xml:lang="en-US"]/pi[starts-with(concat(@token,"-"),"this.nodeValue-")][@xml:lang="no-nb"][@xml:id="id1"][not(following-sibling::*)]//tau[starts-with(@name,"fals")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 2]]//lambda[@src="another attribute value"][@xml:id="id3"][not(child::node())][following-sibling::omega[not(following-sibling::*)]//zeta[@xml:lang="nb"][not(following-sibling::*)]/beta[@string="100%"][@xml:lang="no"]/omicron[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][not(following-sibling::*)]//epsilon[not(preceding-sibling::*)]/upsilon[@content][@xml:lang="en"]/gamma//sigma[contains(@attrib,"l")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omicron[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <omicron false="_blank" xml:lang="en-US"> <pi token="this.nodeValue" xml:lang="no-nb" xml:id="id1"> @@ -13782,6 +16142,11 @@ </test> <test> <xpath>//gamma[starts-with(concat(@class,"-"),"attribute value-")][@xml:lang="no-nb"][@xml:id="id1"]//psi[@xml:lang="en-GB"][@xml:id="id2"]/xi[@number]//lambda[@xml:id="id3"][not(following-sibling::*)]//chi[@attr][@xml:lang="no-nb"][not(following-sibling::*)]//tau[starts-with(@att,"another")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::phi[@data="solid 1px green"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::omicron[@title][@xml:lang="no-nb"][@xml:id="id6"]/beta[@desciption][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@xml:id="id7"][not(following-sibling::*)]/phi[starts-with(@name,"t")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::zeta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]]//alpha[@xml:id="id9"][not(preceding-sibling::*)]//zeta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@delete="_blank"][@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@content][@xml:lang="en"][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[@att="attribute-value"][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//upsilon[@xml:id="id12"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::rho[contains(concat(@string,"$"),"ank$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[starts-with(@string,"this-is-at")][not(following-sibling::*)]/zeta[@xml:lang="en"][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <gamma class="attribute value" xml:lang="no-nb" xml:id="id1"> <psi xml:lang="en-GB" xml:id="id2"> @@ -13826,6 +16191,11 @@ </test> <test> <xpath>//omicron[@xml:lang="en-US"]/xi[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id2"]/nu[following-sibling::iota[following-sibling::lambda[@insert="false"][@xml:id="id3"][not(child::node())][following-sibling::lambda[contains(concat(@number,"$"),"alue$")][@xml:lang="en"][not(child::node())][following-sibling::gamma[starts-with(@attr,"at")][@xml:id="id4"]//iota[@att][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma//rho[starts-with(@attr,"attribut")][@xml:lang="en"][@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@title][@xml:id="id6"][preceding-sibling::*[position() = 1]]//xi[contains(concat(@src,"$"),"s-att-value$")][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::sigma[contains(concat(@abort,"$"),"se$")][@xml:lang="en-US"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 2]]/delta[@xml:lang="no"][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id9"]/theta[starts-with(concat(@attrib,"-"),"this-")][@xml:lang="en-GB"][@xml:id="id10"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="nb"][@xml:id="id11"][not(following-sibling::*)]//phi[@attr][@xml:lang="en"][@xml:id="id12"][not(preceding-sibling::*)]//lambda[@xml:lang="en-GB"][not(child::node())][following-sibling::alpha[contains(concat(@src,"$"),"00%$")][@xml:lang="en"][@xml:id="id13"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@object][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="en-US"> <xi xml:lang="en-GB" xml:id="id1"/> @@ -13866,6 +16236,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]/theta[@string][@xml:id="id2"][not(following-sibling::*)]//*[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/eta[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::eta)]//*[@object][@xml:id="id5"][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <sigma xml:id="id1"> <theta string="this.nodeValue" xml:id="id2"> @@ -13883,6 +16258,11 @@ </test> <test> <xpath>//kappa[starts-with(@att,"12345")]//chi[contains(@attribute,"te")][@xml:id="id1"][not(child::node())][following-sibling::*[starts-with(@content,"tru")][@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[starts-with(@desciption,"att")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::mu[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@content]/zeta[starts-with(@false,"attribute-value")][@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]/beta[@att][@xml:lang="en-US"][@xml:id="id4"]/chi[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@class][not(preceding-sibling::*)][following-sibling::epsilon[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[contains(concat(@object,"$"),"00%$")][@xml:lang="en-GB"][@xml:id="id7"]//alpha[@xml:lang="no-nb"][@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::rho[starts-with(concat(@and,"-"),"true-")][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <kappa att="123456789"> <chi attribute="attribute" xml:id="id1"/> @@ -13913,6 +16293,11 @@ </test> <test> <xpath>//delta[@xml:lang="en"][@xml:id="id1"]/mu[starts-with(@attribute,"attri")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/gamma[@content="this.nodeValue"][@xml:id="id3"][not(following-sibling::*)]/omicron[@and][not(preceding-sibling::*)]//phi[@delete][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@att="_blank"][@xml:lang="no"][preceding-sibling::*[position() = 1]]/kappa[@false="another attribute value"][@xml:id="id5"][not(preceding-sibling::*)]//zeta[@delete="attribute-value"][@xml:id="id6"][not(child::node())][following-sibling::alpha[@xml:lang="nb"][not(child::node())][following-sibling::omega[starts-with(@number,"con")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/theta[@abort][@xml:lang="no-nb"][not(following-sibling::*)]/beta[following-sibling::upsilon[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::pi//phi[starts-with(@false,"conten")][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::rho[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omega[@attribute="false"][@xml:id="id8"][following-sibling::upsilon[starts-with(@attrib,"another attrib")][following-sibling::*[position()=1]][following-sibling::zeta[@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/theta[starts-with(@attrib,"conten")][@xml:id="id10"][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en" xml:id="id1"> <mu attribute="attribute value" xml:lang="en"/> @@ -13953,6 +16338,11 @@ </test> <test> <xpath>//mu[contains(@content,"his.no")][@xml:lang="nb"]/psi[contains(concat(@true,"$"),"id 1px green$")][@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(concat(@name,"$"),"odeValue$")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@object="100%"][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/omicron[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:lang="no-nb"][not(child::node())][following-sibling::gamma[starts-with(@att,"fa")][preceding-sibling::*[position() = 3]]//phi[contains(concat(@and,"$"),"other attribute value$")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[contains(@title,"2345")][@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]/beta[contains(@abort,"se")][not(preceding-sibling::*)]//epsilon[contains(concat(@attrib,"$"),"nother attribute value$")][@xml:id="id5"][not(child::node())][following-sibling::iota[@xml:lang="no"][@xml:id="id6"][following-sibling::theta[@xml:lang="en-GB"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::sigma[@object="_blank"][@xml:id="id8"][not(following-sibling::*)]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <mu content="this.nodeValue" xml:lang="nb"> <psi true="solid 1px green" xml:lang="en" xml:id="id1"/> @@ -13981,6 +16371,11 @@ </test> <test> <xpath>//theta[@xml:lang="no-nb"][@xml:id="id1"]/zeta[@delete="another attribute value"][not(preceding-sibling::*)]//mu[@xml:lang="nb"]/zeta[@xml:id="id2"][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//kappa[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[contains(@or,"his.nodeValue")][@xml:id="id5"]//eta[@xml:id="id6"][not(child::node())][following-sibling::chi[contains(@desciption,"attri")][preceding-sibling::*[position() = 1]]//delta[@xml:lang="no"][not(preceding-sibling::*)]/phi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[starts-with(@object,"conten")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@true="false"][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>1</nth> + </result> <tree> <theta xml:lang="no-nb" xml:id="id1"> <zeta delete="another attribute value"> @@ -14010,6 +16405,11 @@ </test> <test> <xpath>//delta[@xml:lang="en-GB"][@xml:id="id1"]//tau[contains(concat(@token,"$"),"t-value$")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::*[contains(@attrib,"attribute val")][@xml:lang="en-GB"][not(following-sibling::*)]/nu[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omicron[starts-with(@string,"f")][@xml:lang="nb"][@xml:id="id3"]/beta[@title="content"][not(following-sibling::*)]/kappa[@or][@xml:lang="en-GB"][not(following-sibling::*)]/omega[not(preceding-sibling::*)][following-sibling::kappa[@data][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[@xml:lang="en-US"][not(following-sibling::*)]/gamma[starts-with(@name,"attribute-valu")][@xml:lang="nb"][@xml:id="id5"]/nu[@src="solid 1px green"][@xml:id="id6"][not(preceding-sibling::*)]//phi[@xml:id="id7"][not(preceding-sibling::*)]//chi[@xml:lang="nb"][not(following-sibling::*)]/phi[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en-GB" xml:id="id1"> <tau token="this-is-att-value" xml:lang="en-US"/> @@ -14046,6 +16446,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]/mu[@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::upsilon[@and="attribute value"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[following-sibling::*[position()=1]][following-sibling::lambda[preceding-sibling::*[position() = 3]]/tau[@xml:lang="nb"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::lambda[@or="true"][@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//kappa[@xml:lang="en"][@xml:id="id6"][following-sibling::*[position()=3]][following-sibling::kappa[@xml:lang="no-nb"][@xml:id="id7"][not(child::node())][following-sibling::omicron[@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 3]][not(following-sibling::*)]/rho[@delete][not(preceding-sibling::*)]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <mu xml:lang="en-GB" xml:id="id2"/> @@ -14069,6 +16474,11 @@ </test> <test> <xpath>//pi[contains(concat(@true,"$"),"value$")][@xml:lang="no"][@xml:id="id1"]//iota[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[not(following-sibling::*)][not(parent::*/*[position()=2])]//rho[contains(concat(@token,"$"),"ontent$")][@xml:lang="no"][following-sibling::iota[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(following-sibling::iota)]//epsilon//beta[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[preceding-sibling::*[position() = 1]]/delta[@xml:id="id4"][not(following-sibling::*)]/psi[@content][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)]//mu[@xml:id="id6"]/delta[not(following-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <pi true="attribute value" xml:lang="no" xml:id="id1"> <iota xml:lang="no-nb" xml:id="id2"/> @@ -14098,6 +16508,11 @@ </test> <test> <xpath>//omega/*[@xml:id="id1"][following-sibling::*[position()=2]][following-sibling::tau[@xml:lang="en-US"][@xml:id="id2"][following-sibling::*[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/eta[@xml:id="id3"][following-sibling::rho[preceding-sibling::*[position() = 1]]/phi[starts-with(@abort,"this-is-att-va")][not(following-sibling::*)]/pi[@xml:id="id4"][following-sibling::kappa[starts-with(@token,"1234567")][@xml:lang="nb"][following-sibling::lambda[starts-with(@or,"_b")][@xml:lang="en"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::*[@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]//alpha[@data][@xml:lang="nb"][@xml:id="id7"][not(following-sibling::*)][not(preceding-sibling::alpha)]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <omega> <any xml:id="id1"/> @@ -14122,6 +16537,11 @@ </test> <test> <xpath>//beta[@xml:id="id1"]//delta[contains(@insert,"rue")][@xml:lang="en-GB"][not(child::node())][following-sibling::mu[following-sibling::upsilon/omicron[contains(concat(@content,"$"),"rue$")][@xml:lang="en-GB"][not(following-sibling::*)]//delta[starts-with(@abort,"1234")][@xml:lang="nb"]/mu[@xml:lang="en-GB"][@xml:id="id2"]//omicron[@xml:id="id3"][not(preceding-sibling::*)]/tau[@insert][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[contains(@attribute,"ue")][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::iota[@xml:id="id6"][not(child::node())][following-sibling::kappa[@xml:lang="en"][following-sibling::omicron[not(preceding-sibling::omicron or following-sibling::omicron)][following-sibling::pi[not(following-sibling::pi)][not(child::node())][following-sibling::epsilon[@desciption][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 5]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <beta xml:id="id1"> <delta insert="true" xml:lang="en-GB"/> @@ -14151,6 +16571,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@true,"-"),"123456789-")]/gamma[@insert="another attribute value"][@xml:id="id1"][following-sibling::*[@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::phi[starts-with(@data,"so")][@xml:lang="no"][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id4"]//mu[not(child::node())][following-sibling::upsilon[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:id="id6"][following-sibling::theta[starts-with(@and,"sol")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:id="id7"][not(child::node())][following-sibling::gamma[@xml:id="id8"][not(following-sibling::*)]//rho[starts-with(@data,"attribute")][@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][not(preceding-sibling::rho)][not(child::node())][following-sibling::eta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]//upsilon[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::*[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/chi[@title][following-sibling::gamma[@xml:lang="no"][following-sibling::rho[contains(@name,"his.nodeVal")][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[contains(concat(@or,"$"),"k$")][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::iota[@attrib="false"][@xml:id="id11"][not(following-sibling::*)]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <delta true="123456789"> <gamma insert="another attribute value" xml:id="id1"/> @@ -14186,6 +16611,11 @@ </test> <test> <xpath>//sigma[@xml:lang="nb"][@xml:id="id1"]//beta[contains(concat(@true,"$"),"value$")][@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]/lambda[starts-with(concat(@delete,"-"),"attribute-")][@xml:id="id3"][following-sibling::*[position()=2]][following-sibling::eta[@content][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::theta[not(following-sibling::*)]//kappa[not(child::node())][following-sibling::gamma[starts-with(@src,"_")][not(following-sibling::*)]//delta[contains(@or,"att-")][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[@number][@xml:lang="nb"][@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[not(following-sibling::*)]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="nb" xml:id="id1"> <beta true="this-is-att-value" xml:lang="en" xml:id="id2"> @@ -14207,6 +16637,11 @@ </test> <test> <xpath>//omega[starts-with(concat(@delete,"-"),"false-")]/iota[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[starts-with(concat(@delete,"-"),"false-")][@xml:id="id1"][not(preceding-sibling::epsilon)]//phi[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[contains(concat(@and,"$"),"tribute-value$")]//zeta[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@xml:lang="en-GB"][not(preceding-sibling::*)]/rho[@xml:lang="en-US"][following-sibling::gamma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[@att][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:lang="no"]/*[@attrib="this-is-att-value"][not(following-sibling::*)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <omega delete="false"> <iota xml:lang="nb"/> @@ -14236,6 +16671,11 @@ </test> <test> <xpath>//beta[@xml:lang="no"]//tau[starts-with(@class,"attri")][@xml:id="id1"]/pi[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[starts-with(@name,"anothe")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)]/upsilon[contains(concat(@number,"$"),"ute value$")][@xml:id="id3"][not(preceding-sibling::*)]//*[starts-with(concat(@or,"-"),"this-")][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]//upsilon[starts-with(concat(@attr,"-"),"this-")][@xml:id="id5"]//tau[@xml:id="id6"][not(preceding-sibling::*)]/delta[contains(@name,"ue")][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::gamma[starts-with(concat(@number,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::tau[@xml:lang="en-US"][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/nu[@class][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[contains(concat(@data,"$"),"rue$")][@xml:lang="nb"][@xml:id="id10"][following-sibling::upsilon[contains(@object,"%")][@xml:id="id11"][not(following-sibling::*)]/nu[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::lambda[@data][not(child::node())][following-sibling::tau[@data="another attribute value"][@xml:id="id12"][not(following-sibling::*)]//nu[starts-with(concat(@content,"-"),"this.nodeValue-")][@xml:id="id13"]//beta[starts-with(concat(@class,"-"),"123456789-")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="no-nb"][@xml:id="id14"]//eta[contains(concat(@delete,"$"),"n$")][@xml:id="id15"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[starts-with(concat(@or,"-"),"_blank-")][not(preceding-sibling::*)]/theta[@xml:id="id16"][not(preceding-sibling::*)][not(following-sibling::*)]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no"> <tau class="attribute-value" xml:id="id1"> @@ -14282,6 +16722,11 @@ </test> <test> <xpath>//rho[@true="attribute"][@xml:lang="en-GB"]//phi[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/phi[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@true][@xml:id="id3"][not(following-sibling::*)]/gamma[starts-with(concat(@delete,"-"),"123456789-")][not(preceding-sibling::*)][not(following-sibling::*)]/*[contains(@attribute,"lan")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:id="id5"]/alpha//tau[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[contains(@data,"te value")][@xml:lang="no-nb"][@xml:id="id7"][following-sibling::*[position()=3]][following-sibling::upsilon[starts-with(@abort,"attri")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"][@xml:id="id8"][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@xml:id="id9"]//tau[starts-with(concat(@true,"-"),"this.nodeValue-")][@xml:lang="en"][@xml:id="id10"][not(preceding-sibling::*)]/lambda[@class][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="no"][@xml:id="id13"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <rho true="attribute" xml:lang="en-GB"> <phi xml:lang="nb" xml:id="id1"/> @@ -14318,6 +16763,11 @@ </test> <test> <xpath>//lambda[contains(@att,"ute val")][@xml:id="id1"]/kappa[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@class][@xml:lang="nb"][not(child::node())][following-sibling::omega//iota[contains(concat(@insert,"$"),"is-att-value$")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[not(preceding-sibling::*)][not(preceding-sibling::omega)][following-sibling::epsilon[starts-with(@content,"attribute")]/delta[@xml:id="id3"][not(preceding-sibling::*)]//zeta[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::nu[starts-with(@attribute,"solid 1px gr")]/omega[@xml:id="id5"][not(preceding-sibling::*)]/upsilon[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[contains(@and,"on")][@xml:id="id7"]//phi[starts-with(@or,"10")][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[@attrib][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="no"][following-sibling::rho[@xml:lang="no"][@xml:id="id9"]//tau[@xml:id="id10"][not(following-sibling::*)]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <lambda att="another attribute value" xml:id="id1"> <kappa xml:id="id2"/> @@ -14353,6 +16803,11 @@ </test> <test> <xpath>//psi[starts-with(@and,"attr")][@xml:lang="no-nb"][@xml:id="id1"]/lambda[not(following-sibling::*)]//theta[@xml:lang="no-nb"][not(preceding-sibling::*)]//iota[@xml:id="id2"][not(child::node())][following-sibling::nu[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@content][@xml:lang="en"][@xml:id="id3"]/phi[@xml:lang="en"][@xml:id="id4"][not(child::node())][following-sibling::pi[@attribute][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//gamma[@xml:lang="en-US"][@xml:id="id6"][following-sibling::mu/*[contains(@title,"this.nodeVal")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[contains(@false,"89")][not(child::node())][following-sibling::delta[contains(concat(@title,"$"),"value$")][@xml:lang="en-US"][not(following-sibling::*)]//lambda[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::chi[@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::rho[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/alpha[starts-with(@class,"this-is-att-va")][@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <psi and="attribute value" xml:lang="no-nb" xml:id="id1"> <lambda> @@ -14386,6 +16841,11 @@ </test> <test> <xpath>//gamma/upsilon[@att][@xml:lang="en"][following-sibling::theta[@xml:lang="nb"][@xml:id="id1"][not(following-sibling::*)]/xi[starts-with(@src,"attribute va")][not(preceding-sibling::*)][following-sibling::*[position()=7]][following-sibling::phi[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=6]][following-sibling::lambda[@xml:lang="en"][following-sibling::theta[@or][@xml:id="id2"][following-sibling::upsilon[@xml:id="id3"][preceding-sibling::*[position() = 4]][following-sibling::tau[@xml:lang="en"][following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[@string="false"][preceding-sibling::*[position() = 6]][following-sibling::alpha[@number][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <gamma> <upsilon att="123456789" xml:lang="en"/> @@ -14406,6 +16866,11 @@ </test> <test> <xpath>//nu[@xml:lang="nb"][@xml:id="id1"]/sigma[@title][not(following-sibling::*)]/theta[contains(@data,"23")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::tau[@true="attribute value"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@xml:lang="en-US"][@xml:id="id4"][following-sibling::chi[preceding-sibling::*[position() = 1]]/rho[@xml:lang="en"]//rho[@desciption]/theta[@or="123456789"][@xml:lang="en-US"][not(following-sibling::*)]/theta[@title][@xml:lang="en-GB"][not(preceding-sibling::*)]//phi[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[not(child::node())][following-sibling::rho[@xml:lang="nb"][preceding-sibling::*[position() = 2]]//xi[@xml:id="id6"][not(child::node())][following-sibling::sigma[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="nb" xml:id="id1"> <sigma title="100%"> @@ -14437,6 +16902,11 @@ </test> <test> <xpath>//psi[starts-with(concat(@token,"-"),"solid 1px green-")]/nu[contains(concat(@true,"$"),"ue$")]/lambda[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::eta[contains(@true,"bla")]/*[contains(concat(@data,"$"),"789$")][@xml:id="id1"][not(preceding-sibling::*)]/delta[following-sibling::sigma[@xml:lang="nb"][following-sibling::*[position()=3]][following-sibling::*[@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::nu[@xml:id="id2"][not(child::node())][following-sibling::lambda[contains(concat(@src,"$"),"tent$")][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//gamma[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::sigma[starts-with(@data,"t")][@xml:lang="en-US"]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <psi token="solid 1px green"> <nu true="attribute value"> @@ -14461,6 +16931,11 @@ </test> <test> <xpath>//rho[@number][@xml:id="id1"]//nu[@class][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::omicron[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]//beta[@number][not(child::node())][following-sibling::rho[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[@class][@xml:lang="no-nb"][@xml:id="id5"][following-sibling::omicron[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 3]]/chi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::beta[@true="_blank"][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]]/iota[contains(@attribute,"56789")][@xml:lang="en-GB"][@xml:id="id8"][not(child::node())][following-sibling::delta[starts-with(@title,"at")][@xml:lang="no"][@xml:id="id9"][not(child::node())][following-sibling::alpha[@xml:id="id10"]//delta[@xml:id="id11"][not(following-sibling::*)]/gamma[contains(concat(@delete,"$"),"alse$")]/gamma[@true][@xml:lang="no-nb"][@xml:id="id12"][not(preceding-sibling::*)][following-sibling::beta[@and][@xml:id="id13"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//theta[starts-with(@insert,"tr")][not(following-sibling::*)]//iota[@xml:lang="no"]//eta[@xml:lang="en"][not(following-sibling::*)]/rho[@xml:lang="en"][@xml:id="id14"][not(following-sibling::*)]/nu[starts-with(@name,"another attribute valu")][@xml:lang="nb"][@xml:id="id15"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id16"][not(following-sibling::*)]//kappa[@xml:lang="no-nb"][@xml:id="id17"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <rho number="solid 1px green" xml:id="id1"> <nu class="false" xml:lang="no" xml:id="id2"/> @@ -14506,6 +16981,11 @@ </test> <test> <xpath>//theta[starts-with(concat(@delete,"-"),"content-")]/pi[@attribute][@xml:lang="en"][not(child::node())][following-sibling::delta[following-sibling::*[contains(@data,"e")][not(child::node())][following-sibling::alpha[@xml:id="id1"]//gamma[@xml:lang="no-nb"][following-sibling::rho[@title][preceding-sibling::*[position() = 1]]/delta[@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]//rho[@insert][@xml:id="id3"]/theta[@desciption][@xml:id="id4"][not(following-sibling::*)]//delta[@att="_blank"][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)]/psi[@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@false][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="en-US"][preceding-sibling::*[position() = 2]]//xi[@xml:lang="en-GB"][following-sibling::omicron[@token][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]]//chi[not(preceding-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <theta delete="content"> <pi attribute="content" xml:lang="en"/> @@ -14539,6 +17019,11 @@ </test> <test> <xpath>//alpha//gamma[contains(@string,"nk")][not(preceding-sibling::*)]/lambda[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau//iota[following-sibling::tau[not(child::node())][following-sibling::psi[@xml:lang="en-GB"][not(following-sibling::*)]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <alpha> <gamma string="_blank"> @@ -14556,6 +17041,11 @@ </test> <test> <xpath>//rho[@xml:lang="no-nb"]/lambda[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::gamma[@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::tau[not(following-sibling::*)]/omicron[@object][following-sibling::theta[@and="_blank"][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[starts-with(@token,"anot")][@xml:lang="en"][@xml:id="id3"][following-sibling::eta[@xml:id="id4"][following-sibling::*[position()=1]][not(preceding-sibling::eta)][not(child::node())][following-sibling::gamma[not(following-sibling::*)]//*[starts-with(concat(@name,"-"),"_blank-")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:id="id6"]/rho[contains(@content,"s.n")][@xml:lang="en"][@xml:id="id7"]/pi[@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::pi)][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="no-nb"> <lambda/> @@ -14583,6 +17073,11 @@ </test> <test> <xpath>//xi[contains(concat(@src,"$"),"another attribute value$")][@xml:id="id1"]//eta[contains(concat(@and,"$"),"e$")]//nu[@true][@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[@att][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[starts-with(concat(@abort,"-"),"attribute value-")][@xml:id="id3"][not(following-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <xi src="another attribute value" xml:id="id1"> <eta and="true"> @@ -14600,6 +17095,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]//*[starts-with(concat(@insert,"-"),"solid 1px green-")][@xml:id="id2"][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[starts-with(@token,"12345")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@class]/psi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::upsilon[starts-with(@src,"a")][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/pi[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::sigma[@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::gamma[starts-with(concat(@att,"-"),"content-")][@xml:lang="en-US"][@xml:id="id7"]/omega[starts-with(@attribute,"attribute-val")][@xml:lang="no"][@xml:id="id8"][not(following-sibling::*)]//gamma[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@and][@xml:lang="nb"][not(following-sibling::*)]/lambda[contains(@desciption,"la")][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu//rho[@xml:lang="en-US"][@xml:id="id10"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@insert][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[starts-with(@number,"_blan")][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[starts-with(@insert,"attri")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/iota[starts-with(concat(@class,"-"),"false-")][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <rho xml:id="id1"> <any insert="solid 1px green" xml:id="id2"/> @@ -14641,6 +17141,11 @@ </test> <test> <xpath>//*[@xml:lang="en-US"][@xml:id="id1"]//iota[@xml:id="id2"][not(following-sibling::*)]/theta[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:id="id4"][not(child::node())][following-sibling::upsilon[@object][@xml:lang="nb"][@xml:id="id5"][following-sibling::psi[contains(concat(@src,"$"),"tribute$")][@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 4]][not(following-sibling::*)]/psi[@content][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@att][@xml:id="id7"][not(following-sibling::*)]/phi[@xml:lang="en"][following-sibling::*[position()=1]][not(preceding-sibling::phi or following-sibling::phi)][not(child::node())][following-sibling::omega[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/zeta[@xml:id="id8"][following-sibling::nu[@xml:lang="en"][@xml:id="id9"]/omicron[contains(concat(@string,"$"),"alue$")]/lambda[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="no"][@xml:id="id10"][not(following-sibling::*)]/eta[starts-with(@number,"cont")][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[@xml:id="id12"][not(preceding-sibling::*)][following-sibling::beta[starts-with(concat(@attribute,"-"),"123456789-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@attribute="this-is-att-value"][@xml:lang="en-US"][@xml:id="id13"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-US" xml:id="id1"> <iota xml:id="id2"> @@ -14678,6 +17183,11 @@ </test> <test> <xpath>//lambda[@desciption="false"][@xml:lang="en"]/pi[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@or][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[starts-with(concat(@name,"-"),"123456789-")][@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//sigma[@xml:id="id4"]/omega[@or="solid 1px green"][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]//eta[following-sibling::iota[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[@and][@xml:id="id6"][not(child::node())][following-sibling::omicron[starts-with(concat(@attrib,"-"),"123456789-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[@xml:id="id7"][not(preceding-sibling::*)]/upsilon[@xml:lang="en-GB"][not(child::node())][following-sibling::phi[@number][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//delta[not(preceding-sibling::*)]/mu[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@and][@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@abort][@xml:id="id9"]/mu[starts-with(@or,"at")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[starts-with(@data,"attr")][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::gamma[@xml:lang="en"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::rho[@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::eta[@xml:id="id12"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/theta[starts-with(@attribute,"12")][@xml:lang="no"][not(following-sibling::*)]/eta[@string][@xml:lang="no-nb"][@xml:id="id13"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <lambda desciption="false" xml:lang="en"> <pi xml:lang="en-US" xml:id="id1"> @@ -14723,6 +17233,11 @@ </test> <test> <xpath>//sigma[@token][@xml:lang="no-nb"][@xml:id="id1"]/phi[starts-with(@desciption,"th")][@xml:id="id2"][not(following-sibling::*)]/zeta[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::epsilon[contains(@and,"id 1px green")][following-sibling::chi[@xml:id="id4"]/omicron[@class][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <sigma token="solid 1px green" xml:lang="no-nb" xml:id="id1"> <phi desciption="this.nodeValue" xml:id="id2"> @@ -14739,6 +17254,11 @@ </test> <test> <xpath>//upsilon//eta[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::lambda[@string="true"][@xml:lang="no-nb"][not(following-sibling::*)]/epsilon[@xml:lang="en"][@xml:id="id1"][not(following-sibling::*)]/tau[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[not(child::node())][following-sibling::chi[@xml:id="id2"][not(child::node())][following-sibling::psi[starts-with(@att,"10")][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 3]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <upsilon> <eta xml:lang="en-US"/> @@ -14757,6 +17277,11 @@ </test> <test> <xpath>//kappa[contains(concat(@name,"$"),"3456789$")][@xml:id="id1"]/mu[@xml:id="id2"][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[@true][@xml:lang="no"][not(child::node())][following-sibling::omega[@and][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::xi[contains(@class,"e")][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[@and="content"][@xml:lang="no"][@xml:id="id4"][following-sibling::mu[starts-with(@attr,"1234")][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/lambda[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[starts-with(concat(@number,"-"),"attribute-")][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::phi[@xml:id="id7"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::nu[@xml:lang="no"][@xml:id="id8"]//alpha[starts-with(@src,"another ")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::theta[@xml:id="id9"][not(following-sibling::*)]/zeta[@xml:id="id10"][not(preceding-sibling::*)][not(preceding-sibling::zeta)]/iota[starts-with(concat(@abort,"-"),"attribute-")][@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)]/upsilon[starts-with(@attrib,"attribute v")][@xml:id="id12"]/omicron[contains(@true,"se")][@xml:lang="en"][not(preceding-sibling::*)][position() = 1]]]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <kappa name="123456789" xml:id="id1"> <mu xml:id="id2"/> @@ -14790,6 +17315,11 @@ </test> <test> <xpath>//epsilon[@or]/sigma[starts-with(concat(@class,"-"),"another attribute value-")][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::rho[@xml:lang="no"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[@insert][@xml:id="id2"][following-sibling::rho[@and][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 3]]//tau[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::kappa[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//kappa[@number="attribute value"][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)]/beta[not(preceding-sibling::*)][not(following-sibling::*)]//*[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)]/sigma[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="en"][preceding-sibling::*[position() = 1]]/omega[@xml:lang="en-US"][not(child::node())][following-sibling::omega[@xml:id="id8"][not(following-sibling::*)]//psi[@xml:id="id9"][not(preceding-sibling::*)][following-sibling::pi[@data="100%"][@xml:lang="en"][@xml:id="id10"]/zeta[@abort][@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@insert][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(following-sibling::any)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <epsilon or="attribute"> <sigma class="another attribute value"/> @@ -14825,6 +17355,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en-US"][@xml:id="id1"]/chi[@attr][@xml:id="id2"]//pi[starts-with(concat(@and,"-"),"content-")]//eta[@class][@xml:id="id3"][not(child::node())][following-sibling::lambda[@attribute]/omicron[starts-with(@number,"co")][@xml:lang="en-GB"][not(following-sibling::*)]/chi[@object="another attribute value"][not(preceding-sibling::*)][following-sibling::omega[starts-with(concat(@att,"-"),"another attribute value-")][not(following-sibling::*)]/pi[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]/nu[not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en-US" xml:id="id1"> <chi attr="false" xml:id="id2"> @@ -14849,6 +17384,11 @@ </test> <test> <xpath>//mu[@class="attribute value"][@xml:lang="no-nb"]//xi[contains(concat(@name,"$"),"ibute-value$")][not(following-sibling::*)][not(parent::*/*[position()=2])]//chi[contains(concat(@token,"$"),"tribute-value$")][@xml:id="id1"]//theta[@xml:lang="en-GB"][following-sibling::eta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::gamma[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::theta[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::psi[@attrib="this-is-att-value"][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::pi[contains(concat(@name,"$"),"alse$")][@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]/sigma[contains(@attr,"%")][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::mu[starts-with(@data,"tr")][not(following-sibling::*)]//theta[@and="attribute value"]//alpha[not(preceding-sibling::*)][following-sibling::sigma[contains(@false,"value")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::mu[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::mu[@attr][@xml:id="id7"][not(following-sibling::*)]//iota[@xml:id="id8"][not(following-sibling::*)]/tau[@data="attribute value"][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)]/kappa[@attribute="false"][@xml:lang="en-GB"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::delta[@xml:id="id12"][not(following-sibling::*)]//theta[@xml:lang="no"][@xml:id="id13"][not(child::node())][following-sibling::alpha[@xml:lang="en-US"]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <mu class="attribute value" xml:lang="no-nb"> <xi name="attribute-value"> @@ -14891,6 +17431,11 @@ </test> <test> <xpath>//gamma[@class]//epsilon[@attr="_blank"][not(following-sibling::*)]/beta[@attrib="solid 1px green"][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@xml:id="id3"]//iota[not(child::node())][following-sibling::upsilon[starts-with(concat(@abort,"-"),"attribute value-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[@number="_blank"][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::sigma[contains(@src,"56")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[not(child::node())][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]/zeta[@xml:lang="en-US"][not(following-sibling::*)]//eta[@xml:lang="no"][following-sibling::rho[contains(@abort,"3")][@xml:lang="en-US"][@xml:id="id8"][following-sibling::xi[@xml:lang="en"]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <gamma class="content"> <epsilon attr="_blank"> @@ -14922,6 +17467,11 @@ </test> <test> <xpath>//chi[@name="attribute"][@xml:lang="en-US"][@xml:id="id1"]/xi[@name][@xml:lang="en"][@xml:id="id2"]//tau[following-sibling::*[position()=2]][following-sibling::kappa[@token="solid 1px green"][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::sigma[@true][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//mu[contains(@title,"ibut")]//omega[starts-with(concat(@att,"-"),"attribute-")][@xml:id="id3"]/pi[@xml:id="id4"][not(preceding-sibling::*)]/kappa[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@and][preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:id="id6"][following-sibling::theta[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]//upsilon[@xml:id="id8"][not(child::node())][following-sibling::alpha[contains(@true,"tribute valu")][@xml:lang="nb"][not(following-sibling::*)]/delta[not(following-sibling::*)]/phi[@xml:id="id9"][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[@xml:lang="en-US"]/nu[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::zeta[starts-with(concat(@name,"-"),"false-")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/omega//nu[contains(@object,"a")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@attribute][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::mu[starts-with(concat(@insert,"-"),"attribute value-")][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <chi name="attribute" xml:lang="en-US" xml:id="id1"> <xi name="123456789" xml:lang="en" xml:id="id2"> @@ -14966,6 +17516,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="no"]//xi[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[not(child::node())][following-sibling::omicron[starts-with(@title,"false")][@xml:lang="no"]/kappa[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@string][not(preceding-sibling::*)]//nu[@or][@xml:lang="nb"][@xml:id="id2"][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="no"> <xi xml:lang="no"/> @@ -14984,6 +17539,11 @@ </test> <test> <xpath>//kappa[@xml:lang="nb"][@xml:id="id1"]/phi[starts-with(concat(@class,"-"),"false-")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::omicron[@xml:lang="no-nb"][not(following-sibling::*)]/*[following-sibling::theta[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/upsilon[@object][@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="nb" xml:id="id1"> <phi class="false" xml:lang="no-nb"> @@ -15003,6 +17563,11 @@ </test> <test> <xpath>//lambda[@src]//rho[starts-with(concat(@content,"-"),"another attribute value-")][@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)]/beta[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@xml:id="id3"][not(following-sibling::*)]//theta[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]/omega[@att][@xml:lang="en-GB"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::tau[@abort][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@desciption][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::theta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@token][@xml:lang="no-nb"]/kappa[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <lambda src="123456789"> <rho content="another attribute value" xml:lang="no" xml:id="id1"> @@ -15029,6 +17594,11 @@ </test> <test> <xpath>//mu[starts-with(@attrib,"true")][@xml:lang="en"]//phi[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[contains(@src,"attribut")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]//xi[following-sibling::gamma[not(child::node())][following-sibling::iota[contains(concat(@false,"$"),"56789$")][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::lambda[@xml:id="id4"]//upsilon[@xml:lang="no-nb"][@xml:id="id5"][following-sibling::*[position()=2]][following-sibling::iota[contains(@title,"alue")][@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@class][@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 2]]/phi[@number="this.nodeValue"][@xml:lang="nb"][@xml:id="id8"][following-sibling::omicron[@false][@xml:lang="no"][following-sibling::xi[@xml:id="id9"][not(following-sibling::*)]/xi[@xml:lang="en"][@xml:id="id10"][following-sibling::beta[starts-with(concat(@or,"-"),"solid 1px green-")][@xml:lang="no-nb"][not(child::node())][following-sibling::omega[contains(concat(@or,"$"),"1px green$")][preceding-sibling::*[position() = 2]]//phi[contains(@content,"attri")][@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::epsilon[@object][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <mu attrib="true" xml:lang="en"> <phi xml:lang="no" xml:id="id1"> @@ -15061,6 +17631,11 @@ </test> <test> <xpath>//mu[@xml:lang="no-nb"]/mu[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::mu)]//lambda[starts-with(@desciption,"att")][following-sibling::sigma[@xml:id="id1"][preceding-sibling::*[position() = 1]]/pi[@class][not(preceding-sibling::*)]/phi[@xml:lang="en-US"]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <mu xml:lang="no-nb"> <mu xml:lang="no"> @@ -15078,6 +17653,11 @@ </test> <test> <xpath>//omicron[starts-with(@object,"12345")][@xml:lang="nb"]/phi[contains(@object,"k")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id1"][following-sibling::gamma[@attrib="attribute value"][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]/beta[@desciption="100%"][@xml:id="id3"][not(preceding-sibling::*)]/alpha[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@src]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <omicron object="123456789" xml:lang="nb"> <phi object="_blank"/> @@ -15096,6 +17676,11 @@ </test> <test> <xpath>//beta[contains(@attrib,"but")][@xml:id="id1"]//rho[following-sibling::*[position()=3]][following-sibling::*[@data][@xml:lang="en-GB"][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::epsilon[starts-with(concat(@att,"-"),"solid 1px green-")][@xml:id="id3"][not(following-sibling::*)]/xi[@or="123456789"][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(preceding-sibling::kappa or following-sibling::kappa)][following-sibling::pi[@abort="solid 1px green"][@xml:lang="en-GB"][following-sibling::omicron[@false="this.nodeValue"][@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::iota[@xml:lang="nb"][preceding-sibling::*[position() = 3]]/theta[@xml:lang="no"]/omega[@object][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@and][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[@title="123456789"][not(child::node())][following-sibling::pi[@insert="100%"][@xml:id="id6"]/iota[@xml:lang="nb"][@xml:id="id7"][not(following-sibling::*)]/tau[contains(concat(@src,"$"),"tribute$")][@xml:id="id8"][following-sibling::phi[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:lang="nb"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <beta attrib="attribute" xml:id="id1"> <rho/> @@ -15132,6 +17717,11 @@ </test> <test> <xpath>//omega[contains(@attr,"t")][@xml:lang="nb"]//mu[contains(concat(@src,"$"),"bute$")][not(following-sibling::*)]//epsilon[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::tau[@xml:id="id2"][not(following-sibling::*)]//gamma[@xml:lang="en-US"][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/phi[contains(concat(@att,"$"),"56789$")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::pi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::omicron[@false][@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::upsilon[starts-with(@and,"attribute-v")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 3]]//eta[starts-with(@false,"another attribute ")][@xml:lang="no-nb"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <omega attr="content" xml:lang="nb"> <mu src="attribute"> @@ -15155,6 +17745,11 @@ </test> <test> <xpath>//lambda[@xml:lang="no"]//omicron[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::iota[contains(concat(@data,"$"),"t-value$")][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@class][@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//theta[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::zeta[@title][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//zeta[@att][@xml:lang="no"]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="no"> <omicron xml:id="id1"/> @@ -15174,6 +17769,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en-US"]/zeta[@object="this-is-att-value"][@xml:lang="nb"][@xml:id="id1"][not(following-sibling::*)]/sigma[starts-with(concat(@string,"-"),"another attribute value-")][following-sibling::eta[@xml:id="id2"]//alpha[starts-with(@false,"another")][@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::beta[starts-with(concat(@desciption,"-"),"this.nodeValue-")][@xml:lang="no-nb"]/epsilon[starts-with(@true,"con")][not(child::node())][following-sibling::epsilon[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]]//alpha[starts-with(@insert,"this.nodeV")][@xml:id="id5"]//nu[contains(@attr,"67")][@xml:id="id6"][not(child::node())][following-sibling::lambda[@xml:lang="en"]//phi[not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="en-US"][@xml:id="id7"]/lambda[@xml:id="id8"]/beta[@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@xml:lang="en"][@xml:id="id10"][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id11"][preceding-sibling::*[position() = 1]]//delta/epsilon[@insert][@xml:id="id12"]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en-US"> <zeta object="this-is-att-value" xml:lang="nb" xml:id="id1"> @@ -15213,6 +17813,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@token,"-"),"100%-")][@xml:lang="no"][@xml:id="id1"]//upsilon[contains(concat(@attr,"$"),".nodeValue$")][@xml:lang="en-US"][not(child::node())][following-sibling::alpha[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@object="attribute-value"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::pi[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 3]][following-sibling::chi[not(following-sibling::*)]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <delta token="100%" xml:lang="no" xml:id="id1"> <upsilon attr="this.nodeValue" xml:lang="en-US"/> @@ -15227,6 +17832,11 @@ </test> <test> <xpath>//delta[@xml:lang="no"]//sigma[@true]//chi[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[contains(@attrib,"e")][@xml:lang="en"][@xml:id="id2"][following-sibling::iota[contains(concat(@abort,"$"),"ibute$")][following-sibling::*[position()=1]][following-sibling::xi[contains(@and,"1")][@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="no"> <sigma true="_blank"> @@ -15243,6 +17853,11 @@ </test> <test> <xpath>//eta[@xml:lang="no-nb"][@xml:id="id1"]/beta[starts-with(concat(@data,"-"),"attribute-")][not(preceding-sibling::*)][following-sibling::xi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[not(preceding-sibling::*)]/kappa[@xml:lang="en-US"][not(preceding-sibling::*)]/theta[not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::theta)]//chi[starts-with(concat(@number,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/iota[@data="another attribute value"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="nb"][not(child::node())][following-sibling::xi[@delete][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@content="attribute-value"][@xml:lang="nb"][preceding-sibling::*[position() = 3]]/phi[@att][@xml:id="id5"][not(preceding-sibling::*)]/chi[@xml:id="id6"][not(preceding-sibling::*)]/mu[contains(concat(@content,"$"),"e$")][@xml:lang="en-GB"][not(following-sibling::*)]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="no-nb" xml:id="id1"> <beta data="attribute"/> @@ -15274,6 +17889,11 @@ </test> <test> <xpath>//upsilon//iota[contains(@class,"56789")][not(child::node())][following-sibling::omicron[following-sibling::*[position()=2]][following-sibling::theta[@number][@xml:lang="en"][@xml:id="id1"][following-sibling::xi[@xml:lang="en-US"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//delta[not(following-sibling::*)]/nu[@xml:id="id2"][following-sibling::chi[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::alpha[@xml:lang="no"][@xml:id="id4"]/pi[contains(concat(@attrib,"$"),"tribute value$")][@xml:lang="en"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <upsilon> <iota class="123456789"/> @@ -15296,6 +17916,11 @@ </test> <test> <xpath>//sigma[@true][@xml:id="id1"]//delta[@string][@xml:id="id2"]/omicron[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::lambda[contains(@false,"e")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]]/upsilon[contains(concat(@data,"$"),"odeValue$")][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::sigma[@object][@xml:id="id6"][following-sibling::pi[contains(@attrib,"n")][@xml:lang="nb"][@xml:id="id7"][following-sibling::theta[contains(@att,"t")][preceding-sibling::*[position() = 3]]/delta[@xml:lang="en"][@xml:id="id8"]/omega[starts-with(@string,"cont")][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@or][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <sigma true="123456789" xml:id="id1"> <delta string="_blank" xml:id="id2"> @@ -15320,6 +17945,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]/mu[starts-with(@attribute,"this.node")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::mu[@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[@content][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::lambda[@xml:lang="nb"][not(following-sibling::*)]/epsilon[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[starts-with(concat(@data,"-"),"100%-")][following-sibling::beta[starts-with(@insert,"100%")][@xml:id="id5"][preceding-sibling::*[position() = 2]]/omega[@attrib][not(child::node())][following-sibling::lambda[@abort][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::lambda[starts-with(@insert,"content")][@xml:lang="nb"][@xml:id="id7"][not(child::node())][following-sibling::rho/xi[not(child::node())][following-sibling::iota[@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[preceding-sibling::*[position() = 2]][following-sibling::kappa[starts-with(concat(@insert,"-"),"this.nodeValue-")][@xml:lang="en-GB"][@xml:id="id9"]//omega[@xml:lang="nb"][not(preceding-sibling::*)]/lambda[not(preceding-sibling::*)][not(following-sibling::*)]//delta[@title][@xml:lang="nb"][not(child::node())][following-sibling::pi[@xml:lang="no"][@xml:id="id10"][not(following-sibling::*)]/omega[contains(@string,"0%")][@xml:lang="no-nb"][@xml:id="id11"]//upsilon[starts-with(@false,"1")][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <mu attribute="this.nodeValue" xml:lang="nb"/> @@ -15358,6 +17988,11 @@ </test> <test> <xpath>//upsilon[contains(@and,"al")][@xml:lang="nb"]/gamma[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[contains(@insert,"%")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//upsilon[not(child::node())][following-sibling::alpha[@data][not(following-sibling::*)]/pi[@xml:lang="no"][@xml:id="id2"][following-sibling::mu[contains(concat(@src,"$"),"_blank$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/theta[contains(@att,"Value")][@xml:id="id3"][not(following-sibling::*)][not(preceding-sibling::theta or following-sibling::theta)][not(preceding-sibling::theta)]//beta[@class][@xml:lang="en-US"]//phi[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id6"]//delta[starts-with(@object,"this.nod")][@xml:lang="en-GB"][@xml:id="id7"][following-sibling::tau[preceding-sibling::*[position() = 1]][following-sibling::alpha[following-sibling::psi[@att][@xml:lang="en-US"][@xml:id="id8"][not(following-sibling::*)]//omega[@xml:id="id9"][not(preceding-sibling::*)]]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <upsilon and="false" xml:lang="nb"> <gamma xml:id="id1"/> @@ -15391,6 +18026,11 @@ </test> <test> <xpath>//beta[@xml:lang="en-GB"][@xml:id="id1"]//*[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::gamma[starts-with(concat(@data,"-"),"this-")][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[starts-with(concat(@src,"-"),"100%-")][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//*[@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)]//mu[starts-with(concat(@src,"-"),"false-")][not(child::node())][following-sibling::delta[starts-with(@object,"_b")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@xml:id="id6"][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="en-GB" xml:id="id1"> <any xml:lang="nb"/> @@ -15410,6 +18050,11 @@ </test> <test> <xpath>//omicron[contains(@src,"4")][@xml:id="id1"]/xi[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::phi[@attribute][@xml:lang="no-nb"][not(child::node())][following-sibling::beta[@att][@xml:lang="no"][not(child::node())][following-sibling::*[@attr][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 3]]//omicron[@title][@xml:lang="en-US"]//eta[@number][@xml:lang="no"]/phi[@token]/alpha[@xml:lang="nb"][@xml:id="id4"]//pi[contains(@number,"tt")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@string="true"][not(following-sibling::*)]//delta[@true][@xml:id="id6"][not(preceding-sibling::*)]//phi[contains(@object,"6789")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@src="this-is-att-value"][@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <omicron src="123456789" xml:id="id1"> <xi xml:id="id2"/> @@ -15440,6 +18085,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no"][@xml:id="id1"]//omicron[contains(concat(@name,"$"),"tt-value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[preceding-sibling::*[position() = 1]]//upsilon[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[following-sibling::phi[contains(@token,"een")][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/eta[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::omicron[contains(@name,"e")][@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@xml:id="id5"]/gamma[@false][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@or,"$"),"value$")][@xml:lang="en-US"][@xml:id="id7"]//omicron[@desciption][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="no" xml:id="id1"> <omicron name="this-is-att-value" xml:lang="no-nb"/> @@ -15465,6 +18115,11 @@ </test> <test> <xpath>//omicron[@xml:lang="en-GB"][@xml:id="id1"]//pi[not(preceding-sibling::*)]/sigma[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(preceding-sibling::sigma or following-sibling::sigma)][following-sibling::phi[@false][not(following-sibling::*)]/kappa[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//*//sigma[contains(@class,"12345")][following-sibling::gamma[@xml:id="id3"][preceding-sibling::*[position() = 1]]//nu[contains(@data,"lue")][@xml:lang="no-nb"][not(preceding-sibling::*)]/psi[@or][@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]//eta[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::*[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::mu[contains(@attrib,"te value")][@xml:lang="no-nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omicron[@xml:lang="nb"][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[@number][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:id="id9"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:lang="no-nb"][@xml:id="id10"]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="en-GB" xml:id="id1"> <pi> @@ -15498,6 +18153,11 @@ </test> <test> <xpath>//*[@xml:lang="nb"][@xml:id="id1"]/psi[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::gamma[contains(concat(@token,"$"),"ttribute$")][preceding-sibling::*[position() = 1]][following-sibling::chi[@false][@xml:id="id3"]//omicron[not(child::node())][following-sibling::tau[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id4"]//upsilon[not(following-sibling::*)]/pi[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::iota[@class="attribute value"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::phi[@xml:id="id6"][preceding-sibling::*[position() = 2]]//theta[contains(concat(@src,"$"),"ttribute value$")][@xml:lang="no"][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[contains(concat(@src,"$"),"ute value$")][@xml:lang="en"][not(following-sibling::*)]/pi[starts-with(@src,"another")][@xml:lang="no-nb"][not(preceding-sibling::pi)][not(child::node())][following-sibling::epsilon[@xml:id="id8"][following-sibling::*[position()=4]][following-sibling::xi[@xml:lang="no-nb"][following-sibling::delta[@xml:lang="nb"][not(child::node())][following-sibling::kappa[@xml:id="id9"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::kappa[@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 5]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="nb" xml:id="id1"> <psi xml:id="id2"/> @@ -15530,6 +18190,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]//theta[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::kappa[contains(@class,"56789")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[starts-with(@attr,"attri")][@xml:lang="en"]//xi[contains(@att,"0%")][not(preceding-sibling::*)]/zeta[@name][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="no"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <theta xml:lang="en" xml:id="id2"/> @@ -15549,6 +18214,11 @@ </test> <test> <xpath>//alpha[@xml:lang="nb"][@xml:id="id1"]/zeta[@true][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[@delete="this-is-att-value"][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[starts-with(concat(@class,"-"),"content-")][@xml:lang="en-GB"][not(following-sibling::*)]/chi[contains(@object,"tru")][@xml:id="id4"][following-sibling::beta[@xml:lang="en"][@xml:id="id5"]//nu[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::xi[@object="100%"][@xml:id="id7"]//upsilon/omicron[starts-with(concat(@content,"-"),"solid 1px green-")][@xml:lang="nb"][@xml:id="id8"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@desciption][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:id="id10"]/lambda[starts-with(concat(@and,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@xml:lang="nb"][@xml:id="id12"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="nb" xml:id="id1"> <zeta true="solid 1px green" xml:lang="en-GB" xml:id="id2"/> @@ -15579,6 +18249,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]//alpha[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::beta[@xml:lang="no"][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id6"]/gamma[@and="100%"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@src][@xml:id="id7"][not(child::node())][following-sibling::tau[@xml:lang="en"]/pi[@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/omicron[@object][not(following-sibling::*)]//chi[@xml:lang="nb"][following-sibling::omega[contains(@or," value")][@xml:lang="en-GB"][following-sibling::xi[@xml:lang="en"][@xml:id="id9"]//*[starts-with(concat(@content,"-"),"this-")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en"][not(following-sibling::*)]//tau[@xml:lang="no-nb"][@xml:id="id10"][not(following-sibling::*)]/xi[@xml:lang="en"][@xml:id="id11"]//tau[@number][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:id="id12"][preceding-sibling::*[position() = 1]][following-sibling::*[contains(concat(@string,"$"),"reen$")][@xml:id="id13"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//pi[@number][@xml:lang="en-GB"][@xml:id="id14"][not(following-sibling::*)][position() = 1]][position() = 1]]]]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <sigma xml:id="id1"> <alpha xml:lang="en" xml:id="id2"/> @@ -15621,6 +18296,11 @@ </test> <test> <xpath>//psi[contains(@desciption,"456789")][@xml:lang="nb"]//eta[@attribute="123456789"][@xml:id="id1"][not(following-sibling::*)]/gamma[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::mu[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[not(following-sibling::*)]//iota[@xml:lang="no"][not(child::node())][following-sibling::lambda[@insert="false"][@xml:id="id4"]//kappa[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::*[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/iota[@xml:lang="no"][not(following-sibling::*)]/sigma[contains(concat(@true,"$"),"ibute value$")][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]//theta[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::mu//mu[@attribute][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::mu)][following-sibling::sigma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//alpha[starts-with(@desciption,"another attribute valu")][@xml:lang="no"][@xml:id="id8"]/eta[contains(concat(@token,"$"),"bute$")][@xml:id="id9"][not(following-sibling::*)]/mu[@xml:lang="nb"]/beta[@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <psi desciption="123456789" xml:lang="nb"> <eta attribute="123456789" xml:id="id1"> @@ -15659,6 +18339,11 @@ </test> <test> <xpath>//chi[@xml:lang="en-GB"]/xi[@att][not(preceding-sibling::*)][not(following-sibling::*)]/tau[starts-with(@or,"1234")][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:id="id2"][preceding-sibling::*[position() = 1]]//xi[contains(@and,"lue")][@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[contains(concat(@true,"$"),"tribute value$")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]]//psi[starts-with(concat(@insert,"-"),"this-")][@xml:id="id4"]//epsilon[following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:id="id5"][preceding-sibling::*[position() = 1]]//nu[@xml:lang="no-nb"][following-sibling::nu/iota[not(following-sibling::*)][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="en-GB"> <xi att="attribute value"> @@ -15686,6 +18371,11 @@ </test> <test> <xpath>//omicron[@xml:lang="nb"][@xml:id="id1"]//epsilon[@class][@xml:id="id2"][not(preceding-sibling::*)]//omicron[not(following-sibling::*)]//beta[starts-with(@content,"this.no")][@xml:lang="en-GB"][not(following-sibling::*)]//mu[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::mu[not(following-sibling::*)]/sigma[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[starts-with(@title,"at")][@xml:id="id5"][preceding-sibling::*[position() = 1]]/lambda[starts-with(@number,"attr")][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::kappa[starts-with(concat(@content,"-"),"this-")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[not(following-sibling::*)]//epsilon[@xml:id="id8"][not(following-sibling::*)]//omicron[@delete][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[@att][@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="nb" xml:id="id1"> <epsilon class="_blank" xml:id="id2"> @@ -15717,6 +18407,11 @@ </test> <test> <xpath>//rho[@xml:lang="en"]//omega[@xml:id="id1"][not(preceding-sibling::*)][not(preceding-sibling::omega)]//theta[@xml:lang="nb"][@xml:id="id2"]/epsilon[@object][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::zeta[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="no-nb"][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="en"> <omega xml:id="id1"> @@ -15733,6 +18428,11 @@ </test> <test> <xpath>//epsilon/alpha//rho[@string][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[starts-with(@number,"_bla")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::omicron[not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <epsilon> <alpha> @@ -15749,6 +18449,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="en-GB"][@xml:id="id1"]/sigma[@string="solid 1px green"][@xml:lang="en-US"][@xml:id="id2"][following-sibling::pi[@xml:id="id3"][following-sibling::*[position()=2]][following-sibling::zeta[preceding-sibling::*[position() = 2]][following-sibling::alpha[@string]/kappa[contains(@content,"ank")][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]//omega[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::omega)]/nu[@xml:lang="no"][not(preceding-sibling::*)]//epsilon[@or][@xml:lang="en-GB"][@xml:id="id6"]/lambda[not(preceding-sibling::*)][following-sibling::delta[@delete][preceding-sibling::*[position() = 1]][following-sibling::nu[@object][@xml:id="id7"][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 3]]/omega[@xml:id="id8"][not(preceding-sibling::*)]//delta[@xml:lang="no-nb"][not(preceding-sibling::*)]//pi[not(preceding-sibling::*)][following-sibling::phi[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::phi[preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="en-GB" xml:id="id1"> <sigma string="solid 1px green" xml:lang="en-US" xml:id="id2"/> @@ -15783,6 +18488,11 @@ </test> <test> <xpath>//theta[@or="this-is-att-value"]//beta[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::omega[starts-with(@attr,"at")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[starts-with(@desciption,"solid 1px gre")][@xml:lang="en-US"]//epsilon[@true][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::gamma[contains(@data,"234")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//zeta[@content][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::upsilon[contains(@number,"attribute valu")][@xml:id="id5"]//theta[@xml:id="id6"][not(child::node())][following-sibling::theta[contains(concat(@false,"$"),"e$")][following-sibling::chi//beta[contains(concat(@attribute,"$"),"100%$")]//iota[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)]/phi[@token][@xml:lang="nb"][@xml:id="id8"][not(following-sibling::*)][not(preceding-sibling::phi)]/zeta[@xml:lang="en-US"]/omicron[@xml:id="id9"][not(preceding-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <theta or="this-is-att-value"> <beta xml:lang="en" xml:id="id1"/> @@ -15818,6 +18528,11 @@ </test> <test> <xpath>//sigma[@xml:lang="no"]//eta[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:lang="en-US"]/eta//rho[@insert="_blank"][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="no"> <eta xml:id="id1"> @@ -15835,6 +18550,11 @@ </test> <test> <xpath>//xi[@class][@xml:lang="en-GB"]/theta[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[starts-with(concat(@data,"-"),"attribute value-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]/omicron[@xml:lang="en-US"][not(child::node())][following-sibling::zeta[@delete][@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]]/pi[contains(@false,"olid 1px green")][@xml:lang="nb"][not(following-sibling::*)]//zeta[@token="attribute value"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[following-sibling::rho[@attribute="solid 1px green"]/*[@false][@xml:lang="no"]//delta[contains(concat(@or,"$"),"_blank$")][not(preceding-sibling::*)]//iota[starts-with(@token,"att")][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:id="id2"][not(child::node())][following-sibling::tau[@data][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::upsilon[contains(concat(@src,"$"),"false$")][preceding-sibling::*[position() = 3]][following-sibling::kappa//epsilon[@or="this-is-att-value"][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::*[contains(@class,"bute value")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <xi class="content" xml:lang="en-GB"> <theta xml:lang="no"> @@ -15871,6 +18591,11 @@ </test> <test> <xpath>//phi[@and="this.nodeValue"][@xml:id="id1"]//chi[@xml:id="id2"][not(preceding-sibling::*)]//psi[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::iota[@src][@xml:lang="en"][following-sibling::*[position()=3]][following-sibling::rho[starts-with(concat(@number,"-"),"true-")][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::eta[@delete][@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][following-sibling::beta[contains(@attribute,"100")][@xml:id="id5"][preceding-sibling::*[position() = 4]]//psi[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[@false="attribute-value"][@xml:lang="nb"]/kappa[@xml:id="id7"][following-sibling::xi[@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 1]]/tau[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[starts-with(@true,"attri")][@xml:lang="no"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/*[following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[@xml:id="id11"][not(preceding-sibling::*)][following-sibling::alpha[starts-with(concat(@name,"-"),"false-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[@false="true"][@xml:lang="nb"][following-sibling::rho[@name][@xml:lang="nb"][@xml:id="id12"][preceding-sibling::*[position() = 3]][following-sibling::zeta[@xml:id="id13"][following-sibling::*[position()=1]][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]/alpha[@xml:lang="no"][not(preceding-sibling::alpha)]/zeta[@xml:id="id14"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <phi and="this.nodeValue" xml:id="id1"> <chi xml:id="id2"> @@ -15911,6 +18636,11 @@ </test> <test> <xpath>//alpha[contains(@number," 1px gre")]/eta[not(child::node())][following-sibling::iota[@xml:lang="en"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::nu[@object][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//psi[@attrib][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::nu[@delete][preceding-sibling::*[position() = 1]]//beta/tau[@xml:id="id3"]/chi[starts-with(concat(@true,"-"),"content-")][@xml:id="id4"][not(preceding-sibling::*)]/phi[@xml:id="id5"][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]]//iota[not(following-sibling::*)]/upsilon[contains(concat(@name,"$"),"k$")]/eta[@data="attribute"][not(child::node())][following-sibling::tau[@xml:id="id7"][preceding-sibling::*[position() = 1]]//eta[@token="attribute-value"][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::kappa[@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@xml:id="id9"][preceding-sibling::*[position() = 2]]//lambda[@desciption="123456789"]/gamma[@attr][@xml:id="id10"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@xml:id="id11"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <alpha number="solid 1px green"> <eta/> @@ -15951,6 +18681,11 @@ </test> <test> <xpath>//epsilon[starts-with(@insert,"fa")][@xml:lang="en-US"][@xml:id="id1"]/eta[contains(concat(@class,"$"),"e$")][@xml:lang="en"]//nu[starts-with(concat(@string,"-"),"this-")][@xml:id="id2"][following-sibling::alpha[contains(concat(@name,"$"),"tribute$")][@xml:lang="en-US"][following-sibling::upsilon[preceding-sibling::*[position() = 2]]//nu[not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="en-GB"][not(child::node())][following-sibling::zeta[starts-with(@class,"con")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 3]][not(following-sibling::*)]/omicron[following-sibling::iota[not(child::node())][following-sibling::theta[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::sigma[@xml:id="id4"][not(child::node())][following-sibling::alpha[@xml:id="id5"][following-sibling::sigma[starts-with(@content,"10")][@xml:id="id6"][not(child::node())][following-sibling::omicron[@content="true"][@xml:id="id7"][position() = 1]]]][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <epsilon insert="false" xml:lang="en-US" xml:id="id1"> <eta class="true" xml:lang="en"> @@ -15978,6 +18713,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]//iota[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[preceding-sibling::*[position() = 1]]//delta[@insert][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@data][@xml:lang="no-nb"][not(following-sibling::*)]//lambda[@xml:id="id2"][following-sibling::epsilon[@insert][@xml:lang="no"][preceding-sibling::*[position() = 1]]/phi[@xml:id="id3"][not(preceding-sibling::*)]//rho[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="en-US"][not(child::node())][following-sibling::psi[@name][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@xml:lang="en"][not(following-sibling::*)]//omicron[starts-with(@attr,"c")]/upsilon[contains(concat(@name,"$")," 1px green$")][@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]/delta[not(following-sibling::*)]/beta[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::omicron[@content][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[contains(concat(@token,"$"),"ue$")][@xml:id="id7"][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <iota/> @@ -16014,6 +18754,11 @@ </test> <test> <xpath>//theta[contains(@string,"ontent")][@xml:lang="nb"]//iota[contains(@token,"t-v")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@xml:id="id1"]//kappa[@xml:id="id2"][not(preceding-sibling::*)]//beta[@attribute="this-is-att-value"][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[starts-with(concat(@true,"-"),"solid 1px green-")][@xml:id="id4"][following-sibling::omega[@and="attribute"][@xml:lang="no"][not(following-sibling::*)]//pi[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <theta string="content" xml:lang="nb"> <iota token="this-is-att-value" xml:lang="en"> @@ -16035,6 +18780,11 @@ </test> <test> <xpath>//omega[@xml:lang="en-US"]//alpha[@xml:id="id1"][not(preceding-sibling::*)]/delta[@xml:id="id2"][following-sibling::alpha[starts-with(concat(@src,"-"),"this-")][@xml:lang="en"][@xml:id="id3"][following-sibling::*[position()=3]][following-sibling::beta[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::*[preceding-sibling::*[position() = 3]][following-sibling::epsilon[starts-with(concat(@attribute,"-"),"solid 1px green-")][not(following-sibling::*)]//sigma[@class][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:id="id5"][preceding-sibling::*[position() = 1]]/kappa[@delete="123456789"][@xml:lang="no"][following-sibling::epsilon[@xml:id="id6"][not(following-sibling::*)]/kappa[@xml:id="id7"][not(following-sibling::*)]/sigma[contains(@attr,"12345")][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[preceding-sibling::*[position() = 1]]/eta[@false][@xml:lang="en-GB"][@xml:id="id8"][not(child::node())][following-sibling::xi[starts-with(concat(@and,"-"),"another attribute value-")][@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)]//*[contains(concat(@title,"$"),"tribute value$")][not(preceding-sibling::*)][not(following-sibling::any)][following-sibling::omega[@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::kappa[@class="attribute"][@xml:id="id11"][preceding-sibling::*[position() = 2]][following-sibling::psi[@true="another attribute value"][@xml:id="id12"][not(child::node())][following-sibling::nu[contains(concat(@src,"$"),"false$")][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::psi[@xml:id="id13"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en-US"> <alpha xml:id="id1"> @@ -16072,6 +18822,11 @@ </test> <test> <xpath>//theta[@attribute][@xml:id="id1"]//nu[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 1]]//*[starts-with(concat(@attr,"-"),"_blank-")][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]/omicron[contains(@delete,"ther attribute value")][@xml:id="id3"]/pi[@xml:lang="no"]//kappa[@xml:lang="en"][@xml:id="id4"]//delta[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[not(following-sibling::*)][not(following-sibling::iota)]/eta[starts-with(concat(@delete,"-"),"solid 1px green-")][@xml:lang="nb"][not(child::node())][following-sibling::*[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[starts-with(concat(@attrib,"-"),"solid 1px green-")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[not(preceding-sibling::*)][not(following-sibling::*)]/lambda[contains(@or,"alse")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <theta attribute="_blank" xml:id="id1"> <nu xml:lang="no"/> @@ -16104,6 +18859,11 @@ </test> <test> <xpath>//iota[contains(@data,"ank")][@xml:id="id1"]//*[@xml:id="id2"][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[following-sibling::*[@title][@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]//psi[@xml:id="id4"]//chi[@xml:id="id5"][not(child::node())][following-sibling::kappa[contains(@desciption,"%")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]]//psi[@class][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="no"]//omicron[starts-with(@abort,"1")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[@name="false"][@xml:lang="no"][not(preceding-sibling::*)]//zeta[@content][@xml:lang="nb"]/psi[@att="content"][@xml:lang="en"][@xml:id="id9"][following-sibling::rho[@xml:id="id10"][not(following-sibling::*)]/kappa[@xml:lang="en-US"]//lambda[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::pi[starts-with(@string,"at")][@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 1]]/kappa[starts-with(@number,"th")][@xml:id="id12"]//mu[@xml:id="id13"][not(preceding-sibling::mu)][following-sibling::kappa[not(preceding-sibling::kappa)]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <iota data="_blank" xml:id="id1"> <any xml:id="id2"/> @@ -16147,6 +18907,11 @@ </test> <test> <xpath>//pi[@xml:id="id1"]//lambda[@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::rho[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[@object="this.nodeValue"][@xml:lang="en-GB"][not(following-sibling::*)]/gamma[contains(concat(@delete,"$"),"tribute-value$")][@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]/mu[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::sigma[@and][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:lang="en-US"][following-sibling::phi[@attrib][@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 3]]//alpha/*[starts-with(@and,"this-is-at")][@xml:id="id7"][following-sibling::eta[@xml:id="id8"]//epsilon[contains(@token,"gree")][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@false][@xml:lang="no-nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]]//sigma[@xml:lang="en-GB"][not(following-sibling::*)]//gamma[@xml:lang="en-GB"][not(child::node())][following-sibling::theta[starts-with(concat(@attrib,"-"),"solid 1px green-")][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@xml:id="id12"][preceding-sibling::*[position() = 2]]//xi[@xml:lang="en-US"][not(preceding-sibling::*)]/omega[starts-with(@token,"this.nodeV")][not(child::node())][following-sibling::lambda[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[starts-with(concat(@delete,"-"),"another attribute value-")][@xml:lang="en-US"][not(following-sibling::*)]//epsilon[position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <pi xml:id="id1"> <lambda xml:lang="en-GB" xml:id="id2"/> @@ -16190,6 +18955,11 @@ </test> <test> <xpath>//omicron[starts-with(@att,"attribute value")]//mu[@xml:lang="en-GB"][@xml:id="id1"][not(child::node())][following-sibling::beta//sigma[@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::delta[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[starts-with(@or,"tru")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::mu[starts-with(concat(@attrib,"-"),"attribute value-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 4]][following-sibling::rho[@att][@xml:lang="en-GB"][following-sibling::iota[@name][not(following-sibling::*)]//lambda[@desciption][@xml:id="id4"][not(preceding-sibling::*)]/tau[contains(@false,"0%")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="en-US"][not(child::node())][following-sibling::epsilon/chi[@token][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::kappa[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="no"]/lambda[@attrib]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <omicron att="attribute value"> <mu xml:lang="en-GB" xml:id="id1"/> @@ -16221,6 +18991,11 @@ </test> <test> <xpath>//zeta[@xml:lang="no"]/pi[not(following-sibling::*)]//chi[@attrib][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::sigma[@attribute][@xml:lang="en-US"][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[starts-with(concat(@attr,"-"),"content-")][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:id="id3"][preceding-sibling::*[position() = 3]]//mu[@xml:id="id4"][not(child::node())][following-sibling::theta[@number="attribute-value"][@xml:id="id5"][following-sibling::rho[starts-with(@number,"solid 1px gre")][@xml:id="id6"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <zeta xml:lang="no"> <pi> @@ -16240,6 +19015,11 @@ </test> <test> <xpath>//alpha[@false][@xml:lang="no-nb"]//theta[@false][@xml:id="id1"][following-sibling::delta[preceding-sibling::*[position() = 1]][following-sibling::mu[starts-with(@and,"this.n")][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/kappa[@xml:lang="en"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::psi[starts-with(concat(@class,"-"),"attribute value-")][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[following-sibling::theta[starts-with(concat(@delete,"-"),"this-")][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::sigma[@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@number][@xml:lang="no-nb"][preceding-sibling::*[position() = 3]]//theta[@xml:lang="no"][@xml:id="id7"]//nu[@attr][not(child::node())][following-sibling::omega[starts-with(@delete,"cont")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[@xml:lang="en"][@xml:id="id8"]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <alpha false="123456789" xml:lang="no-nb"> <theta false="true" xml:id="id1"/> @@ -16266,6 +19046,11 @@ </test> <test> <xpath>//xi//gamma[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::kappa[@xml:id="id1"][following-sibling::rho[starts-with(@title,"100")][following-sibling::lambda[starts-with(concat(@true,"-"),"another attribute value-")][@xml:lang="en-GB"][@xml:id="id2"]//gamma[@token][not(child::node())][following-sibling::psi[starts-with(concat(@insert,"-"),"100%-")][@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]/tau[starts-with(concat(@number,"-"),"attribute-")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::tau[@xml:id="id5"][following-sibling::*[position()=2]][following-sibling::upsilon[@class][@xml:lang="en-US"][following-sibling::upsilon[not(following-sibling::*)]//sigma[starts-with(concat(@or,"-"),"true-")][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@class][@xml:id="id7"][not(following-sibling::*)]//omega[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[contains(concat(@false,"$"),"ue$")][@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)]//beta[starts-with(@content,"fa")][@xml:id="id9"][not(following-sibling::*)]//upsilon[contains(@att,"ut")][not(preceding-sibling::*)]//beta[@name="false"][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::pi[@xml:lang="no"][@xml:id="id11"][position() = 1]][position() = 1]][position() = 1]]]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <xi> <gamma xml:lang="no-nb"/> @@ -16302,6 +19087,11 @@ </test> <test> <xpath>//chi/delta[@object="123456789"][@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]//pi[contains(concat(@attrib,"$"),"e$")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[contains(@false,"e")][@xml:id="id3"][not(following-sibling::*)]//chi[@or][not(following-sibling::*)]/zeta[starts-with(@data,"t")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::gamma[starts-with(concat(@number,"-"),"solid 1px green-")][not(following-sibling::*)]/chi[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[not(following-sibling::*)]/rho[@att="content"][@xml:id="id6"][not(following-sibling::*)]/sigma[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[starts-with(@attribute,"this-is")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@object][following-sibling::*[position()=1]][following-sibling::chi[@class][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//psi[@class][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@src][@xml:id="id8"]/omicron[@attrib][@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <chi> <delta object="123456789" xml:lang="en-GB" xml:id="id1"> @@ -16338,6 +19128,11 @@ </test> <test> <xpath>//theta[@data][@xml:id="id1"]//gamma[@attrib="solid 1px green"][not(preceding-sibling::*)]//psi[@xml:lang="no"][not(preceding-sibling::*)]/psi[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@delete][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[@attribute="attribute-value"][@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <theta data="solid 1px green" xml:id="id1"> <gamma attrib="solid 1px green"> @@ -16356,6 +19151,11 @@ </test> <test> <xpath>//phi[starts-with(concat(@number,"-"),"this.nodeValue-")][@xml:lang="en-GB"][@xml:id="id1"]//epsilon[@xml:id="id2"][not(following-sibling::*)]/sigma[@xml:lang="no"][following-sibling::sigma[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::xi[@attrib][@xml:id="id4"][not(following-sibling::*)]//gamma[@xml:lang="no-nb"][@xml:id="id5"]/zeta[@xml:lang="en-US"][not(preceding-sibling::*)]//zeta[contains(@abort,"lue")][@xml:id="id6"][not(child::node())][following-sibling::nu[@delete][@xml:lang="no"][following-sibling::sigma[starts-with(@att,"conte")][@xml:id="id7"][not(following-sibling::*)]//omicron[starts-with(concat(@src,"-"),"attribute value-")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@data][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@xml:lang="no-nb"]//pi[@xml:id="id8"][not(following-sibling::*)]//beta[@attribute][@xml:lang="no"][following-sibling::*[position()=3]][not(child::node())][following-sibling::xi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::omicron[starts-with(@name,"anot")][@xml:lang="en-US"][following-sibling::*[position()=1]][not(following-sibling::omicron)][following-sibling::chi[@name][not(following-sibling::*)]//kappa[@xml:lang="nb"][@xml:id="id9"][not(following-sibling::*)]/xi[starts-with(concat(@content,"-"),"attribute-")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <phi number="this.nodeValue" xml:lang="en-GB" xml:id="id1"> <epsilon xml:id="id2"> @@ -16395,6 +19195,11 @@ </test> <test> <xpath>//omega[starts-with(@abort,"attribut")]//tau[contains(@or,"bute ")][@xml:id="id1"]/eta[not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:lang="en-US"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::chi[contains(@attribute,"e")][@xml:lang="no"][not(following-sibling::*)]//zeta[contains(@object,"ntent")][@xml:lang="en-GB"]/epsilon[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[contains(concat(@src,"$"),"se$")][@xml:lang="en-US"][not(preceding-sibling::*)]/tau[@xml:id="id3"]//theta[starts-with(@src,"fa")][@xml:id="id4"][following-sibling::psi[contains(@content,"lue")][not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <omega abort="attribute"> <tau or="attribute value" xml:id="id1"> @@ -16421,6 +19226,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no-nb"]//zeta[starts-with(concat(@attr,"-"),"solid 1px green-")][@xml:lang="no"][not(following-sibling::*)]/alpha[contains(@attrib,"alue")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//delta[contains(@object,"n")][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::eta[@xml:id="id4"][preceding-sibling::*[position() = 1]]/alpha[@object][@xml:id="id5"][not(preceding-sibling::*)]//chi[starts-with(concat(@delete,"-"),"this-")][@xml:lang="no-nb"][@xml:id="id6"][following-sibling::eta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[starts-with(@content,"fa")][@xml:lang="en"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::kappa[@xml:lang="en-US"][@xml:id="id8"]/chi[@xml:id="id9"][not(child::node())][following-sibling::alpha[not(child::node())][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id10"][not(following-sibling::kappa)][not(child::node())][following-sibling::delta[@attr][@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="no-nb"> <zeta attr="solid 1px green" xml:lang="no"> @@ -16449,6 +19259,11 @@ </test> <test> <xpath>//tau[@xml:lang="en-US"][@xml:id="id1"]//xi[@object="true"][@xml:id="id2"][not(preceding-sibling::*)]/alpha[contains(@false,"fa")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[contains(@class,"value")][@xml:lang="no"][preceding-sibling::*[position() = 1]]/theta[starts-with(@number,"12345678")][@xml:lang="en-US"][following-sibling::upsilon[contains(@object,"e")][@xml:id="id3"]//theta[not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:id="id4"][not(following-sibling::*)]//upsilon[starts-with(concat(@insert,"-"),"this.nodeValue-")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::tau[contains(@content,"is-is-att")][@xml:id="id5"]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="en-US" xml:id="id1"> <xi object="true" xml:id="id2"> @@ -16471,6 +19286,11 @@ </test> <test> <xpath>//alpha//nu[starts-with(concat(@string,"-"),"_blank-")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::nu)]/rho[starts-with(@content,"conten")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/pi[@data][@xml:lang="nb"][not(child::node())][following-sibling::theta[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]//beta[@xml:id="id5"][following-sibling::gamma[contains(concat(@and,"$"),"nt$")][@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]/nu[@xml:lang="en"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <alpha> <nu string="_blank" xml:id="id1"> @@ -16492,6 +19312,11 @@ </test> <test> <xpath>//eta[@xml:lang="en"]//sigma[@or][@xml:lang="no"][not(following-sibling::*)]//delta[contains(concat(@data,"$"),"tent$")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::pi[starts-with(concat(@false,"-"),"attribute-")][following-sibling::*[position()=2]][following-sibling::omega[preceding-sibling::*[position() = 3]][following-sibling::epsilon[contains(concat(@attrib,"$"),"this.nodeValue$")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//rho[@number="100%"][not(preceding-sibling::*)][following-sibling::mu[@attr][@xml:id="id4"][preceding-sibling::*[position() = 1]]//iota[@xml:id="id5"][not(following-sibling::*)]//epsilon[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:lang="nb"][not(following-sibling::*)]/phi[@attr][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="en"> <sigma or="_blank" xml:lang="no"> @@ -16519,6 +19344,11 @@ </test> <test> <xpath>//lambda[@src="solid 1px green"][@xml:id="id1"]//eta[@xml:id="id2"][not(preceding-sibling::*)]//omega[@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[contains(concat(@or,"$"),"_blank$")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::sigma[@xml:id="id4"][preceding-sibling::*[position() = 2]]/zeta[@attrib][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <lambda src="solid 1px green" xml:id="id1"> <eta xml:id="id2"> @@ -16535,6 +19365,11 @@ </test> <test> <xpath>//sigma//kappa[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)]//phi[contains(concat(@insert,"$"),"lid 1px green$")][@xml:lang="no-nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::beta[@or][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::omicron[@attrib="content"][@xml:id="id4"][following-sibling::nu//gamma[@xml:lang="en-US"][not(preceding-sibling::*)]//kappa[starts-with(@data,"attribut")][@xml:lang="no"][not(following-sibling::*)][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <sigma> <kappa xml:lang="en-US" xml:id="id1"> @@ -16558,6 +19393,11 @@ </test> <test> <xpath>//upsilon[@and="another attribute value"][@xml:lang="no"][@xml:id="id1"]/lambda[@src][@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]//xi[@string][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[contains(concat(@class,"$"),"olid 1px green$")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=5]][following-sibling::upsilon[@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::kappa[@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::upsilon[@xml:lang="en"][@xml:id="id7"][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@xml:lang="no-nb"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//omega[contains(@attribute,"e")][@xml:lang="en-GB"]/upsilon[@xml:id="id8"][not(preceding-sibling::*)]/nu[starts-with(concat(@attrib,"-"),"solid 1px green-")][@xml:lang="no"][following-sibling::iota//sigma[@xml:id="id9"][following-sibling::nu[@xml:lang="en-GB"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <upsilon and="another attribute value" xml:lang="no" xml:id="id1"> <lambda src="attribute-value" xml:lang="en-US" xml:id="id2"> @@ -16587,6 +19427,11 @@ </test> <test> <xpath>//eta//epsilon[@and="123456789"][@xml:id="id1"]/chi[@delete][@xml:id="id2"][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[starts-with(concat(@attrib,"-"),"123456789-")][not(preceding-sibling::*)]/iota[contains(concat(@delete,"$"),"e$")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@xml:id="id5"][preceding-sibling::*[position() = 1]]//eta[@name][@xml:id="id6"][not(preceding-sibling::*)]//zeta[starts-with(concat(@desciption,"-"),"_blank-")][@xml:id="id7"]//gamma[@attrib][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@and="true"][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]]//phi/chi[starts-with(@content,"a")][@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@attrib][@xml:id="id10"][following-sibling::upsilon[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/nu[contains(@token,"e ")][@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@object="solid 1px green"][@xml:lang="en"][@xml:id="id12"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[contains(@string,"ute value")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/*[@xml:lang="en-US"][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <eta> <epsilon and="123456789" xml:id="id1"> @@ -16630,6 +19475,11 @@ </test> <test> <xpath>//nu[@data]//beta[starts-with(@title,"attribute v")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::iota[following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[@att="attribute value"][following-sibling::iota[@attribute][not(following-sibling::*)]/upsilon[starts-with(@attr,"t")][@xml:id="id1"][not(preceding-sibling::*)]//theta[contains(@title,"10")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[starts-with(concat(@title,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]/theta[contains(concat(@abort,"$"),"e$")][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@true][not(child::node())][following-sibling::beta[contains(@delete,"ue")][@xml:lang="no"]//lambda[@xml:id="id4"][not(following-sibling::*)]/xi[@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]/lambda[@true][not(following-sibling::*)]/pi[not(following-sibling::pi)]//sigma[starts-with(@object,"attribute valu")][@xml:lang="no-nb"][not(preceding-sibling::*)]/tau[@xml:lang="no-nb"][not(following-sibling::*)]//psi[@true="true"][@xml:lang="en"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <nu data="attribute-value"> <beta title="attribute value" xml:lang="no-nb"/> @@ -16667,6 +19517,11 @@ </test> <test> <xpath>//nu[@title="this-is-att-value"][@xml:id="id1"]//beta[@abort="123456789"][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::phi[@xml:lang="no"]/upsilon[contains(@class,"fal")][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]//gamma[@xml:lang="en-US"][not(following-sibling::*)]/iota[@xml:id="id3"][not(child::node())][following-sibling::beta[@class][@xml:lang="nb"][following-sibling::theta[not(following-sibling::*)]/theta[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]//psi[@xml:id="id5"]/upsilon[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::zeta[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::phi[starts-with(@true,"solid ")][@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[starts-with(concat(@src,"-"),"attribute value-")][not(following-sibling::*)]//zeta[contains(concat(@insert,"$"),"e$")][not(preceding-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <nu title="this-is-att-value" xml:id="id1"> <beta abort="123456789" xml:lang="no-nb"/> @@ -16697,6 +19552,11 @@ </test> <test> <xpath>//gamma[contains(concat(@delete,"$"),"%$")][@xml:id="id1"]//alpha[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::delta[contains(concat(@attribute,"$"),"attribute$")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//tau[contains(concat(@string,"$"),"alue$")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@and][@xml:id="id5"][not(preceding-sibling::*)]/phi[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[contains(concat(@data,"$"),"e$")][not(child::node())][following-sibling::upsilon[starts-with(@title,"attribute va")][@xml:lang="nb"][not(following-sibling::*)]//nu[starts-with(concat(@or,"-"),"false-")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 2]]/epsilon[contains(concat(@src,"$"),"attribute$")][@xml:id="id8"][following-sibling::pi[contains(concat(@src,"$"),"alue$")][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::gamma[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::epsilon[@xml:lang="en-US"][preceding-sibling::*[position() = 4]]//delta[starts-with(concat(@content,"-"),"100%-")][@xml:lang="en"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::omega[contains(concat(@false,"$"),"e$")][@xml:id="id12"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="en-US"][@xml:id="id13"][preceding-sibling::*[position() = 2]][following-sibling::gamma[contains(concat(@number,"$"),"789$")][@xml:lang="nb"][@xml:id="id14"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//kappa[starts-with(@src,"attribute va")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[contains(concat(@att,"$"),"eValue$")][@xml:id="id15"][preceding-sibling::*[position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <gamma delete="100%" xml:id="id1"> <alpha xml:lang="no-nb" xml:id="id2"/> @@ -16734,6 +19594,11 @@ </test> <test> <xpath>//lambda[starts-with(concat(@att,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id1"]//rho[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[contains(@abort,"e")][not(following-sibling::*)]//delta[starts-with(concat(@desciption,"-"),"this.nodeValue-")][not(preceding-sibling::*)]/phi[@token][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@class,"$"),"789$")][@xml:id="id3"][not(child::node())][following-sibling::pi[contains(concat(@class,"$"),"e$")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/kappa[not(child::node())][following-sibling::eta[@xml:id="id4"][preceding-sibling::*[position() = 1]]/psi[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[contains(concat(@class,"$"),"e$")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[not(preceding-sibling::*)][not(child::node())][following-sibling::nu[contains(concat(@attribute,"$"),"tribute-value$")][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[@xml:id="id7"]/gamma[contains(concat(@att,"$"),"6789$")][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@true="100%"][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)]/omicron[not(preceding-sibling::*)]/sigma[@desciption="attribute"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::sigma[@content="content"][@xml:id="id11"][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//iota[@src][@xml:lang="en-GB"][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/kappa[@true][@xml:id="id12"][not(following-sibling::*)]/delta[@name][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <lambda att="attribute" xml:lang="en-US" xml:id="id1"> <rho xml:lang="nb" xml:id="id2"/> @@ -16779,6 +19644,11 @@ </test> <test> <xpath>//lambda[@name][@xml:id="id1"]//omega[@xml:lang="no-nb"][following-sibling::psi[contains(@delete,"r attr")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@attribute][@xml:id="id2"][preceding-sibling::*[position() = 2]]/zeta[starts-with(concat(@number,"-"),"false-")][@xml:lang="en"][not(following-sibling::*)]/beta[starts-with(@abort,"100")][not(following-sibling::beta)]//chi[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::omega[following-sibling::iota[contains(@string,"lse")][@xml:lang="en"][@xml:id="id4"]/phi[@xml:id="id5"][not(following-sibling::*)]//gamma[@xml:lang="en-US"][@xml:id="id6"][following-sibling::alpha[@xml:lang="en-GB"][not(child::node())][following-sibling::psi[@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[starts-with(concat(@number,"-"),"attribute-")][@xml:id="id8"]//omicron[contains(@true,"e")][@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::omicron)]/mu[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omicron[contains(@desciption,"6789")][preceding-sibling::*[position() = 1]][following-sibling::kappa[@xml:id="id10"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/tau[starts-with(concat(@or,"-"),"attribute-")][@xml:lang="en-US"][not(child::node())][following-sibling::beta[position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <lambda name="attribute-value" xml:id="id1"> <omega xml:lang="no-nb"/> @@ -16815,6 +19685,11 @@ </test> <test> <xpath>//lambda[@xml:id="id1"]/beta[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::zeta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@att][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::rho[@name][@xml:id="id5"][preceding-sibling::*[position() = 3]]//pi[@xml:id="id6"]/gamma[starts-with(concat(@false,"-"),"attribute-")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[starts-with(@abort,"_bl")][@xml:lang="en"][@xml:id="id7"][following-sibling::gamma[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omega[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[starts-with(@title,"solid 1px ")][@xml:id="id9"]//zeta[not(child::node())][following-sibling::zeta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[starts-with(@abort,"this")][@xml:lang="no-nb"][following-sibling::*[position()=3]][following-sibling::eta[@attr="attribute"][preceding-sibling::*[position() = 3]][following-sibling::epsilon[preceding-sibling::*[position() = 4]][following-sibling::gamma[@desciption][@xml:lang="no"][preceding-sibling::*[position() = 5]][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <lambda xml:id="id1"> <beta attr="attribute" xml:lang="nb" xml:id="id2"/> @@ -16847,6 +19722,11 @@ </test> <test> <xpath>//tau[starts-with(concat(@desciption,"-"),"100%-")][@xml:lang="no"]/phi[@xml:lang="en"][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id1"][following-sibling::sigma[starts-with(concat(@or,"-"),"true-")][@xml:lang="en"][@xml:id="id2"]/pi[@insert="123456789"][@xml:lang="no-nb"][not(following-sibling::*)]//pi[@att][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::zeta[preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:lang="en"][preceding-sibling::*[position() = 2]]/lambda[@name][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <tau desciption="100%" xml:lang="no"> <phi xml:lang="en"/> @@ -16867,6 +19747,11 @@ </test> <test> <xpath>//phi//delta[starts-with(@data,"_bl")][not(preceding-sibling::*)][not(following-sibling::*)]/phi[contains(concat(@class,"$"),"id 1px green$")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[starts-with(@class,"fa")][@xml:id="id2"][not(following-sibling::*)]//beta[contains(concat(@class,"$"),"ribute$")][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[starts-with(concat(@insert,"-"),"true-")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="nb"][not(child::node())][following-sibling::theta[@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/chi[starts-with(@number,"10")][@xml:lang="en"][not(preceding-sibling::*)]//delta[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[starts-with(concat(@title,"-"),"true-")][@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)]/nu[contains(concat(@data,"$"),"odeValue$")][@xml:lang="no-nb"][not(following-sibling::*)]/upsilon[@xml:lang="en-US"]/phi[contains(@title,"odeV")][@xml:id="id7"][not(preceding-sibling::*)]//phi[starts-with(concat(@delete,"-"),"content-")][not(preceding-sibling::*)]/omega[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:lang="no"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::eta[@xml:lang="en-US"][preceding-sibling::*[position() = 2]]/mu[@xml:id="id9"]/gamma[contains(concat(@att,"$"),"ank$")][@xml:id="id10"][not(following-sibling::*)]//sigma[@attrib][@xml:id="id11"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(@content,"tr")][@xml:lang="en"][not(following-sibling::*)]//chi[@xml:lang="en"][not(preceding-sibling::*)][not(preceding-sibling::chi)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <phi> <delta data="_blank"> @@ -16913,6 +19798,11 @@ </test> <test> <xpath>//gamma[@and][@xml:lang="en-US"][@xml:id="id1"]//delta[@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa[@xml:lang="en"][not(following-sibling::*)]/delta[contains(@data,"is.no")][@xml:id="id3"][not(preceding-sibling::*)]/eta[starts-with(@name,"this.node")][@xml:id="id4"]//*[starts-with(concat(@content,"-"),"this.nodeValue-")][not(following-sibling::*)]/rho[@string="solid 1px green"][@xml:lang="en-US"][following-sibling::*[position()=1]][not(preceding-sibling::rho)][following-sibling::epsilon[contains(@token,"attribute")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[@xml:lang="en-US"][not(preceding-sibling::*)]//sigma[@abort][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <gamma and="this.nodeValue" xml:lang="en-US" xml:id="id1"> <delta xml:lang="en" xml:id="id2"/> @@ -16937,6 +19827,11 @@ </test> <test> <xpath>//theta[@or][@xml:lang="nb"]//lambda[@src][@xml:id="id1"]/omega[contains(concat(@abort,"$"),"olid 1px green$")][@xml:lang="en"]/epsilon[not(preceding-sibling::*)][following-sibling::omega[contains(concat(@class,"$"),"ute-value$")][preceding-sibling::*[position() = 1]][following-sibling::iota[@xml:id="id2"][not(following-sibling::*)]/rho[@xml:lang="no-nb"][not(preceding-sibling::*)][not(preceding-sibling::rho)]/tau[@true][following-sibling::beta[not(child::node())][following-sibling::iota[starts-with(concat(@object,"-"),"100%-")][@xml:lang="no"][not(following-sibling::*)]//nu[@attrib][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::iota//omicron[@title][not(following-sibling::*)]//*[@xml:id="id4"][not(preceding-sibling::*)][not(preceding-sibling::any)]//psi[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::zeta[preceding-sibling::*[position() = 1]]/mu[@string][@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)]/rho[@xml:id="id7"][not(child::node())][following-sibling::*[not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <theta or="another attribute value" xml:lang="nb"> <lambda src="100%" xml:id="id1"> @@ -16975,6 +19870,11 @@ </test> <test> <xpath>//beta[@xml:lang="no"][@xml:id="id1"]//iota[contains(@true,"eVal")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::tau[@or][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::zeta[@token][@xml:lang="no"][following-sibling::upsilon[@false][@xml:id="id3"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//pi[@xml:id="id4"][not(preceding-sibling::*)][not(preceding-sibling::pi)]//phi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::lambda[@xml:id="id5"][preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no" xml:id="id1"> <iota true="this.nodeValue" xml:lang="nb"/> @@ -16994,6 +19894,11 @@ </test> <test> <xpath>//zeta[@xml:lang="en-US"]//psi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@token][@xml:lang="en-US"][not(following-sibling::*)]/rho[not(preceding-sibling::rho)][following-sibling::epsilon[@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omicron[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[contains(concat(@and,"$"),"ntent$")][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@xml:lang="no-nb"]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <zeta xml:lang="en-US"> <psi xml:lang="no-nb"> @@ -17014,6 +19919,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="nb"]/delta[not(child::node())][following-sibling::gamma[contains(@attr,"tt")][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/pi[contains(concat(@delete,"$"),"te$")][@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]/kappa[contains(@string,"t")][@xml:id="id4"][not(following-sibling::kappa)]/chi[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="nb"][@xml:id="id6"]/chi[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[@att][@xml:lang="en"][not(preceding-sibling::psi or following-sibling::psi)][not(child::node())][following-sibling::upsilon[starts-with(concat(@title,"-"),"this-")][@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::*[@number="solid 1px green"][@xml:lang="no-nb"][@xml:id="id9"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::kappa[@name][preceding-sibling::*[position() = 3]][following-sibling::alpha[@content="attribute value"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//omega[contains(concat(@attribute,"$"),"ibute$")][@xml:lang="en-US"][@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@object][@xml:lang="en-US"][@xml:id="id11"][preceding-sibling::*[position() = 1]]/sigma[@xml:lang="en-US"][@xml:id="id12"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::epsilon[@abort]//*[contains(concat(@or,"$"),"blank$")][@xml:lang="no-nb"][@xml:id="id13"][not(preceding-sibling::*)][following-sibling::kappa[@xml:lang="nb"][@xml:id="id14"][not(child::node())][following-sibling::beta[@att][@xml:lang="en-US"][@xml:id="id15"][following-sibling::tau[@xml:lang="no-nb"][@xml:id="id16"][preceding-sibling::*[position() = 3]][following-sibling::omega[@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="nb"> <delta/> @@ -17054,6 +19964,11 @@ </test> <test> <xpath>//rho[starts-with(@attrib,"a")][@xml:lang="no"]/tau[contains(@attr,"se")][not(child::node())][following-sibling::kappa[@xml:id="id1"]//pi[starts-with(@false,"this-is-att-valu")]/rho[not(following-sibling::*)]//eta[@attrib="attribute value"][not(preceding-sibling::*)][following-sibling::psi[@number="attribute value"][@xml:lang="en-US"][not(following-sibling::*)]//epsilon[@data="attribute"][@xml:lang="en-US"][@xml:id="id2"][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 1]]//theta[@att="100%"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="no-nb"][@xml:id="id4"]/omicron[not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[contains(@insert,"ibute")][preceding-sibling::*[position() = 1]]/omicron[contains(concat(@and,"$"),"e$")][@xml:lang="no-nb"][not(child::node())][following-sibling::*[starts-with(@attribute,"t")]/tau[starts-with(concat(@object,"-"),"attribute-")][@xml:lang="no-nb"][not(child::node())][following-sibling::psi[@xml:lang="en-US"][following-sibling::kappa[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//gamma[not(following-sibling::*)]//phi[@xml:lang="en-GB"][@xml:id="id5"]//upsilon[starts-with(@attr,"10")][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::eta[preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:id="id7"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <rho attrib="attribute" xml:lang="no"> <tau attr="false"/> @@ -17097,6 +20012,11 @@ </test> <test> <xpath>//omicron[@xml:lang="no-nb"]/rho[@xml:lang="en-US"][not(preceding-sibling::*)]/omega[@xml:lang="en-US"][@xml:id="id1"][following-sibling::theta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@xml:lang="no"][@xml:id="id3"][following-sibling::theta[not(following-sibling::*)]/omega[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[starts-with(@abort,"attribute-valu")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::pi[starts-with(@att,"_")][@xml:id="id4"][following-sibling::xi[starts-with(@number,"at")][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::iota[@data="attribute value"][@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="en-GB"][not(following-sibling::*)]//mu[following-sibling::gamma[starts-with(concat(@insert,"-"),"attribute-")][@xml:lang="no-nb"]/nu[@xml:id="id6"][not(preceding-sibling::*)]//kappa[@delete="_blank"][@xml:lang="nb"][@xml:id="id7"]/iota[@false][@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::gamma[contains(concat(@attr,"$"),"lank$")][following-sibling::phi[@xml:id="id9"][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="no-nb"> <rho xml:lang="en-US"> @@ -17131,6 +20051,11 @@ </test> <test> <xpath>//mu[@insert][@xml:lang="en-US"]/kappa[@xml:lang="en-GB"][not(following-sibling::*)]/beta[@attr][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@delete="this-is-att-value"][@xml:id="id1"][preceding-sibling::*[position() = 1]]/zeta[contains(@or,"th")][@xml:id="id2"][not(following-sibling::*)]//gamma[@token][@xml:id="id3"][not(following-sibling::*)]/beta[@token][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::gamma[@name="attribute-value"][@xml:id="id4"][not(child::node())][following-sibling::delta[@false][@xml:lang="no-nb"][not(child::node())][following-sibling::phi[contains(@src,"tribute valu")][@xml:id="id5"][not(following-sibling::*)]/zeta[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[following-sibling::upsilon[@attr][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//mu[starts-with(concat(@attr,"-"),"123456789-")][@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <mu insert="100%" xml:lang="en-US"> <kappa xml:lang="en-GB"> @@ -17161,6 +20086,11 @@ </test> <test> <xpath>//rho[contains(concat(@false,"$"),"e$")][@xml:id="id1"]/epsilon[@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]//beta[@false="123456789"][@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/kappa//sigma[not(child::node())][following-sibling::nu[contains(@abort,"0%")][preceding-sibling::*[position() = 1]]/delta[@xml:id="id4"][not(following-sibling::*)]//upsilon[contains(concat(@attribute,"$"),"nt$")][@xml:lang="en-US"][not(preceding-sibling::*)]//delta[@xml:lang="nb"][following-sibling::*[starts-with(concat(@string,"-"),"solid 1px green-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[@insert][@xml:id="id5"]//iota[@false][@xml:lang="no"][following-sibling::xi[contains(concat(@string,"$"),"nk$")][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[contains(concat(@true,"$")," green$")][@xml:lang="no-nb"][@xml:id="id7"][not(child::node())][following-sibling::rho[@string][@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][following-sibling::xi[preceding-sibling::*[position() = 4]]//psi[not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::psi)]/omicron[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::chi[starts-with(@abort,"another attribute valu")][@xml:lang="en"][not(following-sibling::*)]/kappa[@attribute][@xml:lang="nb"][@xml:id="id9"][not(child::node())][following-sibling::beta[@name][@xml:lang="en-GB"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[@xml:id="id11"]/lambda[@attr][@xml:lang="no"][@xml:id="id12"][not(preceding-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <rho false="false" xml:id="id1"> <epsilon xml:lang="en" xml:id="id2"> @@ -17204,6 +20134,11 @@ </test> <test> <xpath>//xi[@abort="attribute value"][@xml:id="id1"]/xi[@and][following-sibling::*[position()=1]][following-sibling::omega[@attrib][@xml:lang="en"][@xml:id="id2"]//omega[@attr][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[contains(@number,"is-att-value")][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 1]][following-sibling::gamma[starts-with(concat(@attrib,"-"),"another attribute value-")]/omega[@xml:lang="en-US"][following-sibling::tau[contains(@desciption,"attribute-value")][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[@insert][@xml:id="id4"][not(following-sibling::*)]/pi[@name="this-is-att-value"][@xml:id="id5"][not(following-sibling::*)]//kappa[contains(concat(@src,"$"),"is-att-value$")][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[contains(@src,"%")][@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]//zeta[@xml:id="id7"]//nu[starts-with(@attr,"fal")][@xml:lang="no"][@xml:id="id8"][not(following-sibling::*)]/omega[starts-with(concat(@delete,"-"),"attribute value-")][@xml:lang="nb"]//epsilon[@xml:lang="en-GB"][not(preceding-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>1</nth> + </result> <tree> <xi abort="attribute value" xml:id="id1"> <xi and="100%"/> @@ -17240,6 +20175,11 @@ </test> <test> <xpath>//delta[starts-with(@delete,"this.n")][@xml:lang="en"]//eta[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::zeta[following-sibling::zeta[contains(concat(@insert,"$"),"tribute-value$")][@xml:lang="en-GB"][@xml:id="id2"]//xi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@attr][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][not(child::node())][following-sibling::lambda[starts-with(@number,"10")][@xml:id="id3"][following-sibling::*[position()=4]][following-sibling::gamma[@class="content"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::kappa[contains(concat(@token,"$"),"bute-value$")][preceding-sibling::*[position() = 4]][following-sibling::*[position()=2]][following-sibling::theta[@title="attribute-value"][@xml:lang="nb"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::zeta[@delete]/sigma[starts-with(concat(@object,"-"),"123456789-")][not(preceding-sibling::*)][following-sibling::beta[contains(@att,"this-is-att-")][not(following-sibling::*)]/*[starts-with(concat(@content,"-"),"false-")][@xml:lang="no-nb"][not(child::node())][following-sibling::tau[@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::omicron[contains(concat(@false,"$"),"23456789$")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <delta delete="this.nodeValue" xml:lang="en"> <eta xml:lang="en" xml:id="id1"/> @@ -17267,6 +20207,11 @@ </test> <test> <xpath>//omega[starts-with(@and,"123456")][@xml:lang="en-US"]//alpha[@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]//sigma[@token="attribute value"][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="no"][following-sibling::*[position()=3]][not(child::node())][following-sibling::beta[@and="another attribute value"][@xml:id="id3"][following-sibling::psi[@attribute][@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::epsilon[contains(concat(@object,"$"),"lank$")][@xml:lang="no"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/psi[@xml:lang="en-GB"][@xml:id="id5"]/theta[@xml:lang="no-nb"][not(preceding-sibling::*)]/eta[contains(@attribute,"id 1px green")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::nu[@or][@xml:id="id6"][not(child::node())][following-sibling::nu[following-sibling::*[position()=2]][following-sibling::omicron[@xml:lang="no"][following-sibling::pi[@xml:lang="en"]/chi[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//*[@xml:lang="en-GB"][following-sibling::alpha[@xml:id="id8"][preceding-sibling::*[position() = 1]]//omicron[@content][not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 2]]//*[contains(@title,"tribute val")][@xml:lang="en-US"][not(following-sibling::*)]//delta[@xml:id="id9"][not(preceding-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <omega and="123456789" xml:lang="en-US"> <alpha xml:lang="en-GB" xml:id="id1"> @@ -17306,6 +20251,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]/kappa[@xml:lang="nb"][@xml:id="id2"][following-sibling::xi//theta[@src][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::mu[contains(@att,"blan")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::pi[contains(@or,"r attribute va")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//gamma[contains(@delete,"nodeValue")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::pi[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[following-sibling::kappa[contains(@src,"tent")][@xml:id="id6"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <kappa xml:lang="nb" xml:id="id2"/> @@ -17327,6 +20277,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]/omega[starts-with(concat(@attrib,"-"),"true-")][@xml:id="id2"][not(preceding-sibling::*)]/gamma[not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:id="id3"][preceding-sibling::*[position() = 1]]//chi[@xml:lang="en"][not(child::node())][following-sibling::xi[@desciption][@xml:lang="no"][following-sibling::rho[@xml:id="id4"]//beta[not(preceding-sibling::*)][following-sibling::epsilon[@class][@xml:id="id5"][not(following-sibling::*)]//xi[@data][@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)]/omicron[@xml:id="id7"][following-sibling::beta[@data][@xml:id="id8"][not(following-sibling::*)]/alpha[starts-with(@insert,"cont")]//chi[contains(concat(@or,"$"),"n$")][not(preceding-sibling::chi)][not(child::node())][following-sibling::lambda[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@xml:id="id9"][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id10"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::iota[@xml:lang="no"][@xml:id="id11"][following-sibling::iota[@xml:lang="en-GB"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]/kappa[@xml:lang="no"][@xml:id="id12"][following-sibling::mu[starts-with(concat(@delete,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id13"][not(following-sibling::*)]]][position() = 1]]]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <iota xml:id="id1"> <omega attrib="true" xml:id="id2"> @@ -17364,6 +20319,11 @@ </test> <test> <xpath>//nu/mu[contains(@true,"tribute")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[starts-with(concat(@attr,"-"),"attribute value-")][@xml:lang="no-nb"][not(child::node())][following-sibling::tau[starts-with(@object,"content")][not(following-sibling::*)]/nu[@name][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::epsilon[starts-with(@attrib,"this.n")][@xml:id="id2"][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <nu> <mu true="attribute" xml:lang="en-US"> @@ -17380,6 +20340,11 @@ </test> <test> <xpath>//kappa[@src][@xml:lang="no-nb"]/upsilon[@xml:lang="nb"]//xi[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@src][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/beta[not(child::node())][following-sibling::nu[@object][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::nu/nu[@desciption][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::beta[@xml:lang="en-GB"][@xml:id="id4"]/omicron[@data][not(following-sibling::*)]/gamma[@xml:lang="no-nb"][not(preceding-sibling::*)]/zeta[@att][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@number="another attribute value"][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::epsilon[following-sibling::*[contains(concat(@true,"$"),"r attribute value$")][@xml:id="id5"][not(following-sibling::*)]]]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <kappa src="true" xml:lang="no-nb"> <upsilon xml:lang="nb"> @@ -17410,6 +20375,11 @@ </test> <test> <xpath>//epsilon[starts-with(@data,"cont")][@xml:lang="nb"][@xml:id="id1"]//*[@xml:lang="en-GB"][following-sibling::rho[@xml:lang="en-GB"][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::epsilon[@xml:id="id2"][not(following-sibling::*)]/theta[starts-with(@object,"solid ")][@xml:id="id3"][not(preceding-sibling::*)]//rho[starts-with(@att,"this-is-att-val")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::nu[@xml:id="id5"]//xi[@xml:id="id6"][not(following-sibling::*)]//phi[contains(@content,"e")][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@src="false"][@xml:id="id7"][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@xml:lang="nb"][@xml:id="id8"][following-sibling::sigma[starts-with(concat(@false,"-"),"content-")][@xml:id="id9"][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <epsilon data="content" xml:lang="nb" xml:id="id1"> <any xml:lang="en-GB"/> @@ -17435,6 +20405,11 @@ </test> <test> <xpath>//omicron[@src][@xml:id="id1"]//epsilon[@xml:id="id2"][not(following-sibling::*)]//sigma[starts-with(concat(@attribute,"-"),"123456789-")][following-sibling::*[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:id="id4"][preceding-sibling::*[position() = 3]]//pi[@data]//alpha[@xml:id="id5"][not(child::node())][following-sibling::chi[following-sibling::omicron[preceding-sibling::*[position() = 2]][not(following-sibling::*)]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <omicron src="content" xml:id="id1"> <epsilon xml:id="id2"> @@ -17459,6 +20434,11 @@ </test> <test> <xpath>//tau[@xml:id="id1"]/theta[starts-with(concat(@delete,"-"),"_blank-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[contains(@true,"%")][preceding-sibling::*[position() = 1]]//lambda[@xml:lang="nb"][not(preceding-sibling::*)]//zeta[starts-with(concat(@and,"-"),"another attribute value-")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::kappa[@class="attribute-value"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::omicron[@class="attribute-value"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/phi[@insert][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)]//phi[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[contains(@title,"ttribute")][@xml:lang="en"][not(child::node())][following-sibling::xi[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//tau[following-sibling::kappa[@xml:id="id6"][preceding-sibling::*[position() = 1]]//mu[starts-with(concat(@abort,"-"),"attribute-")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[contains(@delete,"lid ")][@xml:id="id7"][not(preceding-sibling::*)]//nu[@xml:id="id8"][not(preceding-sibling::*)][following-sibling::rho[@xml:lang="nb"][@xml:id="id9"]/zeta[@desciption][@xml:id="id10"]//omicron[@title][@xml:lang="no-nb"][@xml:id="id11"][following-sibling::eta[contains(@string,"solid 1")][@xml:lang="no"][@xml:id="id12"]/iota[starts-with(concat(@token,"-"),"attribute value-")][not(child::node())][following-sibling::gamma[starts-with(concat(@object,"-"),"true-")][@xml:lang="en-GB"][@xml:id="id13"][not(following-sibling::*)]/lambda[contains(@attr,"ent")][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <tau xml:id="id1"> <theta delete="_blank" xml:lang="en-GB"/> @@ -17503,6 +20483,11 @@ </test> <test> <xpath>//zeta[@delete="attribute value"][@xml:lang="en"]//mu[@xml:lang="en"][not(child::node())][following-sibling::omicron[contains(@token,"e")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::eta[@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)]//rho[@xml:lang="no-nb"][@xml:id="id2"][not(child::node())][following-sibling::beta[@xml:id="id3"][following-sibling::*[starts-with(concat(@object,"-"),"this-")][@xml:lang="no-nb"][following-sibling::beta[@xml:id="id4"][following-sibling::*[position()=2]][preceding-sibling::beta[1]][not(child::node())][following-sibling::mu[@and="attribute-value"][@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::sigma[@xml:id="id6"][preceding-sibling::*[position() = 5]]/kappa[starts-with(concat(@attr,"-"),"this-")][@xml:lang="en-US"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@name="123456789"][@xml:id="id8"][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <zeta delete="attribute value" xml:lang="en"> <mu xml:lang="en"/> @@ -17525,6 +20510,11 @@ </test> <test> <xpath>//delta[@xml:lang="en"][@xml:id="id1"]//xi[@xml:id="id2"][not(following-sibling::*)]/tau[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[not(child::node())][following-sibling::zeta[@class][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::rho[not(following-sibling::*)]//xi[@class][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="nb"][@xml:id="id5"][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][following-sibling::tau[@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][not(preceding-sibling::tau or following-sibling::tau)]//delta[contains(@number,"er at")][@xml:lang="en-US"][@xml:id="id6"][not(child::node())][following-sibling::epsilon[@xml:id="id7"]//tau[starts-with(@attrib,"tr")][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[contains(concat(@string,"$"),"alue$")][@xml:id="id9"][not(following-sibling::*)]//upsilon[@xml:lang="no-nb"][@xml:id="id10"]//epsilon[starts-with(@name,"attribute val")][@xml:id="id11"][following-sibling::nu[@xml:lang="nb"][@xml:id="id12"][preceding-sibling::*[position() = 1]]/psi[not(following-sibling::*)]/alpha[starts-with(@att,"attribut")][not(following-sibling::*)]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en" xml:id="id1"> <xi xml:id="id2"> @@ -17561,6 +20551,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en-GB"]/zeta[contains(@title,"s")][@xml:lang="nb"][@xml:id="id1"][not(following-sibling::*)]//chi[@attrib][not(preceding-sibling::*)][following-sibling::nu[@xml:id="id2"]//xi[starts-with(concat(@attribute,"-"),"attribute-")][@xml:lang="nb"]/nu[@number][@xml:id="id3"][not(following-sibling::*)]/nu[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[contains(@src,"tru")][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/sigma[@xml:id="id5"][not(preceding-sibling::*)]//lambda[starts-with(concat(@and,"-"),"_blank-")][not(following-sibling::*)]/mu[not(child::node())][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(preceding-sibling::gamma)][following-sibling::mu[not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::alpha[starts-with(concat(@object,"-"),"true-")][following-sibling::zeta[@xml:lang="no"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//mu[contains(@attrib,"en")][@xml:lang="en-GB"][@xml:id="id7"][not(child::node())][following-sibling::eta[@token][@xml:id="id8"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[contains(concat(@attrib,"$"),"-value$")][preceding-sibling::*[position() = 2]]/gamma[@xml:id="id9"][not(child::node())][following-sibling::iota[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@object][@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en-GB"> <zeta title="false" xml:lang="nb" xml:id="id1"> @@ -17601,6 +20596,11 @@ </test> <test> <xpath>//pi[@xml:lang="en-GB"]/mu[@attrib="attribute"][@xml:lang="en-GB"][not(following-sibling::*)]//iota[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@xml:id="id1"][not(following-sibling::*)]//phi[@class]//pi[@xml:lang="nb"][not(following-sibling::*)]/xi[@and="123456789"][@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::psi[starts-with(@attrib,"fa")][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//sigma[@attribute][@xml:id="id4"][not(child::node())][following-sibling::theta[@true][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::pi[@xml:lang="en-GB"][@xml:id="id6"][not(child::node())][following-sibling::nu[@xml:lang="en"][@xml:id="id7"][not(following-sibling::*)]//sigma[contains(@src,"alue")][@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@data]//lambda[@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::psi[contains(concat(@name,"$"),"ank$")]/tau[contains(@title,"deValue")][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[starts-with(@src,"_bl")][@xml:lang="en"][@xml:id="id12"][preceding-sibling::*[position() = 2]][following-sibling::pi[@abort][@xml:id="id13"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[contains(concat(@token,"$"),"nt$")][preceding-sibling::*[position() = 4]]]][position() = 1]]][position() = 1]][position() = 1]]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="en-GB"> <mu attrib="attribute" xml:lang="en-GB"> @@ -17642,6 +20642,11 @@ </test> <test> <xpath>//*[@or="solid 1px green"][@xml:lang="en-GB"]/eta[starts-with(concat(@token,"-"),"another attribute value-")][@xml:id="id1"][not(preceding-sibling::*)]//sigma[@xml:id="id2"][not(preceding-sibling::*)]/omega//epsilon[contains(concat(@title,"$"),"lank$")]/phi[@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:lang="no-nb"]//chi[@xml:lang="en"][not(preceding-sibling::*)]//rho[contains(concat(@att,"$"),"89$")]/lambda[@object][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <any or="solid 1px green" xml:lang="en-GB"> <eta token="another attribute value" xml:id="id1"> @@ -17669,6 +20674,11 @@ </test> <test> <xpath>//epsilon[contains(concat(@abort,"$"),"100%$")][@xml:id="id1"]/xi[not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[starts-with(@att,"tru")][not(child::node())][following-sibling::lambda[contains(concat(@insert,"$"),"_blank$")][@xml:id="id2"][following-sibling::psi[@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//kappa[@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:lang="en"]/kappa[@xml:id="id5"][not(child::node())][following-sibling::beta[@class][@xml:lang="en-US"][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::upsilon[@false][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::upsilon)][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 3]]//gamma[@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[contains(@true,"0%")][@xml:lang="en-US"][not(child::node())][following-sibling::epsilon[@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@delete="_blank"][not(preceding-sibling::kappa)][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][following-sibling::xi/iota[@xml:lang="en-US"][not(child::node())][following-sibling::epsilon[@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@xml:id="id11"]//alpha[starts-with(@delete,"th")][@xml:lang="en-GB"][@xml:id="id12"][not(preceding-sibling::*)]/xi[not(preceding-sibling::*)]//gamma[starts-with(@or,"tr")][@xml:id="id13"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <epsilon abort="100%" xml:id="id1"> <xi/> @@ -17710,6 +20720,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="no"]/chi[not(child::node())][following-sibling::omicron[@abort][following-sibling::xi[@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::tau[preceding-sibling::*[position() = 3]]//upsilon[contains(concat(@name,"$"),"te value$")][not(following-sibling::*)]//mu[not(child::node())][following-sibling::tau[@data="attribute value"][@xml:id="id1"][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::tau[@name="false"][@xml:lang="en"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][following-sibling::lambda[starts-with(@string,"this.node")][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::gamma[@xml:id="id2"]/epsilon[@xml:id="id3"][not(preceding-sibling::*)]//xi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omega[contains(@string,"ute")][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]//alpha[@class][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//theta[@xml:lang="no"][following-sibling::*[position()=3]][following-sibling::psi[contains(@attribute,"lid 1px green")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[@xml:id="id8"][not(child::node())][following-sibling::nu[starts-with(concat(@class,"-"),"100%-")][@xml:lang="no-nb"][@xml:id="id9"][preceding-sibling::*[position() = 3]]/beta[starts-with(@or,"conte")][@xml:lang="nb"][@xml:id="id10"][not(following-sibling::*)][position() = 1]]]]]]]]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="no"> <chi/> @@ -17748,6 +20763,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]//beta[@insert][@xml:id="id2"][following-sibling::*[position()=3]][not(child::node())][following-sibling::*[following-sibling::lambda[contains(@attr,"alue")][@xml:lang="no"][@xml:id="id3"][not(following-sibling::lambda)][not(child::node())][following-sibling::omega[@xml:lang="no"][@xml:id="id4"]/theta[@xml:id="id5"][not(preceding-sibling::*)]//epsilon[@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)]//theta[@xml:lang="nb"][@xml:id="id7"][following-sibling::gamma[@xml:id="id8"][following-sibling::alpha[contains(concat(@attr,"$"),"ribute value$")][@xml:id="id9"][preceding-sibling::*[position() = 2]][following-sibling::theta[@xml:id="id10"][not(following-sibling::*)][not(following-sibling::theta)]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <beta insert="this-is-att-value" xml:id="id2"/> @@ -17770,6 +20790,11 @@ </test> <test> <xpath>//gamma[@attrib][@xml:id="id1"]//pi[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[not(preceding-sibling::*)][following-sibling::*[preceding-sibling::*[position() = 1]][following-sibling::omega[contains(concat(@data,"$"),"odeValue$")][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/zeta][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <gamma attrib="_blank" xml:id="id1"> <pi token="attribute-value" xml:lang="en"/> @@ -17787,6 +20812,11 @@ </test> <test> <xpath>//rho[starts-with(@attr,"another attribute")][@xml:lang="no-nb"]/theta[@attrib][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::kappa[contains(concat(@true,"$"),"6789$")][@xml:lang="no-nb"][not(child::node())][following-sibling::mu[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::lambda[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::kappa[@delete][@xml:lang="en-GB"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::omicron[starts-with(@abort,"attribu")][@xml:lang="en-US"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::*[@xml:id="id2"]//chi[@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[contains(@abort,"ute")][@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@attrib="123456789"][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 2]]/delta[@attr][@xml:lang="no-nb"][following-sibling::omicron[@xml:lang="en-GB"][not(following-sibling::*)]/pi[not(following-sibling::*)]/xi[following-sibling::tau[starts-with(@or,"at")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]//phi[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:id="id7"][not(child::node())][following-sibling::iota[@xml:lang="nb"][preceding-sibling::*[position() = 2]]/omega[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]]]]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <rho attr="another attribute value" xml:lang="no-nb"> <theta attrib="false" xml:id="id1"/> @@ -17821,6 +20851,11 @@ </test> <test> <xpath>//chi[@xml:lang="en-US"][@xml:id="id1"]/psi[@xml:lang="en-US"][not(preceding-sibling::*)]/kappa[@number][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[starts-with(@delete,"attribute")][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::upsilon[@src][@xml:id="id2"][following-sibling::*[position()=3]][following-sibling::alpha[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[starts-with(@attribute,"12")][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id4"]//tau[@attrib="false"][@xml:lang="no-nb"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="en-US" xml:id="id1"> <psi xml:lang="en-US"> @@ -17841,6 +20876,11 @@ </test> <test> <xpath>//nu[starts-with(@token,"this.no")]//iota[@xml:lang="en"][following-sibling::alpha[@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]]//phi[contains(@attr,"tribu")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::eta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::phi[starts-with(concat(@and,"-"),"another attribute value-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]]//sigma[not(preceding-sibling::*)][not(following-sibling::*)]//pi[@xml:lang="en"][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//tau[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@xml:lang="no-nb"][following-sibling::eta[@attr][@xml:lang="en-GB"][@xml:id="id5"]/tau[starts-with(@attr,"1234567")][@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[contains(@desciption,"co")][@xml:lang="en-GB"][@xml:id="id7"]//eta[not(following-sibling::*)]/gamma[contains(concat(@attribute,"$"),"lse$")][@xml:lang="en-US"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[not(preceding-sibling::*)]/psi[@or][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::nu[@object][@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <nu token="this.nodeValue"> <iota xml:lang="en"/> @@ -17881,6 +20921,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]//eta[contains(concat(@abort,"$"),"lue$")][@xml:id="id2"][not(child::node())][following-sibling::gamma[@number="solid 1px green"][@xml:id="id3"][following-sibling::phi[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="no"][preceding-sibling::*[position() = 2]][following-sibling::eta[preceding-sibling::*[position() = 3]][not(following-sibling::*)]//epsilon[contains(concat(@false,"$"),"ute value$")][not(following-sibling::*)]//eta[contains(concat(@and,"$"),"odeValue$")][@xml:lang="en-GB"][not(following-sibling::*)]//xi[@name][@xml:id="id4"][not(child::node())][following-sibling::sigma[starts-with(concat(@true,"-"),"attribute-")][@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::gamma[not(preceding-sibling::gamma or following-sibling::gamma)]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <iota xml:id="id1"> <eta abort="attribute value" xml:id="id2"/> @@ -17902,6 +20947,11 @@ </test> <test> <xpath>//upsilon[starts-with(concat(@attribute,"-"),"this-")]/tau[not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@src][preceding-sibling::*[position() = 1]][following-sibling::iota[@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 2]][following-sibling::phi[contains(@object,"789")][following-sibling::*[position()=1]][following-sibling::alpha[@xml:id="id2"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//psi[@xml:id="id3"]//epsilon[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]/xi[starts-with(concat(@class,"-"),"attribute value-")][@xml:lang="en-US"][not(preceding-sibling::*)]//epsilon[@xml:lang="en"][not(following-sibling::*)]//epsilon[@xml:lang="no"][not(preceding-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <upsilon attribute="this-is-att-value"> <tau/> @@ -17927,6 +20977,11 @@ </test> <test> <xpath>//alpha[starts-with(concat(@and,"-"),"attribute value-")][@xml:lang="nb"]/zeta[contains(concat(@token,"$"),"this.nodeValue$")][@xml:lang="no"][@xml:id="id1"][following-sibling::iota[@xml:id="id2"][not(following-sibling::*)]//mu[@xml:lang="no"][@xml:id="id3"][not(following-sibling::*)]//tau[@xml:lang="en-US"][@xml:id="id4"]//upsilon[@xml:id="id5"][not(following-sibling::*)]//theta[@attribute][@xml:lang="en-US"][@xml:id="id6"][not(child::node())][following-sibling::upsilon[@abort="another attribute value"][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::upsilon)][not(child::node())][following-sibling::mu[@att="attribute value"][@xml:lang="no"]//tau[starts-with(concat(@string,"-"),"another attribute value-")][@xml:lang="no"][@xml:id="id8"][not(child::node())][following-sibling::rho[@xml:id="id9"]/delta[@xml:lang="en"][not(preceding-sibling::*)]//gamma[not(child::node())][following-sibling::epsilon[@att="this.nodeValue"][@xml:id="id10"][preceding-sibling::*[position() = 1]]/pi[@class="true"][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <alpha and="attribute value" xml:lang="nb"> <zeta token="this.nodeValue" xml:lang="no" xml:id="id1"/> @@ -17958,6 +21013,11 @@ </test> <test> <xpath>//psi/theta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)][not(parent::*/*[position()=2])]/omicron[starts-with(@abort,"attribut")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@desciption="content"][@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::mu[@xml:lang="en-US"][not(following-sibling::*)]//eta[@object][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)]//chi[@xml:id="id2"][following-sibling::lambda[contains(@attribute,"45")][@xml:id="id3"][preceding-sibling::*[position() = 1]]//omega[@attr="100%"][not(preceding-sibling::*)][following-sibling::*[@attr="attribute"][@xml:lang="en"][@xml:id="id4"][not(following-sibling::*)]//rho[contains(concat(@desciption,"$"),"ttribute-value$")][@xml:id="id5"][not(child::node())][following-sibling::iota[@xml:lang="no"][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[@xml:lang="no"][following-sibling::delta[@xml:lang="nb"][@xml:id="id6"][position() = 1]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <psi> <theta xml:lang="en-GB"> @@ -17987,6 +21047,11 @@ </test> <test> <xpath>//eta[contains(concat(@name,"$"),"ank$")]/iota[@number="another attribute value"][not(following-sibling::*)]/rho[@xml:lang="en-GB"][not(following-sibling::*)]//xi[@false][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[@xml:lang="en"]//pi[contains(@desciption,"s-")][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[contains(@desciption,"en")][@xml:lang="en-US"][following-sibling::*[position()=1]][following-sibling::nu[@xml:id="id3"][preceding-sibling::*[position() = 2]]//pi[not(child::node())][following-sibling::eta[not(following-sibling::*)]/xi[@xml:id="id4"]/tau[@xml:lang="nb"][following-sibling::sigma[contains(@att,"e")][@xml:lang="en-GB"][following-sibling::upsilon[@att][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/tau[not(following-sibling::*)]//omicron[starts-with(@data,"_blank")][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::phi)]//epsilon[@or][not(preceding-sibling::*)][following-sibling::tau[@desciption][@xml:id="id8"][preceding-sibling::*[position() = 1]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <eta name="_blank"> <iota number="another attribute value"> @@ -18029,6 +21094,11 @@ </test> <test> <xpath>//tau[@and][@xml:lang="nb"][@xml:id="id1"]/pi[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[starts-with(@attribute,"tru")][@xml:lang="en"][@xml:id="id4"][not(child::node())][following-sibling::kappa[starts-with(concat(@or,"-"),"solid 1px green-")][not(following-sibling::kappa)]/iota[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::gamma[contains(concat(@false,"$"),"value$")][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::*[position()=3]][following-sibling::delta[@xml:lang="nb"][@xml:id="id7"][following-sibling::chi[@xml:lang="no"][@xml:id="id8"][preceding-sibling::*[position() = 3]][following-sibling::theta[@attribute="content"]/lambda[@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@name="this.nodeValue"][@xml:lang="en"][following-sibling::*[position()=3]][following-sibling::kappa[following-sibling::beta[starts-with(concat(@attribute,"-"),"100%-")][@xml:id="id11"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@attrib][@xml:lang="no-nb"][@xml:id="id12"][preceding-sibling::*[position() = 5]][not(following-sibling::*)][position() = 1]][position() = 1]]]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>1</nth> + </result> <tree> <tau and="this-is-att-value" xml:lang="nb" xml:id="id1"> <pi xml:id="id2"> @@ -18057,6 +21127,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]/omega[@attribute][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::chi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::*[preceding-sibling::*[position() = 2]][following-sibling::alpha[@xml:id="id2"][not(child::node())][following-sibling::zeta[@xml:lang="nb"][not(following-sibling::*)]//pi[contains(concat(@false,"$"),"false$")][@xml:lang="en-US"]/alpha[contains(@content,"his.nodeV")][@xml:id="id3"][not(following-sibling::*)]/gamma[@xml:lang="en-US"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::pi[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <omega attribute="100%" xml:lang="no-nb"/> @@ -18078,6 +21153,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="nb"]//pi[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//theta[starts-with(concat(@src,"-"),"content-")][@xml:lang="no"][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::nu[contains(concat(@string,"$"),"ibute value$")][@xml:lang="en-US"][not(following-sibling::*)]//chi[@xml:lang="en-US"]/gamma[not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@xml:lang="nb"][@xml:id="id6"]/iota[@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]/iota[@string="100%"][following-sibling::*[position()=6]][not(child::node())][following-sibling::xi[starts-with(concat(@number,"-"),"false-")][@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(preceding-sibling::xi)][following-sibling::sigma[@and][@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::rho[contains(@attribute,"0")][not(child::node())][following-sibling::kappa[starts-with(@att,"at")][not(child::node())][following-sibling::eta[@false][@xml:lang="en-GB"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::tau[@delete="false"][@xml:lang="en"][not(following-sibling::*)]/nu[@false][@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][not(preceding-sibling::nu or following-sibling::nu)][position() = 1]]][position() = 1]][position() = 1]]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="nb"> <pi xml:id="id1"> @@ -18115,6 +21195,11 @@ </test> <test> <xpath>//beta//omicron[not(child::node())][following-sibling::gamma[@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]//sigma[starts-with(@name,"at")][@xml:lang="no-nb"][following-sibling::*[position()=4]][following-sibling::iota[starts-with(concat(@title,"-"),"solid 1px green-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::iota[contains(@src,"odeValue")][@xml:lang="nb"][preceding-sibling::*[position() = 3]][following-sibling::rho[contains(@data,"eValue")][@xml:id="id2"][not(following-sibling::*)]/kappa[contains(concat(@class,"$"),"alse$")][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::eta[starts-with(@desciption,"attribu")][@xml:id="id4"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <beta> <omicron/> @@ -18135,6 +21220,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]/eta[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[starts-with(concat(@title,"-"),"_blank-")][@xml:lang="en-GB"][following-sibling::mu[@attrib][@xml:id="id3"][following-sibling::mu[@string][not(following-sibling::*)]/lambda[@xml:lang="en-GB"][@xml:id="id4"][following-sibling::phi[contains(@object,"k")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <eta xml:lang="no-nb" xml:id="id2"> @@ -18152,6 +21242,11 @@ </test> <test> <xpath>//chi[@xml:lang="no-nb"]/rho[@xml:lang="no-nb"][following-sibling::*[position()=1]][not(following-sibling::rho)][following-sibling::mu[contains(concat(@insert,"$"),"eValue$")][@xml:lang="no-nb"]//kappa[contains(concat(@false,"$"),"attribute$")][following-sibling::*[position()=2]][following-sibling::sigma[starts-with(concat(@abort,"-"),"attribute-")][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[not(following-sibling::*)]//zeta[@xml:lang="nb"][not(following-sibling::*)]/upsilon[not(child::node())][following-sibling::sigma[starts-with(concat(@delete,"-"),"solid 1px green-")][@xml:lang="en-GB"][@xml:id="id1"][not(child::node())][following-sibling::psi[@desciption][@xml:id="id2"][preceding-sibling::*[position() = 2]]/xi[@string][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::upsilon[@or="attribute value"][@xml:id="id4"]//gamma[starts-with(@title,"this.")][@xml:lang="nb"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="no-nb"> <rho xml:lang="no-nb"/> @@ -18178,6 +21273,11 @@ </test> <test> <xpath>//gamma[contains(concat(@object,"$"),"nodeValue$")][@xml:id="id1"]/phi[contains(@title,"thi")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[contains(@number,"ue")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//alpha[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::eta[@insert][preceding-sibling::*[position() = 1]][following-sibling::rho[@abort][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//beta[@desciption][following-sibling::*[position()=4]][following-sibling::psi[starts-with(concat(@false,"-"),"solid 1px green-")][@xml:id="id5"][following-sibling::zeta[starts-with(concat(@name,"-"),"100%-")][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[@and="content"][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::epsilon[starts-with(@desciption,"this-is-att-value")][@xml:lang="en"][not(following-sibling::*)]/alpha[@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@content][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/theta[contains(concat(@delete,"$"),"false$")][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 1]]/gamma[contains(concat(@true,"$"),"100%$")][@xml:lang="en"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <gamma object="this.nodeValue" xml:id="id1"> <phi title="this.nodeValue" xml:id="id2"/> @@ -18207,6 +21307,11 @@ </test> <test> <xpath>//gamma[contains(concat(@class,"$"),"ue$")][@xml:lang="en"]/psi[@name][@xml:id="id1"][not(preceding-sibling::*)]/mu[not(preceding-sibling::*)][not(following-sibling::*)]//psi[starts-with(concat(@attribute,"-"),"false-")][@xml:lang="no"][not(following-sibling::*)]/omicron[starts-with(concat(@src,"-"),"content-")][not(preceding-sibling::*)][following-sibling::epsilon[contains(concat(@class,"$"),"ent$")][@xml:id="id2"]//eta[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::zeta[@false="_blank"][@xml:lang="no"][preceding-sibling::*[position() = 1]]/epsilon[not(preceding-sibling::*)][following-sibling::epsilon[@xml:lang="nb"][not(child::node())][following-sibling::upsilon[@attribute]/lambda[@att][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[contains(@src,"89")][preceding-sibling::*[position() = 1]]/theta/chi[@xml:lang="en-GB"][not(following-sibling::*)]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <gamma class="attribute-value" xml:lang="en"> <psi name="123456789" xml:id="id1"> @@ -18238,6 +21343,11 @@ </test> <test> <xpath>//phi[@desciption]//tau[@attribute="solid 1px green"][@xml:id="id1"][following-sibling::theta[@attr][preceding-sibling::*[position() = 1]][following-sibling::chi[starts-with(@name,"this-is-att-v")][@xml:lang="en-US"][following-sibling::xi[@xml:id="id2"][not(child::node())][following-sibling::theta[starts-with(@desciption,"_bla")][@xml:id="id3"][not(following-sibling::*)]//alpha[@object][@xml:id="id4"][not(preceding-sibling::*)][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <phi desciption="solid 1px green"> <tau attribute="solid 1px green" xml:id="id1"/> @@ -18254,6 +21364,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]//xi[contains(@insert,"e")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[not(following-sibling::*)]//delta[@xml:lang="nb"][not(child::node())][following-sibling::pi[following-sibling::beta[starts-with(concat(@false,"-"),"true-")][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/beta[starts-with(@data,"another attr")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[@xml:lang="en-US"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <iota xml:id="id1"> <xi insert="attribute value" xml:lang="en"/> @@ -18273,6 +21388,11 @@ </test> <test> <xpath>//theta[@abort][@xml:lang="en-US"][@xml:id="id1"]//delta[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::epsilon[@title="true"][@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]/lambda[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::mu[@xml:lang="no"][@xml:id="id5"][following-sibling::epsilon[@xml:lang="no"][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <theta abort="_blank" xml:lang="en-US" xml:id="id1"> <delta xml:lang="no-nb" xml:id="id2"/> @@ -18289,6 +21409,11 @@ </test> <test> <xpath>//delta[contains(concat(@insert,"$"),"att-value$")][@xml:lang="en-GB"]//omicron[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id1"][preceding-sibling::*[position() = 1]]//theta[starts-with(@object,"t")][@xml:id="id2"][not(following-sibling::*)]//xi[starts-with(@content,"100%")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::omega[starts-with(@object,"another attribu")][@xml:id="id3"][not(child::node())][following-sibling::nu[@xml:lang="no"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <delta insert="this-is-att-value" xml:lang="en-GB"> <omicron/> @@ -18307,6 +21432,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]/omicron[@xml:lang="en"][@xml:id="id2"][following-sibling::theta[@title="solid 1px green"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::omicron)]//psi[contains(concat(@false,"$"),"e$")][@xml:lang="nb"][@xml:id="id4"]/phi[@or][@xml:lang="en-US"][not(following-sibling::*)]//kappa[starts-with(@class,"12")][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[@xml:lang="no-nb"][not(preceding-sibling::*)]/theta[contains(concat(@att,"$"),"rue$")][@xml:id="id5"][not(preceding-sibling::*)]/theta[@insert][@xml:lang="en-US"][not(preceding-sibling::*)]/rho[contains(concat(@attribute,"$"),"lank$")][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::sigma[@xml:id="id6"][not(child::node())][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id7"]//delta//psi[@xml:id="id8"][not(child::node())][following-sibling::kappa[@attr][@xml:lang="no"][@xml:id="id9"]//eta[@attrib="100%"][@xml:lang="en-GB"][@xml:id="id10"]/tau[starts-with(@number,"_blank")][@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <rho xml:id="id1"> <omicron xml:lang="en" xml:id="id2"/> @@ -18347,6 +21477,11 @@ </test> <test> <xpath>//xi[@xml:lang="en-US"]//omega[contains(concat(@object,"$"),"123456789$")][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@xml:lang="en-GB"][following-sibling::*[position()=2]][following-sibling::rho[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@attr][@xml:id="id1"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/lambda[starts-with(@number,"this.nodeValu")][@xml:id="id2"][not(following-sibling::*)]//omicron[contains(concat(@class,"$"),"0%$")][not(following-sibling::*)]//mu[contains(concat(@data,"$"),"te$")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::mu[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 1]]/rho[starts-with(concat(@attrib,"-"),"123456789-")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@false="attribute value"][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@attrib="this-is-att-value"][@xml:id="id7"]//theta[not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@abort][preceding-sibling::*[position() = 1]][following-sibling::delta[contains(@title,"ibute-")][@xml:lang="en-GB"]/epsilon[starts-with(@and,"tr")][@xml:lang="en-US"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <xi xml:lang="en-US"> <omega object="123456789"/> @@ -18379,6 +21514,11 @@ </test> <test> <xpath>//pi[contains(concat(@class,"$"),"true$")]/tau//gamma[contains(@object,"ibute")][@xml:id="id1"][not(preceding-sibling::*)]//pi//*[@or="true"][@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]//theta[starts-with(@or,"fa")][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:id="id4"][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::mu[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]/tau[contains(@or,"lank")][@xml:id="id6"][not(preceding-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <pi class="true"> <tau> @@ -18403,6 +21543,11 @@ </test> <test> <xpath>//nu[contains(@or,"00%")][@xml:id="id1"]//xi[@xml:lang="en-US"]//gamma[@title][@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]/chi[starts-with(concat(@data,"-"),"attribute-")][@xml:id="id3"][not(preceding-sibling::*)]//alpha[contains(concat(@attribute,"$"),"x green$")][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[starts-with(concat(@attr,"-"),"solid 1px green-")]//zeta[starts-with(@desciption,"this.node")][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::zeta)]/psi[@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]//omicron[contains(concat(@desciption,"$"),"0%$")][@xml:id="id7"][not(preceding-sibling::*)]/iota[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::theta[starts-with(concat(@number,"-"),"123456789-")][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::chi[@content="attribute"][@xml:lang="no"][@xml:id="id9"][following-sibling::iota[@xml:id="id10"][preceding-sibling::*[position() = 4]][following-sibling::beta[contains(concat(@src,"$"),"ttribute$")][@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 5]]//upsilon[starts-with(@src,"a")][@xml:lang="nb"][@xml:id="id12"]//eta[starts-with(concat(@class,"-"),"123456789-")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[@xml:id="id13"][not(preceding-sibling::*)]/xi[@xml:id="id14"][not(preceding-sibling::*)]//omicron[@data][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <nu or="100%" xml:id="id1"> <xi xml:lang="en-US"> @@ -18443,6 +21588,11 @@ </test> <test> <xpath>//tau[@att][@xml:lang="no-nb"][@xml:id="id1"]/omega[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]//eta[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)]//delta[@number][@xml:lang="en-US"][following-sibling::beta[@string="_blank"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[contains(@object,"e")][@xml:lang="en-GB"][not(preceding-sibling::*)]/eta[contains(concat(@object,"$"),"attribute$")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[starts-with(concat(@number,"-"),"true-")][not(following-sibling::*)]//alpha[@xml:id="id4"][following-sibling::upsilon[@abort="false"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@xml:id="id5"][following-sibling::gamma[@title][@xml:id="id6"][following-sibling::sigma[contains(concat(@desciption,"$"),"e$")][@xml:lang="no"][preceding-sibling::*[position() = 2]]/epsilon[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[not(following-sibling::*)]/gamma[not(preceding-sibling::*)][following-sibling::alpha[contains(@and,"%")][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::alpha)]/eta[not(preceding-sibling::*)]//theta[starts-with(concat(@number,"-"),"solid 1px green-")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::theta)]][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <tau att="123456789" xml:lang="no-nb" xml:id="id1"> <omega xml:lang="en" xml:id="id2"> @@ -18480,6 +21630,11 @@ </test> <test> <xpath>//eta[starts-with(concat(@false,"-"),"content-")][@xml:lang="no"]/omicron[contains(@class,"tri")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:id="id1"][following-sibling::zeta[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::eta[starts-with(@class,"co")][@xml:lang="nb"][@xml:id="id3"][following-sibling::tau[contains(@class,"ute-")][preceding-sibling::*[position() = 4]]/iota[@insert="this.nodeValue"][following-sibling::eta[starts-with(concat(@title,"-"),"attribute value-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(@false,"3456789")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]//epsilon[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]/pi[starts-with(concat(@abort,"-"),"attribute value-")][@xml:lang="no"][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <eta false="content" xml:lang="no"> <omicron class="attribute" xml:lang="no-nb"/> @@ -18502,6 +21657,11 @@ </test> <test> <xpath>//alpha[starts-with(concat(@or,"-"),"true-")][@xml:id="id1"]/xi[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(@attribute,"1234567")]//zeta[@src="content"][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::epsilon[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::pi[@true][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][following-sibling::psi[@class][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::psi[contains(concat(@data,"$"),"23456789$")]/alpha[@xml:lang="en"][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[starts-with(@att,"12345678")][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id5"]/upsilon[@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][not(preceding-sibling::upsilon or following-sibling::upsilon)]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <alpha or="true" xml:id="id1"> <xi/> @@ -18526,6 +21686,11 @@ </test> <test> <xpath>//rho//tau[contains(@content,"this")][@xml:id="id1"][not(following-sibling::*)]//kappa[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=5]][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id3"][not(child::node())][following-sibling::rho[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::omega[@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::theta[preceding-sibling::*[position() = 4]][not(preceding-sibling::theta)][not(child::node())][following-sibling::sigma[contains(concat(@true,"$"),"%$")][@xml:id="id5"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <rho> <tau content="this-is-att-value" xml:id="id1"> @@ -18547,6 +21712,11 @@ </test> <test> <xpath>//tau[contains(concat(@insert,"$"),"eValue$")][@xml:id="id1"]/mu[@number="solid 1px green"][@xml:id="id2"]/gamma[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::sigma[preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::alpha[starts-with(concat(@or,"-"),"this.nodeValue-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[starts-with(concat(@and,"-"),"another attribute value-")][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <tau insert="this.nodeValue" xml:id="id1"> <mu number="solid 1px green" xml:id="id2"> @@ -18562,6 +21732,11 @@ </test> <test> <xpath>//omicron[@xml:id="id1"]//*[contains(@desciption,"this-is-att")][@xml:lang="en"][not(preceding-sibling::*)]//phi[starts-with(concat(@data,"-"),"attribute value-")][@xml:id="id2"][not(preceding-sibling::*)]/delta[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en"][@xml:id="id3"]/xi[contains(concat(@number,"$"),"ank$")][not(preceding-sibling::*)][not(following-sibling::*)]//phi[not(preceding-sibling::*)]//iota[starts-with(concat(@number,"-"),"this.nodeValue-")][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@abort="attribute value"][@xml:lang="no"][following-sibling::upsilon[@name][preceding-sibling::*[position() = 1]]//omega[@token][@xml:lang="no-nb"][@xml:id="id4"]//phi[@xml:lang="en"][@xml:id="id5"][following-sibling::epsilon[contains(@content,"se")][@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[not(following-sibling::*)]/sigma[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[starts-with(@or,"at")][@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[contains(@object,"i")][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <omicron xml:id="id1"> <any desciption="this-is-att-value" xml:lang="en"> @@ -18597,6 +21772,11 @@ </test> <test> <xpath>//chi[@attribute][@xml:id="id1"]//upsilon[@xml:id="id2"][not(preceding-sibling::*)]/rho[@xml:id="id3"][following-sibling::*[@xml:lang="no"][following-sibling::kappa[@xml:id="id4"]/tau[@xml:lang="en-GB"][not(preceding-sibling::*)]//pi[@attrib][@xml:id="id5"][not(preceding-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <chi attribute="another attribute value" xml:id="id1"> <upsilon xml:id="id2"> @@ -18615,6 +21795,11 @@ </test> <test> <xpath>//rho//omega//nu[@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)]//omega[starts-with(concat(@attr,"-"),"another attribute value-")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::mu[@desciption][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[starts-with(concat(@number,"-"),"content-")][@xml:lang="en-GB"][not(preceding-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>1</nth> + </result> <tree> <rho> <omega> @@ -18632,6 +21817,11 @@ </test> <test> <xpath>//gamma[@title][@xml:id="id1"]//pi[not(child::node())][following-sibling::xi[@xml:lang="en-GB"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@token][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::sigma[@xml:lang="no-nb"]/xi[contains(@number,"lue")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//delta[@xml:lang="en-GB"][not(preceding-sibling::*)]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <gamma title="_blank" xml:id="id1"> <pi/> @@ -18650,6 +21840,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@desciption,"-"),"true-")][@xml:lang="nb"][@xml:id="id1"]//sigma[@name="true"][@xml:lang="en"][not(preceding-sibling::*)]//upsilon[@attr][@xml:lang="nb"]/iota[@att][@xml:lang="en"][not(preceding-sibling::*)]/beta[@true][@xml:id="id2"]//upsilon[@insert][not(preceding-sibling::*)][following-sibling::mu[starts-with(concat(@att,"-"),"attribute value-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::beta[@xml:id="id3"][not(child::node())][following-sibling::sigma[starts-with(concat(@title,"-"),"content-")][preceding-sibling::*[position() = 3]]//chi[@attribute][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:id="id6"][following-sibling::eta[@delete][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::pi[@xml:id="id8"][not(following-sibling::*)]//zeta[@xml:lang="no-nb"][not(following-sibling::*)]/delta[@xml:lang="no"]/alpha[@xml:lang="en-US"][@xml:id="id9"][not(preceding-sibling::*)]/delta[starts-with(concat(@class,"-"),"_blank-")][not(preceding-sibling::*)]//xi[not(preceding-sibling::*)]/nu[@src][@xml:lang="en"][not(preceding-sibling::nu)][following-sibling::alpha[@xml:lang="no"][not(child::node())][following-sibling::omega[@src][@xml:lang="no"][@xml:id="id10"][not(child::node())][following-sibling::tau[starts-with(concat(@number,"-"),"123456789-")][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>1</nth> + </result> <tree> <delta desciption="true" xml:lang="nb" xml:id="id1"> <sigma name="true" xml:lang="en"> @@ -18693,6 +21888,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]//tau[@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]/delta[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@attribute][@xml:id="id4"][not(following-sibling::*)]//epsilon[@attribute][@xml:lang="en-US"][following-sibling::*[position()=1]][following-sibling::rho[@and][@xml:lang="en-US"][not(following-sibling::*)]//alpha[@false][@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::alpha[@xml:id="id5"][not(following-sibling::*)]/omicron[@xml:lang="en-US"][@xml:id="id6"][following-sibling::xi[@xml:lang="en"][not(following-sibling::*)]/epsilon[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]/delta[starts-with(concat(@or,"-"),"false-")][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id8"][following-sibling::pi[contains(@and,"ute")][@xml:lang="en"][@xml:id="id9"][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <tau xml:lang="no-nb" xml:id="id2"> @@ -18723,6 +21923,11 @@ </test> <test> <xpath>//mu[starts-with(@abort,"1")]//*[@delete="100%"][@xml:lang="en"][following-sibling::omicron[@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::mu[@xml:lang="nb"]/kappa[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)]//chi[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <mu abort="123456789"> <any delete="100%" xml:lang="en"/> @@ -18739,6 +21944,11 @@ </test> <test> <xpath>//eta[contains(concat(@class,"$"),"100%$")][@xml:lang="nb"]//delta[starts-with(@or,"another attribute val")][@xml:id="id1"][not(preceding-sibling::delta)]/nu[contains(@false,"6789")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]//pi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[contains(@abort,"t")][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::psi[not(following-sibling::*)]/tau[@xml:id="id4"][not(child::node())][following-sibling::nu[contains(@token,"e")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[@content][@xml:id="id6"]//pi[contains(concat(@object,"$"),"23456789$")][@xml:lang="no-nb"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@false][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::psi[not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::rho[@xml:id="id9"][preceding-sibling::*[position() = 3]]/xi[@attribute][@xml:lang="no"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::iota[contains(@src,"nk")][@xml:lang="no-nb"][not(child::node())][following-sibling::delta[starts-with(concat(@content,"-"),"100%-")][preceding-sibling::*[position() = 2]]//iota[@number][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <eta class="100%" xml:lang="nb"> <delta or="another attribute value" xml:id="id1"> @@ -18773,6 +21983,11 @@ </test> <test> <xpath>//nu/sigma[starts-with(@number,"attribu")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::kappa[contains(@src,"en")][not(following-sibling::*)]//zeta[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[@attrib][@xml:id="id2"][not(following-sibling::*)]//theta//chi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::kappa[@title][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="no"][@xml:id="id4"][following-sibling::lambda[@object][@xml:lang="en"][@xml:id="id5"][not(following-sibling::*)]//chi[starts-with(@object,"_b")][@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]/chi[@xml:id="id7"][not(following-sibling::*)]//phi[not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <nu> <sigma number="attribute" xml:lang="en-GB"/> @@ -18801,6 +22016,11 @@ </test> <test> <xpath>//alpha[contains(concat(@attrib,"$"),"89$")][@xml:id="id1"]//phi[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:lang="en"][not(following-sibling::*)]/kappa[contains(@abort,"eValue")][@xml:lang="no"][not(preceding-sibling::*)]//upsilon[@attr="this.nodeValue"][not(child::node())][following-sibling::sigma//omega[@class][@xml:lang="en"][following-sibling::phi[@xml:id="id2"]/gamma[contains(concat(@abort,"$"),"eValue$")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::zeta[starts-with(@attr,"1")][@xml:id="id4"][preceding-sibling::*[position() = 1]]/psi[starts-with(concat(@insert,"-"),"_blank-")][@xml:lang="no-nb"][@xml:id="id5"]//zeta[@attrib][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/omega[@true="content"]/alpha[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@data][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[@xml:id="id6"][not(following-sibling::*)]//rho[contains(concat(@att,"$"),"ue$")][@xml:id="id7"][not(preceding-sibling::*)]//*[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <alpha attrib="123456789" xml:id="id1"> <phi src="this.nodeValue" xml:lang="en"> @@ -18836,6 +22056,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-GB"]//delta[@src="123456789"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[contains(@string,"ue")][@xml:lang="en-GB"][@xml:id="id1"][not(child::node())][following-sibling::chi[@xml:id="id2"][following-sibling::chi[@token="attribute-value"][@xml:lang="en"][preceding-sibling::*[position() = 2]]//alpha[contains(@or,"ute value")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::tau[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(following-sibling::omega)]/theta[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@delete][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::phi[@xml:id="id6"][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-GB"> <delta src="123456789" xml:lang="no-nb"> @@ -18859,6 +22084,11 @@ </test> <test> <xpath>//zeta[@token="attribute"][@xml:lang="no"]/chi[@object][not(following-sibling::*)]/pi[@xml:id="id1"][not(child::node())][following-sibling::psi[contains(concat(@abort,"$"),"x green$")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/*[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[contains(@insert,"e")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[@src][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="en-US"][not(following-sibling::*)]/pi[@attr][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <zeta token="attribute" xml:lang="no"> <chi object="true"> @@ -18883,6 +22113,11 @@ </test> <test> <xpath>//zeta/psi[contains(@data,"nt")][not(preceding-sibling::*)][not(following-sibling::*)]//omega[@xml:id="id1"][following-sibling::beta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@xml:lang="no"][not(preceding-sibling::*)]//delta[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::psi[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:lang="en"][not(following-sibling::*)]//sigma[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi/pi[@xml:lang="nb"][@xml:id="id5"]/alpha[starts-with(@data,"att")][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[starts-with(@object,"tr")][@xml:lang="no"]//xi[@false="attribute"][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@string]//phi[contains(@or,"nt")][not(preceding-sibling::*)][not(following-sibling::*)]//xi[starts-with(concat(@string,"-"),"100%-")][@xml:id="id7"][not(following-sibling::*)]/nu[@data="attribute-value"][@xml:lang="en-GB"][@xml:id="id8"]/eta[starts-with(concat(@desciption,"-"),"content-")][@xml:lang="no-nb"][not(following-sibling::*)]/beta[starts-with(@string,"f")][@xml:id="id9"]/omega[not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:id="id10"][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <zeta> <psi data="content"> @@ -18928,6 +22163,11 @@ </test> <test> <xpath>//epsilon[starts-with(concat(@desciption,"-"),"false-")][@xml:lang="en-US"]/iota[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::upsilon[starts-with(concat(@attrib,"-"),"false-")][@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(preceding-sibling::upsilon)]//zeta[@xml:lang="nb"][@xml:id="id3"][not(child::node())][following-sibling::eta[@xml:lang="en-US"]/iota[@xml:lang="no"][not(preceding-sibling::*)]//kappa[contains(concat(@title,"$"),"k$")][not(preceding-sibling::*)][following-sibling::gamma[@object][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::mu[@xml:id="id5"][following-sibling::xi[@xml:id="id6"][not(following-sibling::*)]/rho[@false][following-sibling::theta[starts-with(@attr,"attribut")][@xml:lang="en-GB"][not(following-sibling::*)]/*[@xml:lang="en"][not(following-sibling::*)]//nu[contains(concat(@delete,"$"),"nk$")][@xml:lang="en"][@xml:id="id7"][following-sibling::iota[starts-with(concat(@att,"-"),"attribute-")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@or="attribute-value"][@xml:lang="no"][not(following-sibling::*)][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>1</nth> + </result> <tree> <epsilon desciption="false" xml:lang="en-US"> <iota xml:lang="nb"> @@ -18960,6 +22200,11 @@ </test> <test> <xpath>//tau[@xml:lang="no"]/mu[@title][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[contains(concat(@false,"$"),"ue$")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::theta[@attrib="false"][@xml:lang="en-US"][preceding-sibling::*[position() = 2]]/omicron[contains(concat(@insert,"$"),"deValue$")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[@xml:lang="nb"][not(child::node())][following-sibling::iota[contains(@desciption,"ut")][@xml:id="id5"][preceding-sibling::*[position() = 3]]//sigma[contains(@src,"e")][@xml:id="id6"]/beta[starts-with(concat(@false,"-"),"true-")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[starts-with(@att,"fal")][@xml:id="id8"][not(preceding-sibling::eta)][not(child::node())][following-sibling::xi[@xml:lang="no"][preceding-sibling::*[position() = 2]][following-sibling::mu[preceding-sibling::*[position() = 3]][following-sibling::nu[@xml:lang="en-GB"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@xml:id="id9"]//omicron[@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@title][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no"> <mu title="this-is-att-value" xml:lang="en-US" xml:id="id1"/> @@ -18990,6 +22235,11 @@ </test> <test> <xpath>//rho[@xml:lang="no"][@xml:id="id1"]//iota[@data][not(preceding-sibling::*)]//upsilon[@attrib][not(child::node())][following-sibling::lambda[@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]/psi[contains(concat(@delete,"$"),"nk$")][@xml:lang="no-nb"][not(following-sibling::*)]/zeta[@or][@xml:lang="en-US"][@xml:id="id3"][not(child::node())][following-sibling::xi[contains(@abort,"ue")][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::gamma[starts-with(@false,"conten")][@xml:id="id5"][not(following-sibling::*)]/psi[starts-with(concat(@or,"-"),"100%-")][@xml:id="id6"][not(following-sibling::*)]/pi[@xml:id="id7"]/phi[starts-with(@insert,"false")][not(child::node())][following-sibling::tau[@data][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/gamma[@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[contains(concat(@att,"$"),"tribute-value$")][@xml:lang="nb"][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//beta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[starts-with(concat(@desciption,"-"),"attribute value-")][@xml:id="id9"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:lang="no"][@xml:id="id10"][not(following-sibling::rho)]//beta[@xml:lang="nb"]/zeta[@xml:lang="no-nb"][@xml:id="id11"][not(following-sibling::*)]//upsilon[@true="true"][@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <rho xml:lang="no" xml:id="id1"> <iota data="attribute value"> @@ -19033,6 +22283,11 @@ </test> <test> <xpath>//rho//rho[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::nu[@class][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[not(preceding-sibling::*)][not(following-sibling::*)]/xi[starts-with(@abort,"attribu")][@xml:lang="en-GB"][@xml:id="id3"]//theta[@xml:id="id4"][not(child::node())][following-sibling::nu[starts-with(@delete,"another attrib")][@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@class][@xml:id="id6"][following-sibling::iota[@attrib][@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[@xml:id="id8"]//gamma[contains(concat(@attrib,"$"),"lue$")][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[not(child::node())][following-sibling::*[@or][@xml:id="id10"][following-sibling::psi[@xml:lang="nb"][not(following-sibling::*)]/gamma[@content][@xml:lang="no-nb"][not(following-sibling::*)]//lambda[@xml:id="id11"][not(child::node())][following-sibling::gamma[@xml:id="id12"]/mu[@xml:id="id13"][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>1</nth> + </result> <tree> <rho> <rho xml:lang="no-nb" xml:id="id1"/> @@ -19070,6 +22325,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-US"]/psi[contains(concat(@src,"$"),"value$")][@xml:id="id1"]//zeta[not(child::node())][following-sibling::pi[starts-with(@abort,"this-is-att-va")][@xml:id="id2"]//sigma[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 2]]//eta[contains(@attrib,"e")][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@true][@xml:lang="no"][following-sibling::kappa[contains(concat(@desciption,"$"),"0%$")][@xml:id="id6"][not(child::node())][following-sibling::omicron[starts-with(@attrib,"attribute-v")]/*[@and][not(preceding-sibling::any)][following-sibling::omicron[contains(@number,"ribute-value")][@xml:lang="nb"][following-sibling::eta[@xml:lang="nb"][@xml:id="id7"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-US"> <psi src="attribute value" xml:id="id1"> @@ -19098,6 +22358,11 @@ </test> <test> <xpath>//rho[@object="false"]/phi[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::*[@xml:id="id2"][not(following-sibling::*)]//nu[@title="attribute value"][@xml:lang="no"]/upsilon[starts-with(@desciption,"solid ")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[@attrib][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[starts-with(@true,"1")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="en"][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 2]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <rho object="false"> <phi xml:id="id1"/> @@ -19118,6 +22383,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]/omega[not(child::node())][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omega[starts-with(concat(@title,"-"),"false-")]/delta[@true="true"]//zeta[contains(concat(@object,"$"),"nk$")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <omega/> @@ -19135,6 +22405,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no-nb"]//*[@xml:lang="no-nb"][@xml:id="id1"][not(following-sibling::*)]/xi[@xml:lang="no-nb"][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::chi[@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::lambda[@insert]//mu[@title][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::psi[@xml:lang="en-GB"][@xml:id="id5"][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"]/delta[starts-with(@src,"t")][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="no-nb"> <any xml:lang="no-nb" xml:id="id1"> @@ -19157,6 +22432,11 @@ </test> <test> <xpath>//epsilon[@or][@xml:lang="no-nb"]/eta[@false][following-sibling::mu[@false="another attribute value"][@xml:lang="en"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[@object="this-is-att-value"][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[@xml:lang="nb"][not(child::node())][following-sibling::mu[preceding-sibling::*[position() = 1]]/pi[starts-with(concat(@delete,"-"),"content-")][@xml:lang="no"]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <epsilon or="attribute-value" xml:lang="no-nb"> <eta false="this.nodeValue"/> @@ -19176,6 +22456,11 @@ </test> <test> <xpath>//omega[contains(@attribute,"u")][@xml:lang="en-US"]/zeta[@object="100%"][@xml:id="id1"][not(preceding-sibling::*)]//eta[@xml:id="id2"][not(following-sibling::*)]//upsilon[starts-with(concat(@token,"-"),"solid 1px green-")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@insert][following-sibling::*[position()=1]][following-sibling::tau[contains(@string,"bute")][preceding-sibling::*[position() = 1]]/omega[starts-with(concat(@and,"-"),"this.nodeValue-")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[starts-with(concat(@content,"-"),"content-")][@xml:id="id6"][preceding-sibling::*[position() = 1]]//omicron[starts-with(@insert,"_bl")][@xml:lang="no"]//zeta[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id8"][following-sibling::*[position()=2]][not(preceding-sibling::alpha)][following-sibling::psi[@xml:lang="no"][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::nu[@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//alpha[@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::beta[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[@xml:lang="en"][@xml:id="id12"][not(preceding-sibling::*)]/epsilon[contains(@true,"Value")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[@true][@xml:lang="no-nb"][@xml:id="id13"][not(child::node())][following-sibling::tau[@xml:id="id14"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <omega attribute="true" xml:lang="en-US"> <zeta object="100%" xml:id="id1"> @@ -19215,6 +22500,11 @@ </test> <test> <xpath>//xi[@true]//xi[not(preceding-sibling::*)][following-sibling::upsilon[contains(@or,"tent")][preceding-sibling::*[position() = 1]]/kappa[@attrib][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@name][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::xi[contains(@abort,"23456789")][@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 2]][following-sibling::alpha[following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]//beta[@object][@xml:lang="en-US"][not(preceding-sibling::*)]/phi[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(preceding-sibling::phi)][not(child::node())][following-sibling::gamma[starts-with(concat(@attribute,"-"),"this-")][following-sibling::theta[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>1</nth> + </result> <tree> <xi true="123456789"> <xi/> @@ -19238,6 +22528,11 @@ </test> <test> <xpath>//lambda[contains(concat(@attr,"$"),"ontent$")][@xml:lang="no-nb"][@xml:id="id1"]/pi[@xml:lang="en-US"][@xml:id="id2"]//sigma[starts-with(concat(@true,"-"),"attribute-")][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::psi[starts-with(concat(@src,"-"),"_blank-")][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[starts-with(@name,"_b")][not(following-sibling::*)]//theta[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::chi[@attrib="attribute-value"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/zeta[contains(concat(@object,"$"),"rue$")][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[starts-with(@false,"tru")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]]/*[@xml:lang="no-nb"][not(preceding-sibling::*)]/epsilon[@xml:lang="no"][not(following-sibling::*)]/tau[@abort][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[contains(concat(@insert,"$"),"is-att-value$")][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[@attrib="false"][@xml:id="id9"][not(following-sibling::*)]/psi[@abort][@xml:lang="no-nb"][not(preceding-sibling::*)]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <lambda attr="content" xml:lang="no-nb" xml:id="id1"> <pi xml:lang="en-US" xml:id="id2"> @@ -19273,6 +22568,11 @@ </test> <test> <xpath>//sigma/lambda[not(preceding-sibling::*)]//delta[@true][not(child::node())][following-sibling::delta[starts-with(concat(@desciption,"-"),"attribute-")][following-sibling::*[position()=2]][following-sibling::pi[@delete="123456789"][@xml:lang="no"][@xml:id="id1"][following-sibling::zeta[contains(concat(@or,"$"),"6789$")]//gamma[@xml:id="id2"][following-sibling::pi[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//lambda[@xml:id="id4"]/zeta[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::kappa[not(child::node())][following-sibling::epsilon[@abort][@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 2]]/alpha[@false][@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]//zeta[contains(@desciption,"t")][@xml:id="id8"][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <sigma> <lambda> @@ -19301,6 +22601,11 @@ </test> <test> <xpath>//lambda[@xml:lang="no"]//gamma[not(preceding-sibling::*)]//chi[contains(@or,"ue")][not(child::node())][following-sibling::sigma[@xml:lang="en"]/iota[@xml:id="id1"][not(child::node())][following-sibling::eta[starts-with(@object,"solid 1px ")][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="no"> <gamma> @@ -19317,6 +22622,11 @@ </test> <test> <xpath>//beta[@xml:lang="en-GB"]//beta[contains(@content,"ten")][@xml:lang="no"][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[contains(@delete,"_bl")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/psi[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)]//delta[starts-with(concat(@title,"-"),"another attribute value-")][not(preceding-sibling::*)]/alpha[@attrib][@xml:id="id3"][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::epsilon)]//omicron[contains(concat(@attribute,"$"),"s-is-att-value$")][@xml:id="id6"][following-sibling::tau[@xml:id="id7"][not(following-sibling::*)]/xi[@object="false"][@xml:lang="en-US"][@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@number][preceding-sibling::*[position() = 1]][following-sibling::gamma[contains(concat(@attrib,"$"),"ue$")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]//eta[@number][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[not(following-sibling::*)]//epsilon[starts-with(@name,"con")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="no"][following-sibling::zeta[starts-with(@token,"con")][@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//upsilon[contains(@class,"lue")][@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::kappa[@xml:lang="no"][@xml:id="id11"]//mu/tau[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>1</nth> + </result> <tree> <beta xml:lang="en-GB"> <beta content="content" xml:lang="no" xml:id="id1"/> @@ -19359,6 +22669,11 @@ </test> <test> <xpath>//*[@xml:lang="en-US"]//sigma[starts-with(concat(@name,"-"),"_blank-")][@xml:id="id1"][following-sibling::delta[starts-with(@false,"1")][not(following-sibling::*)]/delta[starts-with(@delete,"attr")][not(preceding-sibling::*)][not(following-sibling::*)]/pi[starts-with(concat(@class,"-"),"attribute-")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::eta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[@abort][not(preceding-sibling::*)][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 1]]/lambda[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="nb"][preceding-sibling::*[position() = 1]]//kappa[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::kappa or following-sibling::kappa)]//mu[contains(@abort,"green")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id6"]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-US"> <sigma name="_blank" xml:id="id1"/> @@ -19390,6 +22705,11 @@ </test> <test> <xpath>//eta[@xml:lang="nb"]//pi[@abort][@xml:lang="en-US"]//*[starts-with(@string,"att")][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::iota[@class][@xml:id="id1"][not(following-sibling::*)]//rho[not(preceding-sibling::*)][not(following-sibling::*)]//beta[@xml:lang="en-US"][not(following-sibling::*)]//*[@xml:id="id2"]//beta[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::gamma[starts-with(concat(@src,"-"),"_blank-")][preceding-sibling::*[position() = 1]][following-sibling::epsilon[@object][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]/kappa[starts-with(@content,"at")][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[contains(@att,"lid 1px g")][preceding-sibling::*[position() = 1]]/delta[@xml:lang="en-US"][@xml:id="id4"][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//iota[@attribute="attribute"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::upsilon[starts-with(@false,"attribute-v")][@xml:id="id6"][following-sibling::kappa[contains(@delete,"od")][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="nb"> <pi abort="attribute value" xml:lang="en-US"> @@ -19425,6 +22745,11 @@ </test> <test> <xpath>//phi/beta[contains(@and,"e")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@abort="attribute value"][@xml:lang="no-nb"][@xml:id="id1"][not(following-sibling::*)]//omicron[@content][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[contains(concat(@title,"$"),"lue$")][@xml:lang="en-US"][not(following-sibling::*)]//omega[starts-with(@token,"123")][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[starts-with(concat(@and,"-"),"false-")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::nu[starts-with(@title,"attri")][@xml:lang="nb"][@xml:id="id5"]/kappa[starts-with(@token,"this-is-at")][@xml:lang="en"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::tau[@string]//psi[@desciption][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//psi[@content][not(following-sibling::*)]//zeta[@attr][not(preceding-sibling::*)]/mu[@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::psi[@string="true"][@xml:lang="no"][@xml:id="id9"]//gamma[@title="attribute"][@xml:id="id10"][following-sibling::delta[position() = 1]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <phi> <beta and="true" xml:lang="en"/> @@ -19460,6 +22785,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]/tau[@or][@xml:id="id2"][not(following-sibling::*)]/xi[contains(concat(@or,"$"),"6789$")][not(preceding-sibling::*)]/lambda[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@content][not(following-sibling::*)]/delta[@insert][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[starts-with(concat(@class,"-"),"false-")][@xml:id="id4"][preceding-sibling::*[position() = 1]]//pi[@xml:lang="en"][@xml:id="id5"][following-sibling::theta[contains(@string,"te-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]/delta[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)]//sigma[@xml:lang="no"][not(preceding-sibling::*)]/omega[@xml:lang="en"][@xml:id="id7"]/pi[contains(concat(@token,"$"),"e$")][@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <psi xml:id="id1"> <tau or="content" xml:id="id2"> @@ -19490,6 +22820,11 @@ </test> <test> <xpath>//eta[starts-with(concat(@abort,"-"),"another attribute value-")][@xml:lang="nb"]//tau[@xml:id="id1"][not(preceding-sibling::*)]//beta[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::phi[@xml:id="id2"][following-sibling::omicron[contains(concat(@attribute,"$"),"e$")][@xml:id="id3"][not(child::node())][following-sibling::pi[@xml:lang="en"][preceding-sibling::*[position() = 3]][following-sibling::pi[@number][@xml:lang="nb"][preceding-sibling::*[position() = 4]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <eta abort="another attribute value" xml:lang="nb"> <tau xml:id="id1"> @@ -19506,6 +22841,11 @@ </test> <test> <xpath>//upsilon[starts-with(@delete,"solid 1px gre")][@xml:id="id1"]/beta/upsilon[not(child::node())][following-sibling::gamma[contains(concat(@false,"$"),"ute-value$")][@xml:lang="no"][not(following-sibling::*)]//mu[not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::omicron[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::epsilon[@object][@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::chi[@class="this-is-att-value"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/pi[contains(concat(@token,"$"),"other attribute value$")][@xml:lang="en"][not(preceding-sibling::*)]//lambda[@xml:id="id2"][not(preceding-sibling::*)]//tau[@xml:id="id3"]/pi[starts-with(@data,"_blank")][not(child::node())][following-sibling::pi[starts-with(@name,"anot")][@xml:lang="no-nb"]//eta[@xml:lang="en-GB"][not(following-sibling::*)]//phi[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>1</nth> + </result> <tree> <upsilon delete="solid 1px green" xml:id="id1"> <beta> @@ -19537,6 +22877,11 @@ </test> <test> <xpath>//eta[@or][@xml:lang="en-US"]/iota[@token][following-sibling::tau[@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[contains(@token,"other ")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/kappa[@xml:lang="no-nb"]//xi[@xml:lang="en"][not(preceding-sibling::*)]/tau[@xml:lang="en-GB"][@xml:id="id1"][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[@token="100%"][following-sibling::theta[@xml:id="id2"][not(following-sibling::*)]/chi[@xml:id="id3"][not(child::node())][following-sibling::iota[contains(concat(@false,"$"),"odeValue$")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(preceding-sibling::lambda)]/delta[contains(concat(@abort,"$"),"other attribute value$")][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@attribute="another attribute value"][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 1]]/lambda[@attribute][@xml:lang="no"][not(following-sibling::*)]//*[@xml:lang="en-US"][@xml:id="id7"][not(child::node())][following-sibling::sigma[not(following-sibling::*)]/epsilon[not(preceding-sibling::*)]/theta[starts-with(@abort,"an")][@xml:id="id8"][not(following-sibling::*)]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <eta or="123456789" xml:lang="en-US"> <iota token="_blank"/> @@ -19575,6 +22920,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="no-nb"]//xi[@xml:lang="en-US"][not(preceding-sibling::*)]/gamma[@attr][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:id="id1"]/psi[contains(@attribute,"this.n")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[contains(@attribute,"attribu")][@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::beta[@xml:lang="en-US"][@xml:id="id3"][following-sibling::upsilon[@xml:id="id4"][following-sibling::gamma[starts-with(@title,"10")][not(child::node())][following-sibling::nu//beta[starts-with(@delete,"solid 1p")][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:id="id5"]/rho[not(child::node())][following-sibling::omega[@title][following-sibling::omicron[starts-with(concat(@src,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 2]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="no-nb"> <xi xml:lang="en-US"> @@ -19602,6 +22952,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@title,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id1"]//theta[@xml:lang="en"][@xml:id="id2"][following-sibling::lambda[starts-with(concat(@token,"-"),"true-")][following-sibling::*[position()=2]][following-sibling::upsilon[@xml:lang="en"][preceding-sibling::*[position() = 2]][following-sibling::delta[@true][not(following-sibling::*)]/*[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::sigma[@xml:id="id3"][not(child::node())][following-sibling::delta[starts-with(@content,"anothe")][@xml:id="id4"][not(following-sibling::*)]//lambda[not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]]/rho[starts-with(@desciption,"this.nodeVa")][@xml:id="id6"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <delta title="attribute" xml:lang="nb" xml:id="id1"> <theta xml:lang="en" xml:id="id2"/> @@ -19624,6 +22979,11 @@ </test> <test> <xpath>//iota[@xml:lang="no-nb"]//*[starts-with(concat(@insert,"-"),"_blank-")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::eta[@xml:id="id1"]/beta[starts-with(concat(@abort,"-"),"false-")][@xml:lang="nb"][@xml:id="id2"][following-sibling::nu[starts-with(concat(@object,"-"),"_blank-")][@xml:lang="no"][not(following-sibling::*)]/gamma[starts-with(concat(@att,"-"),"attribute-")][@xml:lang="en"][following-sibling::psi[contains(concat(@title,"$")," green$")][@xml:id="id3"][following-sibling::*[position()=3]][following-sibling::kappa[@object][preceding-sibling::*[position() = 2]][following-sibling::gamma[@att="attribute"][@xml:id="id4"][not(child::node())][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]//xi[starts-with(@class,"cont")][@xml:id="id6"][not(preceding-sibling::*)]//pi[@token][@xml:lang="en"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::epsilon[contains(concat(@attr,"$"),"0%$")][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]]/gamma[@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::gamma[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::chi[@token][@xml:id="id11"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::phi[@object="attribute value"][not(following-sibling::*)]/sigma[@xml:lang="en"][not(preceding-sibling::*)]]]]]]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no-nb"> <any insert="_blank" xml:lang="en"/> @@ -19659,6 +23019,11 @@ </test> <test> <xpath>//chi[contains(concat(@insert,"$"),"ank$")][@xml:lang="no"]//omicron[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)]//mu[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=9]][following-sibling::*[@xml:id="id3"][following-sibling::rho[@xml:lang="no-nb"][@xml:id="id4"][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][following-sibling::beta[starts-with(@title,"fa")][following-sibling::*[preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::phi[@name="true"][@xml:lang="no-nb"][not(child::node())][following-sibling::zeta[starts-with(concat(@number,"-"),"this-")][@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 7]][following-sibling::phi[@xml:lang="en-GB"][@xml:id="id6"][not(child::node())][following-sibling::upsilon//mu[following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:id="id7"]//kappa[not(following-sibling::*)]/delta[@xml:id="id8"][following-sibling::gamma[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::kappa[@xml:id="id10"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <chi insert="_blank" xml:lang="no"> <omicron xml:lang="nb" xml:id="id1"> @@ -19689,6 +23054,11 @@ </test> <test> <xpath>//theta[@xml:lang="no-nb"][@xml:id="id1"]/iota[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::mu[preceding-sibling::*[position() = 1]][following-sibling::pi[contains(concat(@desciption,"$"),"e$")][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::upsilon[starts-with(concat(@att,"-"),"attribute value-")][@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]//delta[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::eta[following-sibling::nu[starts-with(concat(@insert,"-"),"this-")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/phi[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="no-nb" xml:id="id1"> <iota xml:lang="en-GB" xml:id="id2"/> @@ -19708,6 +23078,11 @@ </test> <test> <xpath>//alpha[@content="content"][@xml:id="id1"]/delta[@token="attribute"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/sigma[@class][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[starts-with(@title,"solid 1px gre")][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa[@xml:lang="en"][@xml:id="id4"]//alpha[@abort="another attribute value"][@xml:id="id5"]/eta[starts-with(@abort,"another attribute ")][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::*[position()=9]][following-sibling::rho[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=8]][following-sibling::*[contains(concat(@token,"$"),"ank$")][@xml:lang="en"][@xml:id="id7"][not(child::node())][following-sibling::chi[@xml:id="id8"][preceding-sibling::*[position() = 3]][following-sibling::epsilon[@xml:id="id9"][not(child::node())][following-sibling::pi[@xml:id="id10"][preceding-sibling::*[position() = 5]][following-sibling::tau[@name][@xml:lang="en"][preceding-sibling::*[position() = 6]][not(child::node())][following-sibling::upsilon[contains(concat(@object,"$"),"e$")][@xml:lang="no"][@xml:id="id11"][following-sibling::*[position()=2]][following-sibling::epsilon[preceding-sibling::*[position() = 8]][following-sibling::*[position()=1]][following-sibling::lambda[starts-with(@data,"attribute-")][preceding-sibling::*[position() = 9]]//eta[@xml:lang="en-US"][not(preceding-sibling::*)]/psi[@xml:lang="en"][@xml:id="id12"][not(preceding-sibling::*)][not(following-sibling::*)]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <alpha content="content" xml:id="id1"> <delta token="attribute" xml:id="id2"/> @@ -19742,6 +23117,11 @@ </test> <test> <xpath>//xi[contains(concat(@data,"$"),"k$")][@xml:lang="en"]/omicron[contains(concat(@or,"$"),"lse$")][@xml:lang="en-US"][not(following-sibling::*)]//phi[contains(concat(@object,"$"),"00%$")][@xml:lang="en-US"][@xml:id="id1"][not(child::node())][following-sibling::psi[@insert="true"][not(child::node())][following-sibling::epsilon[starts-with(concat(@false,"-"),"attribute value-")][@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]/sigma[@xml:id="id3"][not(following-sibling::*)]/delta[not(preceding-sibling::*)][not(following-sibling::*)]/omega[starts-with(@false,"tr")][@xml:lang="en-US"][not(preceding-sibling::*)]/delta[starts-with(@and,"123456789")][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <xi data="_blank" xml:lang="en"> <omicron or="false" xml:lang="en-US"> @@ -19764,6 +23144,11 @@ </test> <test> <xpath>//omega[@xml:lang="no"][@xml:id="id1"]//*[@attribute][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::zeta[@xml:id="id2"][preceding-sibling::*[position() = 1]]//lambda[@content="attribute"][not(child::node())][following-sibling::mu[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/kappa[@class="attribute-value"][not(following-sibling::*)][not(preceding-sibling::kappa)]//lambda[starts-with(@token,"a")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::zeta[@or][@xml:lang="en-US"][not(following-sibling::*)]/alpha[@xml:id="id5"][not(child::node())][following-sibling::pi[@xml:lang="en-GB"]//alpha[starts-with(@false,"at")][@xml:id="id6"]//eta[starts-with(@content,"so")][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::eta/sigma[@xml:lang="en-GB"][@xml:id="id8"][not(child::node())][following-sibling::alpha[starts-with(@false,"attribute-")][@xml:lang="no-nb"]//lambda[@false][not(following-sibling::*)]/pi[@false="_blank"][not(preceding-sibling::*)]//upsilon[not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="no" xml:id="id1"> <any attribute="this.nodeValue" xml:lang="en-US"/> @@ -19800,6 +23185,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en-GB"][@xml:id="id1"]//gamma[@xml:lang="en-GB"][not(child::node())][following-sibling::*//gamma[@xml:id="id2"][following-sibling::delta[@object][not(preceding-sibling::delta)]//omega[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(preceding-sibling::epsilon)]//rho[@xml:lang="no-nb"]/kappa[@xml:lang="en-GB"]/kappa[not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@class="this.nodeValue"][@xml:id="id6"][preceding-sibling::*[position() = 1]]/tau[@xml:lang="no-nb"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:lang="en-GB"][not(following-sibling::*)]//nu[@xml:lang="nb"][not(preceding-sibling::*)]/phi[@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@true][@xml:id="id9"]/alpha[@xml:id="id10"][not(child::node())][following-sibling::mu[@src="attribute value"][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::mu)]//nu[starts-with(concat(@object,"-"),"true-")][not(preceding-sibling::*)][not(child::node())][following-sibling::*[starts-with(concat(@true,"-"),"true-")][@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[starts-with(@token,"_bla")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en-GB" xml:id="id1"> <gamma xml:lang="en-GB"/> @@ -19843,6 +23233,11 @@ </test> <test> <xpath>//alpha[@xml:lang="no-nb"][@xml:id="id1"]/delta[@false][@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]//nu[contains(@number,"0")][@xml:id="id3"][not(preceding-sibling::*)][not(preceding-sibling::nu)]/upsilon[starts-with(@src,"ano")][@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::theta[@xml:lang="en"][@xml:id="id5"][not(following-sibling::*)]//xi[contains(concat(@attrib,"$"),"se$")][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="no"][not(following-sibling::*)]//rho[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::rho)]//phi[@src][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[starts-with(concat(@content,"-"),"attribute value-")][@xml:lang="nb"][not(following-sibling::*)]//psi[@attribute][@xml:lang="en"][not(preceding-sibling::*)]/upsilon[contains(@insert,"nother attri")]//delta[@number]/psi[@true="this-is-att-value"][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(preceding-sibling::psi)][following-sibling::tau[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::alpha[@content="false"][not(child::node())][following-sibling::beta[contains(concat(@content,"$"),"false$")][@xml:lang="nb"]//delta[@xml:lang="no-nb"][@xml:id="id10"]//iota[@xml:lang="no"][@xml:id="id11"][not(preceding-sibling::*)]//gamma[@src][@xml:id="id12"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="no-nb" xml:id="id1"> <delta false="attribute-value" xml:lang="en-GB" xml:id="id2"> @@ -19884,6 +23279,11 @@ </test> <test> <xpath>//mu[@xml:lang="no-nb"][@xml:id="id1"]//tau[@xml:id="id2"][not(following-sibling::*)]//omicron[@xml:lang="en-US"][@xml:id="id3"][following-sibling::delta[@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[contains(concat(@att,"$")," value$")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/theta[contains(@abort,"1px green")][not(preceding-sibling::*)]/zeta[@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::upsilon[@attr][@xml:lang="no"]/epsilon[contains(concat(@object,"$"),"ttribute value$")][@xml:lang="nb"][@xml:id="id6"]//omega[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::omega)][not(child::node())][following-sibling::beta[@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::omicron[@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/rho[@xml:id="id10"]//psi[@attr][@xml:lang="en-GB"][@xml:id="id11"][not(following-sibling::psi)][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id12"][preceding-sibling::*[position() = 1]]//pi[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@xml:lang="en-GB"][not(following-sibling::*)]/xi[@xml:lang="en-US"][not(preceding-sibling::*)]/kappa[@xml:lang="en-US"][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id13"]/zeta[contains(concat(@number,"$"),"ribute-value$")][not(preceding-sibling::*)]//omicron[@xml:lang="en"][@xml:id="id14"][not(preceding-sibling::*)][following-sibling::iota[contains(concat(@attrib,"$"),"-value$")][@xml:lang="no"][@xml:id="id15"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[@xml:lang="no"][@xml:id="id16"]][position() = 1]]]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <mu xml:lang="no-nb" xml:id="id1"> <tau xml:id="id2"> @@ -19929,6 +23329,11 @@ </test> <test> <xpath>//phi//zeta[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//alpha[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[@xml:lang="en-US"][@xml:id="id1"]/epsilon[@token="this.nodeValue"][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::kappa[@data][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//mu[@string="false"][@xml:lang="nb"][not(preceding-sibling::*)]//epsilon[not(preceding-sibling::*)][not(following-sibling::*)]//pi[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::iota[starts-with(@content,"123")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/sigma[not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en-US"][not(following-sibling::*)]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <phi> <zeta/> @@ -19960,6 +23365,11 @@ </test> <test> <xpath>//alpha[@xml:lang="no-nb"][@xml:id="id1"]/omega[contains(@content,"%")][@xml:lang="en-US"]//psi[@insert][not(preceding-sibling::*)][not(following-sibling::*)]/*[not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@content][@xml:lang="en"]//sigma[not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@xml:lang="no-nb"][following-sibling::xi[starts-with(@false,"12")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="no-nb" xml:id="id1"> <omega content="100%" xml:lang="en-US"> @@ -19981,6 +23391,11 @@ </test> <test> <xpath>//psi[contains(@src,"n")]//gamma[@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]//beta[@xml:id="id2"][not(preceding-sibling::*)]//sigma[contains(concat(@false,"$"),"rue$")][@xml:lang="no-nb"][not(preceding-sibling::*)]/xi[contains(concat(@number,"$")," 1px green$")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]/pi[contains(concat(@src,"$"),"ontent$")][not(child::node())][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::rho[starts-with(@attr,"tr")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/zeta[contains(@attribute,"e")][@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[starts-with(concat(@desciption,"-"),"true-")][@xml:lang="en"][not(following-sibling::*)]//xi[@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@insert="this.nodeValue"][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//omega[starts-with(concat(@delete,"-"),"solid 1px green-")]/psi[contains(@or,"te value")][@xml:lang="en-GB"][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::phi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(following-sibling::phi)][not(child::node())][following-sibling::theta[@false="solid 1px green"][following-sibling::eta[preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:lang="en-GB"][preceding-sibling::*[position() = 4]]/alpha[@xml:id="id9"]][position() = 1]]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <psi src="solid 1px green"> <gamma xml:lang="en-US" xml:id="id1"> @@ -20023,6 +23438,11 @@ </test> <test> <xpath>//phi[contains(concat(@object,"$"),"9$")][@xml:id="id1"]/xi[following-sibling::*[position()=1]][following-sibling::omicron[preceding-sibling::*[position() = 1]]//lambda[not(preceding-sibling::*)][not(child::node())][following-sibling::beta[starts-with(concat(@attribute,"-"),"_blank-")][following-sibling::chi[@xml:id="id2"][following-sibling::sigma[@and][@xml:lang="en"][@xml:id="id3"]/eta[contains(@false,"tr")][@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]/iota[starts-with(concat(@abort,"-"),"solid 1px green-")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@content="content"][not(preceding-sibling::*)]//mu[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="nb"][@xml:id="id7"][not(following-sibling::*)]//mu[@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::mu[contains(@insert,"another")]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <phi object="123456789" xml:id="id1"> <xi/> @@ -20051,6 +23471,11 @@ </test> <test> <xpath>//chi[starts-with(@true,"this.nod")]//sigma[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@insert][@xml:lang="no-nb"][not(child::node())][following-sibling::phi[@title][@xml:lang="en-GB"][following-sibling::pi[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::lambda[starts-with(@data,"_")][@xml:lang="en-GB"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]//iota[@xml:lang="en"][@xml:id="id3"]//lambda[contains(concat(@att,"$"),"100%$")][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <chi true="this.nodeValue"> <sigma xml:id="id1"/> @@ -20072,6 +23497,11 @@ </test> <test> <xpath>//*[@xml:lang="no"]/kappa[starts-with(concat(@title,"-"),"100%-")][@xml:lang="en"][not(child::node())][following-sibling::omicron[starts-with(@attribute,"solid ")][@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]]//alpha[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@attr="false"][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//upsilon[not(preceding-sibling::*)][following-sibling::gamma[contains(@attribute,"ank")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="no"> <kappa title="100%" xml:lang="en"/> @@ -20089,6 +23519,11 @@ </test> <test> <xpath>//lambda[contains(@att,"e")][@xml:lang="en-GB"]//kappa[@object="solid 1px green"][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::lambda[contains(@string,"her attri")][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::rho[@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[starts-with(concat(@true,"-"),"123456789-")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/alpha//zeta[following-sibling::*[position()=1]][following-sibling::*[@data][preceding-sibling::*[position() = 1]]//xi[contains(concat(@abort,"$"),"green$")][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[starts-with(concat(@title,"-"),"123456789-")][@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/psi[contains(@delete,"e")][@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)]/epsilon[@string][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@xml:id="id7"][not(following-sibling::*)]//delta[contains(concat(@abort,"$"),"nother attribute value$")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[@xml:id="id8"][not(following-sibling::*)]/lambda[@xml:lang="nb"][@xml:id="id9"][following-sibling::gamma[@desciption][@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]]/rho[contains(@and,"100")]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <lambda att="true" xml:lang="en-GB"> <kappa object="solid 1px green" xml:lang="nb"/> @@ -20126,6 +23561,11 @@ </test> <test> <xpath>//eta[starts-with(@src,"solid ")][@xml:lang="en-US"]//chi[@xml:id="id1"]//rho[@xml:lang="en-US"][following-sibling::delta[starts-with(@string,"attribut")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::sigma[following-sibling::phi//omicron[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::gamma[not(child::node())][following-sibling::omega[contains(concat(@attr,"$"),"e$")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omega[@class][not(following-sibling::*)]/eta//iota[@xml:lang="no-nb"][not(child::node())][following-sibling::omega[contains(concat(@delete,"$"),"56789$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:lang="en-US"][not(preceding-sibling::*)]//delta[@src][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@delete][following-sibling::mu[@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@attr="123456789"][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]]//delta[contains(concat(@and,"$"),"value$")][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@number][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@string][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <eta src="solid 1px green" xml:lang="en-US"> <chi xml:id="id1"> @@ -20164,6 +23604,11 @@ </test> <test> <xpath>//lambda[@xml:lang="en-US"]/kappa[not(following-sibling::*)]//eta[contains(@abort,"789")][not(preceding-sibling::*)][not(following-sibling::*)]//psi[contains(concat(@or,"$"),"te$")]/phi[not(preceding-sibling::*)]//*[@or="solid 1px green"][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:id="id2"]//omega[starts-with(concat(@delete,"-"),"attribute-")][@xml:lang="en-GB"][following-sibling::mu[@xml:lang="no"][not(following-sibling::*)]/omega[contains(concat(@title,"$"),"ribute value$")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="no"][not(child::node())][following-sibling::nu[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:id="id5"][not(following-sibling::*)]/pi[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[not(preceding-sibling::xi)]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="en-US"> <kappa> @@ -20196,6 +23641,11 @@ </test> <test> <xpath>//omicron[@xml:lang="no"][@xml:id="id1"]//omicron[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::omicron or following-sibling::omicron)]//zeta[starts-with(concat(@src,"-"),"false-")][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[starts-with(concat(@abort,"-"),"123456789-")][not(following-sibling::*)]/iota[following-sibling::kappa[contains(concat(@or,"$"),"ttribute-value$")][@xml:id="id4"][preceding-sibling::*[position() = 1]]/gamma[@true][not(following-sibling::*)]//sigma[@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::rho[@xml:lang="en-US"]//nu[@xml:lang="en"][not(following-sibling::*)]//epsilon[@name][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[starts-with(concat(@data,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)]//xi[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[contains(@number,"00%")][@xml:lang="en-GB"][following-sibling::omicron[contains(@true,"d 1px ")][@xml:id="id8"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <omicron xml:lang="no" xml:id="id1"> <omicron xml:lang="en" xml:id="id2"> @@ -20229,6 +23679,11 @@ </test> <test> <xpath>//theta[@attr][@xml:lang="en-US"][@xml:id="id1"]//epsilon[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::nu[contains(@attr,"-")][preceding-sibling::*[position() = 2]]/epsilon[not(preceding-sibling::*)]//nu[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[@abort][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[@and][@xml:lang="no"]//alpha[starts-with(@desciption,"att")][@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <theta attr="attribute" xml:lang="en-US" xml:id="id1"> <epsilon xml:lang="en" xml:id="id2"/> @@ -20249,6 +23704,11 @@ </test> <test> <xpath>//iota[contains(concat(@or,"$"),"0%$")][@xml:lang="en-GB"][@xml:id="id1"]/upsilon[@data][not(preceding-sibling::*)][following-sibling::eta[starts-with(@attribute,"th")]//xi[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::rho[@and][@xml:id="id4"][following-sibling::delta[starts-with(concat(@abort,"-"),"100%-")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/eta[@xml:lang="en"][following-sibling::iota[following-sibling::nu[preceding-sibling::*[position() = 2]][not(following-sibling::*)]/lambda[contains(concat(@string,"$"),"0%$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@string][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[starts-with(concat(@string,"-"),"another attribute value-")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::rho[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]/chi[not(preceding-sibling::*)][not(child::node())][following-sibling::rho[starts-with(concat(@content,"-"),"100%-")][@xml:lang="no"]//mu[@xml:lang="en-GB"][not(following-sibling::*)]/pi[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[starts-with(@false,"t")][@xml:lang="nb"][not(following-sibling::*)]//rho[@xml:lang="en-US"][not(child::node())][following-sibling::theta[not(following-sibling::*)]/beta[@desciption][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <iota or="100%" xml:lang="en-GB" xml:id="id1"> <upsilon data="100%"/> @@ -20290,6 +23750,11 @@ </test> <test> <xpath>//lambda[@xml:lang="no"][@xml:id="id1"]//tau[contains(@delete,"5678")][@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]//gamma[@xml:lang="en"][not(following-sibling::*)]//nu[@xml:id="id3"][following-sibling::*[position()=2]][following-sibling::sigma[@xml:lang="en-US"][@xml:id="id4"][following-sibling::alpha[@src="content"][@xml:id="id5"]/lambda[not(child::node())][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::nu[starts-with(concat(@title,"-"),"another attribute value-")][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::*[starts-with(@delete,"t")][not(child::node())][following-sibling::lambda[@xml:id="id7"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::xi[starts-with(@src,"_blank")][@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//upsilon[contains(concat(@delete,"$"),"ontent$")][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[contains(@content,"9")][@xml:id="id10"][preceding-sibling::*[position() = 2]]//xi[contains(@abort,"ue")][@xml:lang="no"][@xml:id="id11"][following-sibling::*[position()=4]][not(child::node())][following-sibling::psi[starts-with(concat(@content,"-"),"solid 1px green-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::pi[contains(@delete,"green")][@xml:id="id12"][following-sibling::*[position()=2]][following-sibling::phi[@xml:id="id13"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::pi[contains(@data,"_")]]]][position() = 1]]][position() = 1]]][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="no" xml:id="id1"> <tau delete="123456789" xml:lang="no-nb" xml:id="id2"> @@ -20323,6 +23788,11 @@ </test> <test> <xpath>//tau[@xml:lang="no-nb"]/eta[@data][@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)]//lambda[@xml:lang="nb"][not(following-sibling::*)]//iota[not(following-sibling::*)]//kappa[@or][@xml:id="id2"][not(child::node())][following-sibling::rho[@name="another attribute value"][@xml:lang="no"]/delta[starts-with(concat(@class,"-"),"false-")][@xml:lang="en"][not(preceding-sibling::*)]/eta[@src="another attribute value"][@xml:id="id3"][following-sibling::nu[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[starts-with(@content,"at")][@xml:lang="en-GB"][@xml:id="id4"]//lambda[starts-with(concat(@att,"-"),"this.nodeValue-")][@xml:lang="nb"][not(preceding-sibling::*)]//beta[@insert="attribute value"][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[@xml:lang="no"][following-sibling::theta[starts-with(@or,"attribu")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@class][@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[starts-with(concat(@att,"-"),"123456789-")][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@xml:lang="no"][following-sibling::upsilon[@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 2]][following-sibling::epsilon[@or][not(child::node())][following-sibling::omega[@xml:id="id8"][preceding-sibling::*[position() = 4]][not(preceding-sibling::omega)]/iota[@xml:lang="nb"][@xml:id="id9"][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no-nb"> <eta data="this-is-att-value" xml:lang="nb" xml:id="id1"> @@ -20367,6 +23837,11 @@ </test> <test> <xpath>//eta/iota[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(preceding-sibling::iota)]//theta[contains(concat(@true,"$"),"en$")][@xml:lang="no-nb"][not(following-sibling::*)]//delta[contains(concat(@number,"$"),"blank$")][@xml:lang="en"][@xml:id="id2"]/eta[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[starts-with(concat(@title,"-"),"solid 1px green-")][@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::*[starts-with(@content,"anoth")][@xml:lang="en-US"][@xml:id="id5"][not(child::node())][following-sibling::gamma[@and="another attribute value"][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[@class="this-is-att-value"][@xml:id="id6"][not(preceding-sibling::*)]//theta[contains(@title,"%")][@xml:lang="no-nb"][not(child::node())][following-sibling::pi[@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::psi[contains(@delete,"tru")][following-sibling::*[position()=2]][following-sibling::kappa[@att="another attribute value"][preceding-sibling::*[position() = 3]][following-sibling::alpha[@xml:lang="no-nb"]//gamma]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <eta> <iota xml:lang="en-GB" xml:id="id1"> @@ -20397,6 +23872,11 @@ </test> <test> <xpath>//sigma[contains(concat(@attribute,"$"),"bute value$")][@xml:id="id1"]//epsilon[contains(concat(@false,"$"),"e$")][@xml:lang="nb"][@xml:id="id2"]/alpha[following-sibling::*[@attribute][not(child::node())][following-sibling::*[@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omega/theta[not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id4"][not(child::node())][following-sibling::zeta[@attribute]//xi[starts-with(@name,"this-is-at")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@false][@xml:lang="en-US"][not(child::node())][following-sibling::epsilon[@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@name][@xml:id="id7"]//gamma[following-sibling::lambda[@xml:lang="nb"]/mu[starts-with(concat(@and,"-"),"false-")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="no-nb"]//lambda[@xml:lang="nb"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[contains(@and,"e")][following-sibling::gamma[@insert][@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]][position() = 1]][position() = 1]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <sigma attribute="another attribute value" xml:id="id1"> <epsilon false="false" xml:lang="nb" xml:id="id2"> @@ -20435,6 +23915,11 @@ </test> <test> <xpath>//beta[contains(concat(@desciption,"$"),"e$")][@xml:lang="en"][@xml:id="id1"]/theta[contains(concat(@desciption,"$"),"23456789$")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]/psi[starts-with(@data,"fal")][@xml:lang="en-GB"][@xml:id="id3"]/iota[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::omicron[starts-with(@false,"attribut")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]/xi[@token="attribute"][@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <beta desciption="true" xml:lang="en" xml:id="id1"> <theta desciption="123456789" xml:lang="en" xml:id="id2"> @@ -20452,6 +23937,11 @@ </test> <test> <xpath>//iota[starts-with(concat(@and,"-"),"solid 1px green-")]//psi//theta[not(preceding-sibling::*)][following-sibling::alpha[@desciption="_blank"][following-sibling::*[position()=2]][following-sibling::sigma[@xml:lang="en-GB"][following-sibling::kappa[contains(concat(@true,"$"),"en$")][@xml:lang="no"][@xml:id="id1"]//pi[@class="solid 1px green"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::pi)]//upsilon[starts-with(concat(@token,"-"),"123456789-")][@xml:lang="no"][not(following-sibling::*)]//phi[@insert][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::kappa[contains(concat(@delete,"$"),"alue$")][@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::*[@xml:lang="no-nb"][not(preceding-sibling::any)]//rho[@false][following-sibling::chi[contains(concat(@attrib,"$"),"lid 1px green$")][@xml:lang="en-US"][following-sibling::*[position()=3]][following-sibling::epsilon[@xml:lang="no"][preceding-sibling::*[position() = 2]][following-sibling::beta[@xml:lang="en"][@xml:id="id5"][not(child::node())][following-sibling::omicron[contains(concat(@attr,"$")," value$")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <iota and="solid 1px green"> <psi> @@ -20481,6 +23971,11 @@ </test> <test> <xpath>//xi[@attrib="attribute-value"][@xml:lang="no-nb"]/beta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]][following-sibling::mu[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::upsilon[@att][not(child::node())][following-sibling::beta[@true="123456789"][@xml:lang="nb"]/eta[not(preceding-sibling::*)][not(following-sibling::*)]//theta[starts-with(concat(@class,"-"),"attribute value-")][@xml:lang="no-nb"][not(child::node())][following-sibling::*[@xml:lang="en-GB"][not(following-sibling::*)]/*[starts-with(@token,"solid ")][not(following-sibling::*)]/tau[contains(concat(@class,"$"),"_blank$")][@xml:lang="en-GB"][@xml:id="id1"][following-sibling::eta[starts-with(@token,"t")][@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//theta[@or][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[not(following-sibling::*)]//rho[@and="attribute value"][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[not(following-sibling::*)]/omicron[starts-with(concat(@string,"-"),"content-")][@xml:lang="nb"][not(preceding-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <xi attrib="attribute-value" xml:lang="no-nb"> <beta xml:lang="en-GB"/> @@ -20514,6 +24009,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en"][@xml:id="id1"]//lambda[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[contains(@insert,"is-is-att-value")][@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)][not(preceding-sibling::xi)]/omega[@xml:id="id3"][not(following-sibling::*)]//alpha[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[contains(@token,"%")][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en" xml:id="id1"> <lambda xml:lang="nb"/> @@ -20531,6 +24031,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]//iota[contains(@object,"%")][not(preceding-sibling::*)][not(child::node())][following-sibling::*[contains(concat(@attrib,"$"),"value$")][@xml:id="id2"]/phi[contains(@attrib,"ent")][@xml:lang="en"]/eta[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@xml:lang="no-nb"][not(child::node())][following-sibling::xi[@xml:lang="nb"][not(following-sibling::*)]/delta[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="en-US"][@xml:id="id4"][following-sibling::omicron[contains(@name,"9")][@xml:lang="nb"]//epsilon[@number][@xml:id="id5"][not(child::node())][following-sibling::zeta[@true][@xml:lang="en-GB"][following-sibling::*[position()=7]][not(child::node())][following-sibling::theta[starts-with(concat(@insert,"-"),"true-")][preceding-sibling::*[position() = 2]][following-sibling::*[position()=6]][following-sibling::eta[@attrib="false"][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=5]][following-sibling::omicron[starts-with(concat(@content,"-"),"attribute-")][@xml:id="id7"][not(child::node())][following-sibling::zeta[@xml:id="id8"][not(child::node())][following-sibling::gamma[@desciption="true"][@xml:id="id9"][preceding-sibling::*[position() = 6]][following-sibling::kappa[@xml:id="id10"][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][not(following-sibling::*)]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <psi xml:id="id1"> <iota object="100%"/> @@ -20562,6 +24067,11 @@ </test> <test> <xpath>//sigma[@xml:lang="en-US"]/zeta[@xml:lang="en"][not(child::node())][following-sibling::theta[@token][@xml:lang="nb"][not(preceding-sibling::theta or following-sibling::theta)][not(child::node())][following-sibling::psi[contains(@token,"ribu")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::epsilon[@xml:id="id1"][preceding-sibling::*[position() = 3]][following-sibling::upsilon[@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::chi[contains(concat(@or,"$"),"blank$")][@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 5]][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="en-US"> <zeta xml:lang="en"/> @@ -20577,6 +24087,11 @@ </test> <test> <xpath>//omega[@xml:lang="en-GB"]/psi[@xml:id="id1"][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@xml:lang="nb"][not(following-sibling::*)]/rho[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[starts-with(@insert,"thi")][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::alpha[not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en-GB"> <psi xml:id="id1"/> @@ -20594,6 +24109,11 @@ </test> <test> <xpath>//xi[contains(@attr,"tru")][@xml:lang="en-US"][@xml:id="id1"]/theta[not(following-sibling::*)]//omega[contains(@object,"this")][@xml:id="id2"][not(preceding-sibling::*)]/zeta[contains(concat(@title,"$"),"nk$")][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::iota[@xml:lang="no-nb"][not(following-sibling::*)]//pi[@xml:id="id4"][not(child::node())][following-sibling::nu[@attrib][@xml:lang="nb"][@xml:id="id5"][following-sibling::omega[contains(@and,"e")][@xml:lang="en"][following-sibling::iota[@xml:lang="en-GB"][not(following-sibling::*)]//beta[@xml:lang="no"][following-sibling::sigma[contains(concat(@false,"$"),"k$")][not(child::node())][following-sibling::sigma[@string="attribute-value"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@or="attribute"][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/iota[starts-with(@name,"attrib")][@xml:id="id8"][not(child::node())][following-sibling::theta[@content][@xml:id="id9"]]][position() = 1]]]]]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <xi attr="true" xml:lang="en-US" xml:id="id1"> <theta> @@ -20623,6 +24143,11 @@ </test> <test> <xpath>//sigma[@token]//eta[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[@number][@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//omicron[@data][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::lambda[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::tau[not(following-sibling::*)]/lambda[@xml:id="id4"][not(preceding-sibling::*)]/mu[starts-with(@title,"s")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omicron[@src][@xml:lang="no"][not(child::node())][following-sibling::psi[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:lang="no-nb"][not(following-sibling::*)]/beta[contains(concat(@token,"$"),"r attribute value$")][@xml:lang="no-nb"][not(preceding-sibling::*)]//chi[@token][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@title="false"][@xml:lang="en-US"][@xml:id="id7"]//lambda[@desciption][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:lang="en-US"][not(following-sibling::*)]//iota/mu[@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:id="id9"][not(child::node())][following-sibling::gamma[contains(concat(@string,"$"),"tent$")][@xml:lang="nb"][@xml:id="id10"]/lambda[@desciption][@xml:lang="en"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::xi[@xml:id="id12"][preceding-sibling::*[position() = 1]][not(following-sibling::xi)][following-sibling::theta[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id13"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <sigma token="attribute value"> <eta xml:lang="no" xml:id="id1"/> @@ -20668,6 +24193,11 @@ </test> <test> <xpath>//omicron[@xml:id="id1"]/phi[contains(concat(@title,"$"),"1px green$")][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]//tau[@xml:id="id3"][not(child::node())][following-sibling::delta[@true="true"][not(following-sibling::*)]//epsilon[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@xml:lang="no"][following-sibling::psi[@number][@xml:lang="nb"][following-sibling::gamma[following-sibling::zeta[contains(concat(@object,"$"),"%$")][@xml:lang="nb"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[starts-with(@att,"f")][not(preceding-sibling::sigma)]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <omicron xml:id="id1"> <phi title="solid 1px green" xml:lang="nb" xml:id="id2"> @@ -20689,6 +24219,11 @@ </test> <test> <xpath>//sigma[@xml:lang="no"]//lambda[following-sibling::*[position()=1]][following-sibling::phi[@content="this.nodeValue"][@xml:lang="no-nb"][@xml:id="id1"][not(following-sibling::*)]//theta[@abort][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@data][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[starts-with(concat(@number,"-"),"true-")][@xml:id="id3"][not(following-sibling::zeta)][not(child::node())][following-sibling::beta[@xml:id="id4"][not(following-sibling::*)]/rho[@xml:lang="nb"]//zeta[@content="attribute"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::beta[contains(concat(@attribute,"$"),"n$")][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]//sigma[contains(concat(@class,"$"),"789$")][@xml:lang="en-US"]/eta[@number][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:id="id8"][preceding-sibling::*[position() = 1]]/omicron[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::iota[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//theta[@xml:lang="en-US"][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="no"> <lambda/> @@ -20721,6 +24256,11 @@ </test> <test> <xpath>//nu[@xml:lang="no-nb"][@xml:id="id1"]//omega[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@delete][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]]/lambda[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@xml:id="id3"][not(child::node())][following-sibling::alpha[@title][@xml:lang="no"][@xml:id="id4"]//delta[not(preceding-sibling::*)][not(following-sibling::*)]//eta[@att][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[not(preceding-sibling::*)]//psi[@and="false"][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@attribute][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::nu[starts-with(concat(@token,"-"),"123456789-")][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::delta[following-sibling::mu[@data="another attribute value"]//omega[@data][@xml:lang="en-US"][not(preceding-sibling::*)]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="no-nb" xml:id="id1"> <omega xml:lang="no-nb"> @@ -20754,6 +24294,11 @@ </test> <test> <xpath>//kappa//kappa[contains(concat(@false,"$"),"tent$")][@xml:id="id1"][not(child::node())][following-sibling::iota[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@att]//sigma[@xml:lang="en"][@xml:id="id2"][not(child::node())][following-sibling::delta[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[contains(concat(@name,"$"),"ue$")][not(preceding-sibling::*)][following-sibling::lambda[starts-with(concat(@token,"-"),"100%-")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::upsilon[starts-with(@attr,"solid 1px gr")][@xml:lang="en-US"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>1</nth> + </result> <tree> <kappa> <kappa false="content" xml:id="id1"/> @@ -20774,6 +24319,11 @@ </test> <test> <xpath>//chi[starts-with(concat(@name,"-"),"solid 1px green-")]/xi[@xml:id="id1"][not(following-sibling::*)]//tau[@xml:lang="en-US"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[contains(@and,"00%")][@xml:id="id3"]/beta[@xml:id="id4"][following-sibling::gamma[@xml:lang="en"][@xml:id="id5"][following-sibling::epsilon[@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[starts-with(concat(@attr,"-"),"true-")][@xml:lang="no"][not(preceding-sibling::nu)][following-sibling::eta[contains(@content,"een")][@xml:lang="no"][preceding-sibling::*[position() = 1]]/iota[@xml:lang="no"][following-sibling::*[position()=1]][following-sibling::iota[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/theta[@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::sigma[@desciption="true"][@xml:id="id8"]//kappa[contains(@insert,"ri")][not(preceding-sibling::*)][following-sibling::omega[starts-with(concat(@false,"-"),"true-")]//mu[contains(@false,"ru")][@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::omicron[@xml:lang="nb"][@xml:id="id9"][not(child::node())][following-sibling::iota[@xml:lang="nb"][not(following-sibling::*)]//alpha[@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[contains(@src,"nt")][preceding-sibling::*[position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <chi name="solid 1px green"> <xi xml:id="id1"> @@ -20810,6 +24360,11 @@ </test> <test> <xpath>//beta[@xml:id="id1"]//iota[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]/iota[@xml:lang="no-nb"][not(preceding-sibling::*)]//epsilon[@xml:lang="en"][not(preceding-sibling::*)]/lambda[not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)]//delta[@false][@xml:lang="no-nb"]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <beta xml:id="id1"> <iota xml:lang="en-US" xml:id="id2"> @@ -20830,6 +24385,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]/beta[starts-with(@attrib,"solid 1px gr")][following-sibling::tau[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::psi[@string][@xml:lang="no-nb"][@xml:id="id3"][not(child::node())][following-sibling::alpha[@delete][@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 4]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <beta attrib="solid 1px green"/> @@ -20844,6 +24404,11 @@ </test> <test> <xpath>//iota[contains(concat(@token,"$"),"false$")][@xml:lang="en"][@xml:id="id1"]/lambda[@number="true"][@xml:id="id2"]/upsilon[@token][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[@xml:lang="nb"][not(following-sibling::*)]/eta[not(preceding-sibling::*)][following-sibling::nu[starts-with(concat(@object,"-"),"solid 1px green-")][@xml:id="id3"][preceding-sibling::*[position() = 1]]/nu[@src][not(following-sibling::*)]/tau[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[not(following-sibling::*)]//tau[starts-with(@false,"th")]//mu[starts-with(@delete,"a")][@xml:lang="nb"][@xml:id="id5"]//lambda[starts-with(concat(@and,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)]/nu[contains(concat(@string,"$"),"tent$")][@xml:lang="no"][not(preceding-sibling::*)]//chi[position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <iota token="false" xml:lang="en" xml:id="id1"> <lambda number="true" xml:id="id2"> @@ -20875,6 +24440,11 @@ </test> <test> <xpath>//mu//lambda[starts-with(@attr,"100")][@xml:lang="no-nb"][@xml:id="id1"]/chi[@xml:id="id2"][not(child::node())][following-sibling::beta[@delete="true"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@src="solid 1px green"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::sigma[not(child::node())][following-sibling::rho[starts-with(@attribute,"attribu")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[starts-with(@abort,"this.nodeV")][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[contains(concat(@attrib,"$"),"lue$")]/chi[@abort="false"][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::nu[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::mu[@xml:id="id6"]/beta[following-sibling::kappa[starts-with(concat(@object,"-"),"this-")][@xml:lang="en-US"][@xml:id="id7"][not(child::node())][following-sibling::rho[@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::sigma[@title][@xml:id="id9"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//xi[@false][not(preceding-sibling::*)][following-sibling::pi[@xml:id="id10"][preceding-sibling::*[position() = 1]]//nu[starts-with(@attribute,"conte")][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::psi[starts-with(concat(@number,"-"),"true-")][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@true="123456789"][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::rho[@xml:lang="en-US"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]]][position() = 1]]]]]]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <mu> <lambda attr="100%" xml:lang="no-nb" xml:id="id1"> @@ -20912,6 +24482,11 @@ </test> <test> <xpath>//xi[@attrib]//delta[@xml:lang="no-nb"][not(preceding-sibling::*)]/gamma[not(following-sibling::*)]//beta[contains(concat(@title,"$"),"odeValue$")][@xml:id="id1"]/omega[contains(@true,"ribute value")][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id2"]/chi[@xml:lang="en"][not(following-sibling::*)][not(parent::*/*[position()=2])]/rho[@insert][@xml:lang="no"][following-sibling::iota[following-sibling::upsilon[starts-with(@abort,"this.nodeVal")][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <xi attrib="attribute-value"> <delta xml:lang="no-nb"> @@ -20936,6 +24511,11 @@ </test> <test> <xpath>//mu//epsilon[@attrib="123456789"][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 1]]/gamma[@xml:id="id2"][not(child::node())][following-sibling::rho[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::kappa[@xml:lang="no"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::zeta[contains(@and,"123456")][@xml:lang="en-US"][following-sibling::chi[contains(concat(@or,"$"),"odeValue$")][preceding-sibling::*[position() = 5]]/lambda[starts-with(@object,"1")][@xml:id="id5"][not(following-sibling::*)]/theta[not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <mu> <epsilon attrib="123456789" xml:id="id1"/> @@ -20959,6 +24539,11 @@ </test> <test> <xpath>//sigma[@xml:id="id1"]/gamma[@xml:lang="en-US"][following-sibling::*[position()=1]][following-sibling::nu//alpha[@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=3]][not(child::node())][following-sibling::tau[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[not(child::node())][following-sibling::gamma/kappa[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[not(child::node())][following-sibling::xi[@xml:lang="en-US"][@xml:id="id3"]//beta[@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[starts-with(@string,"fal")][@xml:lang="en"][following-sibling::*[position()=3]][not(child::node())][following-sibling::epsilon[contains(@name,"eVal")][@xml:lang="en-GB"][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[not(child::node())][following-sibling::iota[@delete][@xml:lang="en-US"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//eta[not(preceding-sibling::*)][following-sibling::eta[@number][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//gamma[contains(@token,"ank")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)]//omega[not(following-sibling::*)]/delta[@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <sigma xml:id="id1"> <gamma xml:lang="en-US"/> @@ -20996,6 +24581,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]//epsilon[not(preceding-sibling::*)][following-sibling::pi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omicron[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[not(child::node())][following-sibling::epsilon[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::tau[@xml:lang="nb"][preceding-sibling::*[position() = 2]]//iota[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::iota[@token="100%"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[@xml:id="id5"][preceding-sibling::*[position() = 2]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <alpha xml:id="id1"> <epsilon/> @@ -21017,6 +24607,11 @@ </test> <test> <xpath>//omicron[@number]/tau[@xml:lang="en-GB"][not(preceding-sibling::*)][not(preceding-sibling::tau or following-sibling::tau)][following-sibling::iota[starts-with(concat(@class,"-"),"true-")][preceding-sibling::*[position() = 1]][following-sibling::nu[@xml:id="id1"][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 3]][following-sibling::pi[contains(@desciption,"0")][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/sigma[@token][following-sibling::eta[contains(concat(@object,"$"),"her attribute value$")][@xml:lang="en-US"][@xml:id="id2"]//rho[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)]//*[contains(concat(@att,"$"),"ute value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@desciption]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <omicron number="another attribute value"> <tau xml:lang="en-GB"/> @@ -21039,6 +24634,11 @@ </test> <test> <xpath>//delta[contains(concat(@class,"$"),"9$")][@xml:lang="nb"]/mu[@xml:lang="no"][not(preceding-sibling::*)]/phi[starts-with(concat(@string,"-"),"attribute-")][@xml:lang="no"][@xml:id="id1"][not(child::node())][following-sibling::theta[contains(concat(@class,"$"),"tribute value$")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::mu[following-sibling::phi[@delete][@xml:id="id4"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::chi[@xml:lang="no"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]//chi[@class="solid 1px green"][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]/zeta[@object="_blank"][@xml:lang="en-GB"]/*[not(preceding-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <delta class="123456789" xml:lang="nb"> <mu xml:lang="no"> @@ -21064,6 +24664,11 @@ </test> <test> <xpath>//theta[@xml:lang="nb"]/kappa[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[contains(@number,"his-is-at")][not(following-sibling::*)]//epsilon[@attrib][@xml:id="id2"][not(following-sibling::*)]//tau[@number][@xml:lang="en"][not(following-sibling::*)]//beta[starts-with(concat(@attr,"-"),"123456789-")][@xml:id="id3"][not(following-sibling::*)]//kappa[@xml:id="id4"][not(child::node())][following-sibling::epsilon[starts-with(@abort,"solid 1px gr")][@xml:id="id5"][not(child::node())][following-sibling::beta[not(following-sibling::*)]//nu/iota[not(preceding-sibling::*)]/eta[starts-with(concat(@data,"-"),"100%-")][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@attr][@xml:lang="no"][not(child::node())][following-sibling::omega[contains(@false,"tent")][preceding-sibling::*[position() = 2]]//upsilon[starts-with(@insert,"false")][@xml:lang="en-US"]//lambda[@attribute][@xml:lang="no-nb"][@xml:id="id6"][not(child::node())][following-sibling::kappa[@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][following-sibling::zeta[starts-with(concat(@true,"-"),"content-")][@xml:id="id8"][following-sibling::*[position()=4]][following-sibling::pi[preceding-sibling::*[position() = 3]][following-sibling::omega[starts-with(@attribute,"so")][not(child::node())][following-sibling::sigma[@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::psi[@xml:lang="en-GB"][preceding-sibling::*[position() = 6]][not(following-sibling::*)]/beta[@xml:lang="en"]/psi[@xml:lang="nb"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>1</nth> + </result> <tree> <theta xml:lang="nb"> <kappa xml:id="id1"> @@ -21108,6 +24713,11 @@ </test> <test> <xpath>//omega/epsilon[@insert][not(child::node())][following-sibling::zeta[starts-with(concat(@string,"-"),"attribute value-")][@xml:id="id1"][not(child::node())][following-sibling::gamma[starts-with(@false,"this-is-att-")][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/pi[not(preceding-sibling::*)][following-sibling::phi[@content][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[contains(@true," 1px green")][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 3]]//zeta[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)]//iota[contains(@token,"se")][@xml:id="id8"][not(child::node())][following-sibling::xi[starts-with(concat(@insert,"-"),"another attribute value-")][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[contains(@object,"te")][@xml:id="id10"][not(child::node())][following-sibling::psi[@xml:lang="nb"][following-sibling::nu[contains(concat(@content,"$"),"ute$")][@xml:lang="no-nb"][following-sibling::nu[starts-with(@string,"solid 1px gre")][@xml:lang="en-GB"][@xml:id="id11"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <omega> <epsilon insert="attribute"/> @@ -21136,6 +24746,11 @@ </test> <test> <xpath>//*[@string]/chi//mu[@name][@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[contains(@desciption,"b")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::tau[contains(concat(@att,"$"),"true$")][following-sibling::upsilon[contains(@attr,"nk")][@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::xi[contains(concat(@class,"$"),"se$")][@xml:lang="en-GB"][following-sibling::*[@xml:id="id4"][preceding-sibling::*[position() = 4]]/lambda[@xml:lang="en"][@xml:id="id5"]//beta[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@delete][following-sibling::psi[@xml:lang="no-nb"][@xml:id="id7"]/psi[@xml:id="id8"][not(preceding-sibling::*)]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <any string="this-is-att-value"> <chi> @@ -21162,6 +24777,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en"][@xml:id="id1"]/theta[contains(concat(@data,"$"),"e$")][not(preceding-sibling::*)][following-sibling::rho[@xml:lang="nb"][preceding-sibling::*[position() = 1]]//tau[@token][@xml:lang="no"][following-sibling::iota[@xml:lang="en-US"][@xml:id="id2"][following-sibling::tau[@attr][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//eta[@xml:lang="no"][following-sibling::*[position()=3]][not(child::node())][following-sibling::lambda[starts-with(concat(@abort,"-"),"this-")][@xml:lang="nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::alpha)][following-sibling::delta[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 3]]//omega/*[starts-with(@false,"so")][not(preceding-sibling::*)][following-sibling::iota[@xml:id="id5"][not(child::node())][following-sibling::alpha[@attr="attribute-value"][@xml:id="id6"][following-sibling::pi[starts-with(concat(@attr,"-"),"another attribute value-")][preceding-sibling::*[position() = 3]][following-sibling::omega/zeta[@xml:lang="no-nb"][not(preceding-sibling::*)]//lambda[@and][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en" xml:id="id1"> <theta data="false"/> @@ -21196,6 +24816,11 @@ </test> <test> <xpath>//epsilon[starts-with(concat(@attr,"-"),"this-")][@xml:lang="no-nb"]//sigma[@delete="solid 1px green"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[contains(concat(@title,"$"),"e$")][@xml:id="id2"][not(following-sibling::*)]//chi[starts-with(concat(@class,"-"),"this-")]//chi[contains(@token,"12")][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[contains(concat(@string,"$"),"te value$")][@xml:lang="no"][not(preceding-sibling::*)]/omega[@and][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omega[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::alpha[not(following-sibling::*)]//lambda[@object][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <epsilon attr="this-is-att-value" xml:lang="no-nb"> <sigma delete="solid 1px green" xml:id="id1"> @@ -21222,6 +24847,11 @@ </test> <test> <xpath>//omega[@xml:lang="no"]//iota[@xml:lang="en"][@xml:id="id1"]//nu[@xml:lang="nb"]//nu[@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::nu[@xml:lang="no-nb"][@xml:id="id2"][following-sibling::epsilon[preceding-sibling::*[position() = 2]]//lambda[not(child::node())][following-sibling::beta[@true="attribute"][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@xml:lang="en-GB"]/sigma[starts-with(concat(@string,"-"),"attribute-")][@xml:lang="en"]/psi[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[contains(concat(@attr,"$"),"ue$")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/epsilon[starts-with(concat(@data,"-"),"solid 1px green-")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>1</nth> + </result> <tree> <omega xml:lang="no"> <iota xml:lang="en" xml:id="id1"> @@ -21251,6 +24881,11 @@ </test> <test> <xpath>//xi/beta[@number][@xml:id="id1"][not(child::node())][following-sibling::theta[@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@and][@xml:id="id3"][not(following-sibling::*)][not(preceding-sibling::alpha)]//delta[following-sibling::*[position()=1]][following-sibling::delta[contains(concat(@token,"$"),"t$")][@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)]/alpha[following-sibling::*[position()=1]][following-sibling::pi[@string][preceding-sibling::*[position() = 1]]//mu[@class="123456789"][@xml:lang="en"][@xml:id="id5"]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <xi> <beta number="attribute-value" xml:id="id1"/> @@ -21271,6 +24906,11 @@ </test> <test> <xpath>//phi[@xml:lang="no"]/psi[not(preceding-sibling::*)][not(child::node())][following-sibling::tau[starts-with(concat(@content,"-"),"100%-")]//gamma[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]/chi[@and][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::pi[position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="no"> <psi/> @@ -21288,6 +24928,11 @@ </test> <test> <xpath>//sigma/zeta[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[@class="100%"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id3"][not(following-sibling::*)]//iota[@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::rho[@xml:lang="en"][@xml:id="id5"]//zeta[@abort="attribute"][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[starts-with(concat(@true,"-"),"attribute-")][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//alpha[@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@xml:lang="en"][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id8"]//omicron[starts-with(@name,"attribute-value")][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[contains(@number,"tent")][@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(@att,"ibute valu")][@xml:lang="en-US"][not(child::node())][following-sibling::gamma[contains(concat(@object,"$"),"te value$")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <sigma> <zeta xml:id="id1"/> @@ -21317,6 +24962,11 @@ </test> <test> <xpath>//mu[@object="100%"][@xml:lang="no-nb"]//psi[@name][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)]//iota[following-sibling::kappa[@src][following-sibling::mu[following-sibling::*[position()=5]][following-sibling::upsilon[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::chi[following-sibling::iota[@xml:lang="nb"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::eta[@xml:lang="en"][preceding-sibling::*[position() = 6]][following-sibling::chi[starts-with(@attrib,"123")][@xml:lang="no"][preceding-sibling::*[position() = 7]]/omega[@or][@xml:lang="en-GB"][following-sibling::*[position()=2]][following-sibling::mu[@delete][following-sibling::*[position()=1]][following-sibling::kappa[contains(concat(@object,"$"),"%$")][@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]//alpha[@xml:lang="en"][@xml:id="id3"]//eta[@desciption][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(concat(@false,"-"),"true-")][preceding-sibling::*[position() = 1]]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <mu object="100%" xml:lang="no-nb"> <psi name="another attribute value" xml:lang="en-GB" xml:id="id1"> @@ -21345,6 +24995,11 @@ </test> <test> <xpath>//nu[@and][@xml:lang="en-GB"]//nu[@xml:id="id1"][not(child::node())][following-sibling::eta[@insert][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[starts-with(@abort,"solid 1px ")][@xml:id="id2"][preceding-sibling::*[position() = 2]]/xi[@xml:lang="en-GB"][not(following-sibling::*)]/psi[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::psi)]//mu[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[following-sibling::*[position()=3]][not(child::node())][following-sibling::delta[not(child::node())][following-sibling::xi[@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::theta[preceding-sibling::*[position() = 4]][not(following-sibling::*)]//eta[not(following-sibling::*)]/beta[contains(concat(@data,"$"),"alse$")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]/lambda[@attribute="true"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::beta[@xml:lang="en-US"][@xml:id="id8"][position() = 1]][position() = 1]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>1</nth> + </result> <tree> <nu and="attribute value" xml:lang="en-GB"> <nu xml:id="id1"/> @@ -21375,6 +25030,11 @@ </test> <test> <xpath>//theta[@xml:lang="nb"][@xml:id="id1"]/epsilon[@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]/phi[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::phi)]/upsilon[@and="this.nodeValue"][@xml:lang="no-nb"][not(following-sibling::*)]//mu[starts-with(@object,"attri")][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::psi[@xml:lang="no-nb"][not(following-sibling::*)]//phi[@string][not(following-sibling::*)]/alpha[starts-with(concat(@name,"-"),"content-")][not(following-sibling::*)]/delta[@title][@xml:lang="no"][following-sibling::*[@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@false][preceding-sibling::*[position() = 2]]/psi[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::delta[starts-with(@attribute,"t")][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//mu[@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[contains(concat(@abort,"$"),"this.nodeValue$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="nb" xml:id="id1"> <epsilon xml:lang="en" xml:id="id2"> @@ -21408,6 +25068,11 @@ </test> <test> <xpath>//lambda[contains(@desciption,"als")]/zeta[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)]//beta[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::rho[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[starts-with(concat(@and,"-"),"another attribute value-")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[starts-with(@object,"attr")][@xml:lang="en-GB"][@xml:id="id3"]/epsilon[@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[contains(concat(@abort,"$"),"e$")][@xml:id="id5"][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <lambda desciption="false"> <zeta xml:lang="en" xml:id="id1"> @@ -21428,6 +25093,11 @@ </test> <test> <xpath>//eta[contains(concat(@name,"$"),"en$")][@xml:lang="no-nb"]/lambda[starts-with(@abort,"attrib")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@and="attribute value"][@xml:id="id2"][not(following-sibling::*)]/eta[contains(@class,"ribute-value")][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:id="id3"]//zeta[contains(concat(@or,"$"),"alue$")][not(preceding-sibling::*)]//nu[contains(concat(@delete,"$"),"00%$")][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@attr]/omicron[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::phi[@xml:id="id4"][preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <eta name="solid 1px green" xml:lang="no-nb"> <lambda abort="attribute-value" xml:id="id1"/> @@ -21450,6 +25120,11 @@ </test> <test> <xpath>//nu[@object][@xml:lang="en-GB"]/iota[starts-with(@desciption,"sol")][@xml:lang="no"][@xml:id="id1"]//iota[contains(@delete,"lan")][@xml:lang="nb"][not(child::node())][following-sibling::kappa[@true]/phi[not(preceding-sibling::*)]/zeta[starts-with(concat(@true,"-"),"true-")][@xml:lang="no-nb"][not(preceding-sibling::*)]//omega[contains(@insert,"lue")][@xml:id="id2"][not(following-sibling::*)]/lambda[contains(concat(@object,"$"),"ntent$")][@xml:lang="no"][not(preceding-sibling::lambda)]/kappa[@object][@xml:id="id3"]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>1</nth> + </result> <tree> <nu object="100%" xml:lang="en-GB"> <iota desciption="solid 1px green" xml:lang="no" xml:id="id1"> @@ -21473,6 +25148,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="en-US"]//tau[starts-with(@content,"content")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@xml:lang="en"][@xml:id="id1"]/*[@token][@xml:lang="en-US"][following-sibling::lambda[@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=7]][not(child::node())][following-sibling::*[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::alpha[contains(concat(@src,"$"),"lse$")][@xml:lang="en"][not(child::node())][following-sibling::gamma[@content][@xml:id="id3"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::beta[@attrib][@xml:lang="no"][not(child::node())][following-sibling::delta[@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 7]][following-sibling::sigma[@token][not(following-sibling::*)]//kappa[@or="this.nodeValue"][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/*[contains(@data,"lse")][@xml:lang="nb"]/chi[@xml:lang="no"][@xml:id="id6"][following-sibling::gamma[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[starts-with(@object,"thi")][not(child::node())][following-sibling::lambda[@xml:lang="nb"][not(following-sibling::*)]/gamma[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]]]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="en-US"> <tau content="content" xml:lang="en-GB"> @@ -21506,6 +25186,11 @@ </test> <test> <xpath>//iota[contains(@or,"node")][@xml:lang="en-US"]/epsilon[@false][not(following-sibling::*)]/chi[starts-with(concat(@abort,"-"),"false-")][not(preceding-sibling::*)][not(following-sibling::*)]/phi[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::rho[starts-with(@desciption,"attribute ")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::pi[not(child::node())][following-sibling::phi[@number]/iota[@delete][not(preceding-sibling::*)]/gamma[starts-with(concat(@insert,"-"),"this.nodeValue-")][@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:id="id2"]/chi[contains(concat(@name,"$"),"ontent$")][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[contains(concat(@class,"$"),"e value$")][@xml:id="id3"]//beta[@true="attribute"][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]/eta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <iota or="this.nodeValue" xml:lang="en-US"> <epsilon false="another attribute value"> @@ -21536,6 +25221,11 @@ </test> <test> <xpath>//iota[@xml:lang="en-GB"]/kappa[contains(@abort,"alue")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[starts-with(concat(@attribute,"-"),"attribute value-")][not(child::node())][following-sibling::theta[@string="attribute value"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="en-GB"][not(following-sibling::*)]//psi[not(preceding-sibling::*)][not(following-sibling::*)]/alpha[@xml:id="id4"][following-sibling::eta[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//nu[contains(concat(@att,"$"),"e$")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="no"][@xml:id="id6"]/gamma[@xml:id="id7"][not(preceding-sibling::*)]/rho[@or][@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[preceding-sibling::*[position() = 1]]/lambda[not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@content="attribute"][@xml:id="id9"][not(following-sibling::*)]//rho[starts-with(@string,"attribute value")][@xml:lang="no"][not(following-sibling::*)][not(following-sibling::rho)]/psi[@attrib][@xml:lang="no-nb"][@xml:id="id10"][not(child::node())][following-sibling::zeta[@delete="this-is-att-value"][@xml:lang="en-GB"][not(child::node())][following-sibling::omega[starts-with(@src,"attribute va")][@xml:id="id11"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="en-GB"> <kappa abort="another attribute value" xml:id="id1"> @@ -21575,6 +25265,11 @@ </test> <test> <xpath>//psi[@xml:lang="en"]/*[@xml:lang="en-GB"][not(following-sibling::*)]/*[contains(concat(@string,"$"),"false$")][@xml:lang="en"][not(preceding-sibling::*)]/omega[@att="this.nodeValue"][following-sibling::*[position()=1]][following-sibling::delta[starts-with(@attrib,"tr")][@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[@xml:lang="no"][not(preceding-sibling::*)]//tau[contains(concat(@name,"$"),"ue$")][@xml:id="id2"][not(preceding-sibling::*)]/rho[@or][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[not(preceding-sibling::*)][following-sibling::theta[@attr][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/*[starts-with(concat(@class,"-"),"solid 1px green-")][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[not(following-sibling::*)]//*[starts-with(@data,"10")][@xml:lang="nb"][not(following-sibling::*)]/kappa[@title="100%"][following-sibling::alpha[starts-with(concat(@delete,"-"),"this.nodeValue-")][@xml:id="id3"][following-sibling::alpha[@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::mu[@insert][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//lambda[@delete="another attribute value"][@xml:lang="en-GB"][following-sibling::zeta[starts-with(@or,"attrib")][@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]][position() = 1]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="en"> <any xml:lang="en-GB"> @@ -21613,6 +25308,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]//iota[@xml:lang="en"][not(child::node())][following-sibling::gamma[@object][@xml:id="id2"][following-sibling::beta[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//theta[@name="attribute value"][@xml:id="id4"][following-sibling::delta[@name][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu/iota[@insert][@xml:lang="no-nb"][@xml:id="id6"][not(following-sibling::*)]//mu[contains(@data,"t-v")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::gamma[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//theta[not(preceding-sibling::*)][following-sibling::epsilon[contains(concat(@desciption,"$"),"value$")][following-sibling::zeta//psi[not(child::node())][following-sibling::zeta[contains(concat(@desciption,"$"),"ute value$")][@xml:lang="no"]/iota[@xml:lang="en-US"][@xml:id="id7"][not(following-sibling::*)]//lambda[contains(concat(@insert,"$"),"r attribute value$")][not(preceding-sibling::*)]//iota[@title][@xml:lang="no-nb"][@xml:id="id8"][not(preceding-sibling::*)]/gamma[@name][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"][following-sibling::alpha[not(following-sibling::*)]//chi[@number="solid 1px green"][@xml:lang="nb"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <iota xml:lang="en"/> @@ -21655,6 +25355,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]/eta[contains(@or,"d 1px ")][@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::theta[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::psi[@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::xi[starts-with(@data,"tr")][@xml:id="id5"][following-sibling::omega[@attribute][@xml:id="id6"][following-sibling::lambda[@xml:lang="no"][preceding-sibling::*[position() = 5]][not(following-sibling::*)]/eta[@xml:lang="en-US"]//delta[@xml:lang="en-GB"][following-sibling::alpha[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[@attribute][not(preceding-sibling::*)][not(following-sibling::*)]/theta[following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[starts-with(concat(@false,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:id="id8"]/xi[not(preceding-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <eta or="solid 1px green" xml:lang="en-US" xml:id="id2"/> @@ -21683,6 +25388,11 @@ </test> <test> <xpath>//mu[@object][@xml:lang="en"]/*[@attrib][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::chi[@src="false"][following-sibling::sigma[following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[preceding-sibling::*[position() = 3]][not(following-sibling::*)]//omega[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 1]][following-sibling::eta[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <mu object="this.nodeValue" xml:lang="en"> <any attrib="123456789"> @@ -21702,6 +25412,11 @@ </test> <test> <xpath>//omega[@xml:lang="en"]/lambda[contains(@and,"deValue")][following-sibling::psi[@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omega[@xml:lang="nb"][following-sibling::iota[@xml:lang="en"][preceding-sibling::*[position() = 1]]/pi[starts-with(@name,"attribu")][not(child::node())][following-sibling::*[@xml:lang="en-US"][not(child::node())][following-sibling::epsilon[not(preceding-sibling::epsilon or following-sibling::epsilon)][not(child::node())][following-sibling::gamma[@string="solid 1px green"][@xml:id="id2"][not(following-sibling::*)]/phi[starts-with(@true,"this.nod")][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//omicron[@or][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@xml:lang="no"][@xml:id="id5"][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en"> <lambda and="this.nodeValue"/> @@ -21727,6 +25442,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="no-nb"]//epsilon[contains(concat(@and,"$"),"x green$")][@xml:lang="no-nb"][not(preceding-sibling::*)]//omega[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[starts-with(concat(@class,"-"),"another attribute value-")][not(following-sibling::*)]/tau[contains(concat(@name,"$"),"r attribute value$")][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="nb"][not(following-sibling::*)]//chi[position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="no-nb"> <epsilon and="solid 1px green" xml:lang="no-nb"> @@ -21745,6 +25465,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]//psi[@insert="123456789"][not(preceding-sibling::*)][following-sibling::theta[@xml:id="id2"]//delta[starts-with(concat(@token,"-"),"attribute-")][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[starts-with(@attr,"fal")][not(preceding-sibling::*)]/psi/rho[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="no-nb"]/beta[starts-with(concat(@true,"-"),"content-")][@xml:lang="en-US"][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::sigma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@name][@xml:lang="en"]//theta[starts-with(concat(@and,"-"),"this.nodeValue-")][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[starts-with(@false,"attr")][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::eta[contains(concat(@and,"$"),"value$")][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::alpha[@data][not(following-sibling::*)]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <psi insert="123456789"/> @@ -21778,6 +25503,11 @@ </test> <test> <xpath>//lambda[@xml:lang="en"]/alpha[@number][@xml:id="id1"][following-sibling::beta[contains(concat(@att,"$"),"23456789$")][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]//*[@xml:id="id3"][not(preceding-sibling::*)][not(preceding-sibling::any)][not(child::node())][following-sibling::*[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[not(preceding-sibling::*)][not(preceding-sibling::nu)][not(child::node())][following-sibling::iota[not(child::node())][following-sibling::rho[@xml:id="id5"][following-sibling::gamma[@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/kappa[@class="attribute-value"][@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)]/gamma[@xml:id="id8"][following-sibling::pi[starts-with(@name,"t")][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@name][@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 2]]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="en"> <alpha number="true" xml:id="id1"/> @@ -21803,6 +25533,11 @@ </test> <test> <xpath>//beta[@xml:lang="no"]//delta[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omicron[@xml:id="id1"][preceding-sibling::*[position() = 1]]//lambda[@number="attribute-value"][following-sibling::*[position()=3]][following-sibling::tau[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[@data][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 3]]/psi[@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[starts-with(concat(@class,"-"),"solid 1px green-")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::iota[@attribute][@xml:id="id6"][not(child::node())][following-sibling::pi[@xml:lang="en-GB"][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no"> <delta/> @@ -21826,6 +25561,11 @@ </test> <test> <xpath>//pi[contains(concat(@false,"$"),"56789$")][@xml:lang="en-US"][@xml:id="id1"]//epsilon[starts-with(@number,"_blank")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::xi[@xml:id="id2"][following-sibling::alpha[@xml:id="id3"]/phi[@and][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::gamma[@xml:lang="nb"][not(following-sibling::*)]/rho[@xml:lang="en-US"][@xml:id="id4"]/zeta[@attribute]//theta[@delete][not(preceding-sibling::*)]/theta[@insert][following-sibling::*[position()=3]][following-sibling::omicron[@object="content"][@xml:lang="en"][@xml:id="id5"][following-sibling::lambda[@xml:id="id6"][not(child::node())][following-sibling::iota[@xml:lang="en-GB"]//omicron[@attribute="solid 1px green"][@xml:id="id7"][following-sibling::iota[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]]//*[following-sibling::alpha[starts-with(@att,"_blank")][@xml:id="id9"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@src][@xml:id="id10"][preceding-sibling::*[position() = 2]]/psi[@xml:id="id11"][not(following-sibling::*)]//beta[@object][@xml:id="id12"][not(preceding-sibling::*)]//psi[@attribute][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[starts-with(concat(@true,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id13"][position() = 1]][position() = 1]]]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <pi false="123456789" xml:lang="en-US" xml:id="id1"> <epsilon number="_blank" xml:lang="en-US"/> @@ -21866,6 +25606,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en"][@xml:id="id1"]//alpha[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="no"][following-sibling::rho[@xml:lang="en-US"][following-sibling::zeta[@xml:lang="no"][preceding-sibling::*[position() = 3]][following-sibling::pi[preceding-sibling::*[position() = 4]][not(following-sibling::*)]//zeta[@att][@xml:lang="no-nb"][not(following-sibling::*)]/rho[@delete][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::lambda[contains(@title,"rue")][@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//sigma[@delete][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[@attr="solid 1px green"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[following-sibling::kappa[preceding-sibling::*[position() = 3]][not(following-sibling::*)]//omega[@and][@xml:id="id5"][not(preceding-sibling::*)]/iota[@attribute="attribute-value"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en" xml:id="id1"> <alpha xml:lang="no-nb"/> @@ -21895,6 +25640,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]//zeta[@xml:id="id2"][not(child::node())][following-sibling::*[@xml:lang="en-US"][not(following-sibling::*)]//upsilon[not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::zeta[starts-with(concat(@true,"-"),"content-")][@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]/lambda[contains(concat(@attr,"$"),"ue$")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@attr][@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::*[@number][@xml:lang="nb"][not(following-sibling::*)][not(following-sibling::any)]//omega[@insert="123456789"][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[@true][following-sibling::alpha[@xml:lang="en"][@xml:id="id7"][not(following-sibling::*)]/chi[@xml:id="id8"][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <zeta xml:id="id2"/> @@ -21923,6 +25673,11 @@ </test> <test> <xpath>//psi[@xml:lang="no"]/zeta[@xml:lang="nb"][not(preceding-sibling::*)]//pi[starts-with(@title,"fals")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[not(preceding-sibling::psi)][not(child::node())][following-sibling::zeta[contains(@class,"bla")][@xml:id="id1"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//sigma[@attr="attribute-value"][@xml:id="id2"][following-sibling::lambda[@attrib][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[starts-with(concat(@title,"-"),"123456789-")][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::eta[starts-with(concat(@data,"-"),"100%-")][@xml:id="id4"][not(child::node())][following-sibling::*[@and][@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::epsilon[@title][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::theta[@attribute="attribute value"][@xml:lang="nb"][@xml:id="id6"]//kappa[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::tau[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 2]]/delta[@src][@xml:lang="nb"][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::*[contains(concat(@number,"$"),"ute$")][@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en"]/alpha[@delete][not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::alpha)]][position() = 1]]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no"> <zeta xml:lang="nb"> @@ -21957,6 +25712,11 @@ </test> <test> <xpath>//psi//*[not(preceding-sibling::*)][not(preceding-sibling::any)][following-sibling::omega[@xml:lang="nb"][@xml:id="id1"]//omega[starts-with(concat(@and,"-"),"content-")][@xml:lang="nb"][@xml:id="id2"][following-sibling::tau[@xml:lang="en"][@xml:id="id3"][following-sibling::delta[contains(@true,"ue")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//gamma[@object="attribute value"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::eta[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omega[@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::kappa[preceding-sibling::*[position() = 5]][not(following-sibling::*)]/zeta[@xml:lang="en-GB"][@xml:id="id6"][following-sibling::psi[contains(concat(@att,"$"),"se$")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:lang="en-US"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::pi[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 3]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <psi> <any/> @@ -21984,6 +25744,11 @@ </test> <test> <xpath>//*[@xml:lang="nb"]//upsilon[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[starts-with(concat(@title,"-"),"this-")][@xml:lang="en"][@xml:id="id1"][not(following-sibling::*)]//upsilon[starts-with(@name,"this-is-att-val")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[starts-with(concat(@number,"-"),"false-")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//alpha[@xml:lang="en"][not(child::node())][following-sibling::tau[starts-with(concat(@token,"-"),"solid 1px green-")][@xml:lang="nb"]//omicron[following-sibling::psi[@number][@xml:lang="en-GB"]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>1</nth> + </result> <tree> <any xml:lang="nb"> <upsilon xml:lang="en-GB"> @@ -22005,6 +25770,11 @@ </test> <test> <xpath>//zeta[@xml:lang="en-GB"]/sigma[@delete="this.nodeValue"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@src][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[contains(@title,"true")]/omega[@xml:lang="en"][not(following-sibling::*)]//zeta[@content="100%"][@xml:id="id2"][not(preceding-sibling::*)]/iota[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="no-nb"][not(following-sibling::*)]/upsilon[contains(concat(@false,"$"),"ent$")][not(following-sibling::*)][not(preceding-sibling::upsilon)]/*[@true][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <zeta xml:lang="en-GB"> <sigma delete="this.nodeValue"> @@ -22031,6 +25801,11 @@ </test> <test> <xpath>//eta[@xml:lang="no-nb"][@xml:id="id1"]/*[starts-with(concat(@abort,"-"),"content-")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omega[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::omega)]//iota[@xml:id="id4"][following-sibling::*[position()=4]][following-sibling::upsilon[@string][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::delta[following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[starts-with(concat(@src,"-"),"solid 1px green-")][following-sibling::mu[@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/nu[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/theta[starts-with(concat(@attribute,"-"),"another attribute value-")][@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::xi[@abort][@xml:lang="en"][preceding-sibling::*[position() = 1]]/sigma[@true][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::zeta[@title][@xml:lang="nb"][@xml:id="id8"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@xml:lang="nb"][@xml:id="id9"][not(following-sibling::*)]//alpha[contains(@attrib,"olid")][@xml:id="id10"][not(preceding-sibling::*)][not(preceding-sibling::alpha)][not(child::node())][following-sibling::tau[not(following-sibling::*)]/omicron[@content][@xml:lang="en-GB"]//phi[starts-with(@class,"_blan")][@xml:lang="no"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@string][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="no-nb" xml:id="id1"> <any abort="content" xml:lang="en" xml:id="id2"/> @@ -22069,6 +25844,11 @@ </test> <test> <xpath>//lambda[starts-with(@string,"tr")][@xml:lang="en-US"][@xml:id="id1"]/eta[not(following-sibling::*)]/alpha[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::beta[@xml:id="id2"][not(following-sibling::*)]//lambda[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[contains(@true,"l")][@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <lambda string="true" xml:lang="en-US" xml:id="id1"> <eta> @@ -22086,6 +25866,11 @@ </test> <test> <xpath>//delta[@delete][@xml:lang="no-nb"]//alpha[@xml:id="id1"]//psi[@xml:id="id2"][not(following-sibling::*)]//delta[starts-with(@desciption,"this-is-att-valu")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::tau[contains(concat(@number,"$"),"ttribute$")][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::rho[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::phi[@class][preceding-sibling::*[position() = 3]][not(following-sibling::*)]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>1</nth> + </result> <tree> <delta delete="this.nodeValue" xml:lang="no-nb"> <alpha xml:id="id1"> @@ -22103,6 +25888,11 @@ </test> <test> <xpath>//chi[contains(concat(@string,"$"),"23456789$")]//phi[@xml:lang="en-US"][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//omicron[starts-with(concat(@false,"-"),"_blank-")][@xml:id="id3"][following-sibling::pi[@token="123456789"][@xml:lang="en"][not(child::node())][following-sibling::lambda[@attribute][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::omega[contains(concat(@or,"$"),"false$")][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::chi[@xml:id="id6"]//epsilon[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[contains(@and,"true")][@xml:lang="en"][preceding-sibling::*[position() = 1]]//kappa[@xml:id="id8"][not(preceding-sibling::*)]/mu[@attrib][not(preceding-sibling::*)]/mu[@class][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[starts-with(concat(@number,"-"),"100%-")][not(following-sibling::*)][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <chi string="123456789"> <phi xml:lang="en-US" xml:id="id1"/> @@ -22131,6 +25921,11 @@ </test> <test> <xpath>//alpha//rho[@xml:id="id1"][not(preceding-sibling::*)]//xi[@xml:id="id2"]//zeta[@xml:lang="en-US"][@xml:id="id3"][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::pi[@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/omega[not(preceding-sibling::*)]/pi[@xml:id="id6"]//omicron[@xml:lang="no-nb"]//psi[@abort="this-is-att-value"][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::gamma[contains(concat(@class,"$"),"%$")][@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[contains(concat(@title,"$"),"123456789$")][@xml:id="id9"]/gamma[@xml:lang="en"][@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <alpha> <rho xml:id="id1"> @@ -22160,6 +25955,11 @@ </test> <test> <xpath>//rho//tau[starts-with(@content,"s")]//*[@xml:id="id1"][not(preceding-sibling::*)]//epsilon[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[contains(concat(@true,"$"),"k$")][@xml:lang="no"][@xml:id="id2"]//eta[@xml:lang="en-GB"][not(preceding-sibling::*)]/xi[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/zeta[@content][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::omicron[contains(concat(@true,"$"),"ue$")][@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::tau[preceding-sibling::*[position() = 2]][following-sibling::gamma[contains(concat(@attribute,"$"),"alue$")][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[@att="solid 1px green"][@xml:id="id5"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::nu[@xml:id="id6"][not(following-sibling::*)]/beta[starts-with(concat(@delete,"-"),"this.nodeValue-")][@xml:lang="en-US"][@xml:id="id7"]/delta[@delete][@xml:id="id8"][not(preceding-sibling::delta)][following-sibling::nu[not(child::node())][following-sibling::sigma[@xml:lang="en-US"][following-sibling::theta[contains(concat(@string,"$"),"e$")][@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::beta[not(following-sibling::*)]/zeta[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <rho> <tau content="solid 1px green"> @@ -22199,6 +25999,11 @@ </test> <test> <xpath>//eta[@xml:id="id1"]//sigma[@insert="this-is-att-value"][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@xml:lang="no"][following-sibling::gamma[@xml:lang="no"][@xml:id="id2"][following-sibling::mu//iota/beta[@true="_blank"][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::sigma[@or][preceding-sibling::*[position() = 1]][following-sibling::xi[not(following-sibling::*)]//nu[@false][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@string="content"][@xml:lang="en-GB"]/zeta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:id="id5"][preceding-sibling::*[position() = 1]]/nu[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[contains(@class,"co")][not(preceding-sibling::*)][not(preceding-sibling::nu)][not(child::node())][following-sibling::beta[@xml:id="id7"][following-sibling::iota[contains(@and,"ribute")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]/omicron[@attrib="solid 1px green"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[@title][@xml:lang="nb"][preceding-sibling::*[position() = 1]]//zeta[following-sibling::pi[@token="100%"][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[contains(concat(@and,"$"),"tent$")][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@desciption][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[contains(concat(@delete,"$"),"ue$")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <eta xml:id="id1"> <sigma insert="this-is-att-value" xml:lang="nb"> @@ -22242,6 +26047,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]//xi[starts-with(concat(@object,"-"),"true-")][@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::tau[contains(@content,"k")][preceding-sibling::*[position() = 1]][following-sibling::chi[not(following-sibling::*)]//upsilon[@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::epsilon[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[starts-with(@string,"this-is-a")][@xml:id="id4"][not(child::node())][following-sibling::psi[contains(@object,"value")][@xml:lang="nb"][not(following-sibling::*)]/zeta[not(child::node())][following-sibling::omicron[contains(concat(@insert,"$"),"tent$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <psi xml:id="id1"> <xi object="true" xml:lang="en-US" xml:id="id2"/> @@ -22263,6 +26073,11 @@ </test> <test> <xpath>//omega/tau[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]]/nu[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[contains(concat(@src,"$"),"9$")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::eta[@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]//rho[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@attribute="this.nodeValue"][@xml:lang="nb"][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <omega> <tau xml:lang="no"/> @@ -22285,6 +26100,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]//alpha[@xml:lang="en-GB"]//gamma[@xml:lang="no-nb"][not(following-sibling::*)]/sigma[starts-with(@object,"solid 1px gr")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[contains(concat(@attrib,"$"),"Value$")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[contains(concat(@attribute,"$"),"false$")][@xml:id="id3"]//*[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]//beta[not(preceding-sibling::*)][following-sibling::phi[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[@xml:lang="nb"][preceding-sibling::*[position() = 2]][following-sibling::xi[@class="100%"][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(preceding-sibling::xi)]//*[@xml:lang="en"][not(following-sibling::*)][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <psi xml:id="id1"> <alpha xml:lang="en-GB"> @@ -22312,6 +26132,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]/kappa[@xml:id="id2"]/phi[starts-with(concat(@token,"-"),"123456789-")][@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)]//omega[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@abort][not(following-sibling::*)]//*[@name][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(concat(@attr,"-"),"attribute value-")][not(following-sibling::*)]//rho[contains(@title,"0%")][@xml:lang="no"][following-sibling::phi[starts-with(@attr,"100%")][@xml:lang="nb"][following-sibling::beta/omicron[@xml:id="id5"][not(preceding-sibling::*)]/omega[contains(concat(@class,"$"),"true$")][@xml:id="id6"]//lambda[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::pi[starts-with(concat(@delete,"-"),"solid 1px green-")][@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::gamma[@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::kappa[@xml:lang="en"][following-sibling::kappa[contains(@desciption,"bl")]/alpha[starts-with(concat(@title,"-"),"attribute-")][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[@true="_blank"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(following-sibling::phi)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <kappa xml:id="id2"> @@ -22347,6 +26172,11 @@ </test> <test> <xpath>//kappa[@xml:id="id1"]//zeta[following-sibling::omega[not(following-sibling::*)]/eta[starts-with(concat(@data,"-"),"true-")][not(child::node())][following-sibling::theta[@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::gamma[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::delta[not(child::node())][following-sibling::psi[starts-with(concat(@or,"-"),"attribute value-")][@xml:lang="en-US"][preceding-sibling::*[position() = 4]]//sigma[@xml:id="id4"][not(child::node())][following-sibling::kappa[@insert][@xml:lang="en"][@xml:id="id5"][not(child::node())][following-sibling::mu[@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::iota[@xml:lang="no-nb"]//chi[not(preceding-sibling::*)]//sigma[starts-with(concat(@insert,"-"),"solid 1px green-")][@xml:lang="no"][following-sibling::eta[@or][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[contains(@false,"rue")][@xml:id="id8"][following-sibling::tau[starts-with(@or,"solid 1px ")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][not(following-sibling::*)]/iota[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="no"][@xml:id="id9"][not(following-sibling::*)][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <kappa xml:id="id1"> <zeta/> @@ -22381,6 +26211,11 @@ </test> <test> <xpath>//alpha[contains(concat(@src,"$"),"e$")]/iota[@att][@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::theta[starts-with(@insert,"conte")][@xml:lang="nb"][@xml:id="id2"][following-sibling::delta[starts-with(@name,"this.nodeVa")][@xml:lang="en-US"][following-sibling::psi[starts-with(concat(@attrib,"-"),"content-")][@xml:lang="no"][following-sibling::*[position()=3]][following-sibling::epsilon[contains(concat(@insert,"$"),"ue$")][@xml:lang="no-nb"][@xml:id="id3"][not(child::node())][following-sibling::epsilon[@xml:id="id4"][not(child::node())][following-sibling::*[contains(@number,"en")][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <alpha src="true"> <iota att="_blank" xml:lang="en" xml:id="id1"/> @@ -22397,6 +26232,11 @@ </test> <test> <xpath>//*[@xml:lang="nb"]//pi[starts-with(@data,"attribut")][@xml:id="id1"][following-sibling::omega[contains(@attribute,"ue")][@xml:lang="no-nb"][following-sibling::chi[@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 2]]/gamma[starts-with(concat(@or,"-"),"attribute value-")][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::phi[contains(@content,"fal")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//sigma[@xml:lang="en"]//kappa[@xml:id="id4"][following-sibling::omega[preceding-sibling::*[position() = 1]]//theta[@xml:lang="no-nb"][@xml:id="id5"][following-sibling::*[position()=3]][not(following-sibling::theta)][not(child::node())][following-sibling::epsilon[@delete][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::gamma[@abort][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::mu[@name][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//beta[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="nb"> <pi data="attribute value" xml:id="id1"/> @@ -22424,6 +26264,11 @@ </test> <test> <xpath>//iota[@xml:lang="en-US"]//iota[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@delete][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@xml:lang="nb"][following-sibling::*[position()=1]][not(preceding-sibling::zeta)][not(child::node())][following-sibling::eta[@data][preceding-sibling::*[position() = 3]][not(preceding-sibling::eta)]//iota[contains(concat(@string,"$"),"content$")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::upsilon[following-sibling::*[position()=1]][following-sibling::upsilon[not(following-sibling::*)]//delta[@class="_blank"][following-sibling::*[position()=1]][following-sibling::zeta[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[contains(@token,"se")][@xml:id="id4"][not(preceding-sibling::*)]/nu[@number="another attribute value"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@xml:id="id6"][not(following-sibling::*)]/mu[starts-with(@number,"another attribute valu")][not(following-sibling::*)]/delta[starts-with(@abort,"fal")][@xml:lang="en"][not(child::node())][following-sibling::gamma[@xml:id="id7"][not(following-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>1</nth> + </result> <tree> <iota xml:lang="en-US"> <iota xml:id="id1"/> @@ -22455,6 +26300,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="no-nb"][@xml:id="id1"]/sigma[@xml:lang="en-US"][not(following-sibling::*)]/xi[not(following-sibling::*)]//kappa[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/psi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@src="_blank"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::upsilon[@or][@xml:id="id4"][following-sibling::sigma[@class][@xml:id="id5"][preceding-sibling::*[position() = 2]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="no-nb" xml:id="id1"> <sigma xml:lang="en-US"> @@ -22478,6 +26328,11 @@ </test> <test> <xpath>//epsilon[@xml:id="id1"]//phi[@xml:lang="en-US"][@xml:id="id2"][following-sibling::beta[preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::zeta[starts-with(@string,"solid 1px gr")][@xml:lang="no-nb"][following-sibling::omega[contains(concat(@object,"$"),"rue$")][@xml:id="id3"][not(child::node())][following-sibling::lambda[@name][@xml:lang="no"][not(following-sibling::*)]/gamma[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@title][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//chi[@xml:lang="no-nb"][not(child::node())][following-sibling::zeta[starts-with(@or,"t")][not(child::node())][following-sibling::iota[starts-with(concat(@string,"-"),"100%-")][@xml:lang="no"][@xml:id="id7"][not(child::node())][following-sibling::mu[@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//gamma[@xml:lang="en-US"][@xml:id="id9"][not(following-sibling::*)]//rho[@xml:lang="no-nb"][following-sibling::lambda[@xml:lang="nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::lambda[@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 2]]/upsilon[contains(concat(@content,"$"),"solid 1px green$")][@xml:lang="nb"][not(following-sibling::*)][not(preceding-sibling::upsilon)]//psi[contains(concat(@data,"$"),"id 1px green$")][not(preceding-sibling::*)][not(following-sibling::*)]/psi[contains(@attribute,"ttribute val")][not(preceding-sibling::*)]/upsilon[@class][@xml:lang="nb"][@xml:id="id12"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::gamma[@src][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:lang="en-GB"]//*[contains(@attrib,"ank")][@xml:lang="en-GB"][not(preceding-sibling::*)]][position() = 1]]]]][position() = 1]]]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:id="id1"> <phi xml:lang="en-US" xml:id="id2"/> @@ -22519,6 +26374,11 @@ </test> <test> <xpath>//chi[@xml:lang="en-US"]//tau[starts-with(concat(@attr,"-"),"this-")][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[contains(@class,"ute-value")][@xml:lang="en"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::psi[@xml:lang="en"][not(following-sibling::*)]//iota[@true][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@class="this.nodeValue"][@xml:lang="en"][not(following-sibling::*)]//theta[contains(concat(@attr,"$"),"100%$")][@xml:id="id3"]//rho[@xml:lang="en-US"][following-sibling::*[position()=4]][not(child::node())][following-sibling::omicron[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[@false][@xml:id="id5"][preceding-sibling::*[position() = 2]][following-sibling::phi[starts-with(@data,"attribute-value")][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[starts-with(@attr,"attribut")][@xml:lang="no"][preceding-sibling::*[position() = 4]]//nu[contains(concat(@class,"$"),"tribute-value$")][@xml:id="id6"][following-sibling::*[position()=3]][not(child::node())][following-sibling::theta[following-sibling::*[position()=2]][following-sibling::alpha[contains(@desciption,"value")][@xml:lang="en-GB"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::sigma[contains(concat(@data,"$"),"this-is-att-value$")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="en-US"> <tau attr="this-is-att-value"/> @@ -22547,6 +26407,11 @@ </test> <test> <xpath>//omega[@and][@xml:lang="en-GB"][@xml:id="id1"]/omega[contains(concat(@desciption,"$"),"ibute$")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[contains(concat(@object,"$"),"nother attribute value$")][@xml:id="id3"][not(preceding-sibling::*)]//epsilon[@and="123456789"][@xml:lang="en-US"][not(following-sibling::*)]//pi[contains(concat(@content,"$"),"reen$")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]//zeta[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::zeta[following-sibling::alpha[@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::nu[@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//tau[not(child::node())][following-sibling::tau[not(following-sibling::*)]/chi[starts-with(concat(@true,"-"),"123456789-")][@xml:lang="no"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <omega and="_blank" xml:lang="en-GB" xml:id="id1"> <omega desciption="attribute" xml:lang="no-nb" xml:id="id2"> @@ -22573,6 +26438,11 @@ </test> <test> <xpath>//iota[starts-with(@att,"content")][@xml:id="id1"]//phi[@xml:id="id2"][not(following-sibling::*)]/theta[starts-with(@class,"_")][@xml:lang="en-US"][following-sibling::iota[contains(@abort,"234")][not(child::node())][following-sibling::psi[starts-with(concat(@abort,"-"),"content-")][@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::pi[@string][@xml:lang="en-US"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[contains(@attrib," 1px g")][preceding-sibling::*[position() = 4]]//tau[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::zeta[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omicron[not(following-sibling::*)][not(preceding-sibling::omicron)]//*[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)]//sigma[@content][not(following-sibling::*)]//phi[starts-with(@true,"123456789")][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@attr][@xml:lang="en-GB"][following-sibling::zeta[starts-with(concat(@token,"-"),"another attribute value-")][@xml:id="id8"][following-sibling::zeta[contains(@attr,"e")][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 4]][position() = 1]]]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <iota att="content" xml:id="id1"> <phi xml:id="id2"> @@ -22604,6 +26474,11 @@ </test> <test> <xpath>//pi[contains(@attr,"ibute va")][@xml:id="id1"]//chi[@xml:id="id2"]//phi[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)]/lambda[@xml:lang="en-GB"]/kappa[not(preceding-sibling::*)]//*[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:lang="en-GB"][not(following-sibling::*)]//tau[@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:id="id7"][not(following-sibling::*)]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <pi attr="attribute value" xml:id="id1"> <chi xml:id="id2"> @@ -22627,6 +26502,11 @@ </test> <test> <xpath>//eta[@xml:lang="en-US"][@xml:id="id1"]//beta[starts-with(concat(@insert,"-"),"content-")][@xml:lang="en-US"][following-sibling::beta[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::delta[starts-with(@src,"cont")][@xml:id="id2"]/omega[not(preceding-sibling::*)][following-sibling::eta[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::rho[not(child::node())][following-sibling::nu[starts-with(@string,"10")][preceding-sibling::*[position() = 3]][following-sibling::pi[contains(@title,"x green")][not(following-sibling::*)]/chi[starts-with(@and,"attribut")][@xml:id="id4"][not(preceding-sibling::*)]/tau[not(child::node())][following-sibling::epsilon[@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::beta[starts-with(concat(@abort,"-"),"123456789-")][@xml:id="id6"]/rho[@xml:lang="en"][not(preceding-sibling::*)][position() = 1]]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="en-US" xml:id="id1"> <beta insert="content" xml:lang="en-US"/> @@ -22653,6 +26533,11 @@ </test> <test> <xpath>//alpha[contains(concat(@abort,"$"),"te$")][@xml:lang="en-GB"][@xml:id="id1"]//lambda[contains(@src,"cont")][@xml:id="id2"]//omicron[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[starts-with(@attrib,"attr")][not(preceding-sibling::*)]/theta[following-sibling::nu[@string][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[@object][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[starts-with(concat(@content,"-"),"another attribute value-")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::tau)]//pi[@and="attribute-value"][not(child::node())][following-sibling::zeta[following-sibling::*[position()=3]][following-sibling::rho[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::rho[@delete][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::gamma[contains(@data,"bute value")][@xml:lang="no"]/tau[contains(concat(@src,"$"),"lue$")][not(preceding-sibling::*)][following-sibling::alpha[@xml:id="id6"][following-sibling::upsilon[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <alpha abort="attribute" xml:lang="en-GB" xml:id="id1"> <lambda src="content" xml:id="id2"> @@ -22684,6 +26569,11 @@ </test> <test> <xpath>//psi[starts-with(concat(@att,"-"),"100%-")]//chi[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::alpha[preceding-sibling::*[position() = 2]]//phi[@title][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::phi[@insert][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <psi att="100%"> <chi xml:lang="en-US"/> @@ -22701,6 +26591,11 @@ </test> <test> <xpath>//*[@insert="_blank"]/epsilon[starts-with(@data,"this.")][@xml:id="id1"]/gamma[not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::phi[contains(concat(@desciption,"$"),"0%$")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::zeta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//*[@title][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@abort="another attribute value"][@xml:lang="nb"][@xml:id="id3"][not(child::node())][following-sibling::omicron[@token="attribute-value"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::rho[contains(concat(@title,"$"),"alse$")][@xml:id="id4"][preceding-sibling::*[position() = 3]]//omicron[@xml:id="id5"][not(child::node())][following-sibling::zeta[not(following-sibling::*)]//iota[@xml:lang="en-US"][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/xi[@xml:lang="en-GB"][@xml:id="id7"]//alpha[not(preceding-sibling::*)]//omicron[contains(@name,"e")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[not(following-sibling::*)]//omicron[@xml:id="id8"][not(following-sibling::*)]/alpha[not(child::node())][following-sibling::eta[starts-with(@string,"another at")][@xml:lang="en"][position() = 1]]]][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <any insert="_blank"> <epsilon data="this.nodeValue" xml:id="id1"> @@ -22739,6 +26634,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]/theta[starts-with(@desciption,"attribut")][@xml:lang="no-nb"][not(following-sibling::*)]/alpha[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::rho[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::*[starts-with(@token,"attribute-val")][@xml:lang="no-nb"][@xml:id="id4"]/lambda[starts-with(@name,"another attr")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:id="id5"]//epsilon[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[starts-with(@src,"att")][@xml:lang="no"][@xml:id="id6"][following-sibling::xi[not(following-sibling::*)]/lambda[starts-with(concat(@true,"-"),"this-")][@xml:id="id7"][not(child::node())][following-sibling::*[@xml:id="id8"][not(child::node())][following-sibling::kappa[not(child::node())][following-sibling::theta[starts-with(@abort,"at")][@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 3]]/epsilon[@false][@xml:lang="en-GB"][@xml:id="id10"][not(preceding-sibling::*)]/chi[@xml:lang="nb"][@xml:id="id11"][not(following-sibling::*)][not(preceding-sibling::chi or following-sibling::chi)]//chi[@xml:id="id12"][not(following-sibling::*)]]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>1</nth> + </result> <tree> <alpha xml:id="id1"> <theta desciption="attribute" xml:lang="no-nb"> @@ -22774,6 +26674,11 @@ </test> <test> <xpath>//psi//epsilon[contains(@att,"alue")][@xml:lang="no"][not(following-sibling::*)]/zeta[contains(@object,"s-att-value")][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[following-sibling::pi[contains(concat(@number,"$"),"content$")][@xml:lang="nb"][@xml:id="id1"][not(child::node())][following-sibling::eta[starts-with(@delete,"this-is-att-valu")][@xml:lang="no"]//beta[not(following-sibling::*)]/lambda[@object][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::tau[@xml:id="id3"][not(child::node())][following-sibling::gamma[@insert="100%"][@xml:lang="nb"][not(child::node())][following-sibling::nu[@insert][@xml:id="id4"][preceding-sibling::*[position() = 4]][following-sibling::phi[starts-with(@token,"1234")][not(following-sibling::*)]][position() = 1]]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <psi> <epsilon att="this-is-att-value" xml:lang="no"> @@ -22798,6 +26703,11 @@ </test> <test> <xpath>//alpha[@delete]//alpha[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)]//omega[@string][@xml:id="id2"][not(following-sibling::*)]/rho[starts-with(concat(@delete,"-"),"true-")][@xml:id="id3"]//chi[contains(@token,"tribu")][@xml:lang="nb"][@xml:id="id4"]//iota[@insert="true"][@xml:id="id5"][not(preceding-sibling::*)]//chi[@attrib="solid 1px green"][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@and][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@xml:lang="no-nb"][not(preceding-sibling::*)]//zeta[not(following-sibling::*)]/kappa[@content][not(preceding-sibling::*)]//rho[starts-with(concat(@object,"-"),"_blank-")][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:lang="no"][@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[starts-with(@desciption,"this.nodeV")][@xml:id="id7"][not(following-sibling::*)]/theta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:id="id8"]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <alpha delete="attribute-value"> <alpha xml:lang="no-nb" xml:id="id1"> @@ -22835,6 +26745,11 @@ </test> <test> <xpath>//gamma[@xml:id="id1"]/upsilon[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[@xml:lang="no-nb"][not(following-sibling::*)]/delta[contains(concat(@attrib,"$"),"%$")][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id4"]//sigma[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <gamma xml:id="id1"> <upsilon xml:id="id2"> @@ -22852,6 +26767,11 @@ </test> <test> <xpath>//delta[starts-with(concat(@and,"-"),"another attribute value-")]/*[@attr][@xml:lang="en-US"][following-sibling::*[position()=2]][following-sibling::xi[contains(concat(@false,"$"),"k$")][@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/gamma[@xml:id="id3"]//zeta[starts-with(@title,"solid 1px gree")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]/rho[starts-with(@name,"1")][@xml:id="id5"][not(child::node())][following-sibling::rho[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[starts-with(@string,"a")][not(following-sibling::*)]//chi[starts-with(@class,"f")][following-sibling::kappa[@object][@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[@xml:lang="en-GB"][not(following-sibling::*)][not(preceding-sibling::epsilon)]//mu[@abort]//theta[starts-with(@class,"solid ")][@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@and][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[starts-with(@attribute,"this")][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::delta[starts-with(concat(@class,"-"),"_blank-")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//omicron[@xml:id="id11"][following-sibling::mu[starts-with(concat(@and,"-"),"100%-")][@xml:lang="en-US"]//theta[@string][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <delta and="another attribute value"> <any attr="attribute" xml:lang="en-US"/> @@ -22894,6 +26814,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="nb"]/beta[contains(concat(@delete,"$")," value$")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[contains(@attrib,"e")][@xml:lang="nb"][@xml:id="id2"][following-sibling::*[starts-with(concat(@true,"-"),"123456789-")][@xml:lang="no-nb"][@xml:id="id3"]/sigma[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::theta[contains(@abort,"56789")][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[@xml:lang="en"][@xml:id="id6"][not(child::node())][following-sibling::psi//eta[contains(concat(@abort,"$"),"e value$")][@xml:lang="no"][not(following-sibling::*)]//sigma[not(preceding-sibling::*)]/omega[@xml:lang="no"]/epsilon[@attrib][@xml:id="id7"][following-sibling::zeta[@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@or="another attribute value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/phi[starts-with(@true,"co")][@xml:lang="no-nb"][@xml:id="id8"][not(following-sibling::*)]/omega[contains(@object,"n")][@xml:lang="en"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="nb"> <beta delete="attribute value" xml:id="id1"/> @@ -22925,6 +26850,11 @@ </test> <test> <xpath>//psi[contains(@attr,"lue")][@xml:lang="no-nb"][@xml:id="id1"]//epsilon[@att="content"][@xml:lang="en"][following-sibling::beta[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@delete][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::kappa[following-sibling::omega[@xml:lang="en-GB"]]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <psi attr="this-is-att-value" xml:lang="no-nb" xml:id="id1"> <epsilon att="content" xml:lang="en"/> @@ -22940,6 +26870,11 @@ </test> <test> <xpath>//chi[starts-with(@abort,"_")][@xml:lang="no-nb"]//omega/theta[@xml:id="id1"][following-sibling::pi[@xml:lang="nb"][following-sibling::*[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::iota[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/xi[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@name="false"][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)]//psi[starts-with(@true,"attribut")][@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::xi[@xml:id="id7"][preceding-sibling::*[position() = 1]]/kappa[@token="another attribute value"][@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]/gamma[@number][not(following-sibling::*)][not(following-sibling::gamma)]//theta[@xml:lang="en-GB"][@xml:id="id9"][not(child::node())][following-sibling::theta[@desciption][@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[contains(concat(@att,"$"),"ue$")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <chi abort="_blank" xml:lang="no-nb"> <omega> @@ -22970,6 +26905,11 @@ </test> <test> <xpath>//psi[@xml:id="id1"]//zeta[@xml:lang="en-GB"][following-sibling::lambda[@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::kappa[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//gamma[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]//zeta[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[starts-with(@or,"thi")][following-sibling::*[position()=3]][not(child::node())][following-sibling::lambda[contains(concat(@attrib,"$"),"attribute value$")][@xml:lang="en-US"][not(child::node())][following-sibling::omicron[starts-with(concat(@attrib,"-"),"true-")][@xml:lang="en-GB"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[starts-with(@attrib,"this-is-at")][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 3]]/pi[contains(concat(@attribute,"$"),"attribute value$")][@xml:id="id7"]/omicron[@false][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[@xml:lang="en-US"][@xml:id="id8"][not(following-sibling::*)]//rho[@xml:id="id9"][not(preceding-sibling::*)]/iota[@true="solid 1px green"][@xml:id="id10"][not(following-sibling::*)]//gamma[@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@number][not(following-sibling::*)]/kappa[following-sibling::*[position()=3]][following-sibling::xi[preceding-sibling::*[position() = 1]][following-sibling::xi[contains(@class,"ank")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][preceding-sibling::xi[1]][following-sibling::pi[contains(@content,"solid")][@xml:id="id12"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <psi xml:id="id1"> <zeta xml:lang="en-GB"/> @@ -23011,6 +26951,11 @@ </test> <test> <xpath>//theta[@xml:id="id1"]//nu[@xml:lang="no"][not(following-sibling::*)]/psi[starts-with(concat(@class,"-"),"solid 1px green-")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[@attribute="attribute"][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//gamma[@xml:lang="en-GB"]//alpha/zeta[@class][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[contains(@attrib,"ont")][not(preceding-sibling::*)]//psi[@attrib][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::chi[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/pi[contains(@attribute,"id 1px g")][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]]//epsilon[starts-with(@number,"attri")][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@xml:lang="en-US"][@xml:id="id8"][following-sibling::*[position()=2]][following-sibling::epsilon[contains(concat(@attrib,"$"),"te value$")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id9"][not(following-sibling::*)]/eta[@xml:id="id10"][not(preceding-sibling::*)][following-sibling::upsilon[contains(concat(@true,"$"),"true$")][@xml:id="id11"][not(child::node())][following-sibling::pi[@xml:id="id12"][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[not(following-sibling::*)]//omicron[@xml:id="id13"][following-sibling::gamma[@xml:lang="en-GB"][following-sibling::theta[@xml:id="id14"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <theta xml:id="id1"> <nu xml:lang="no"> @@ -23053,6 +26998,11 @@ </test> <test> <xpath>//phi/*[@xml:lang="nb"][@xml:id="id1"][following-sibling::lambda[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::psi[@xml:lang="nb"][@xml:id="id3"]/phi[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::beta[@object="true"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[following-sibling::*[position()=1]][not(preceding-sibling::xi)][following-sibling::lambda[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@title][@xml:id="id7"][not(preceding-sibling::*)]//sigma[@xml:lang="no"][@xml:id="id8"][not(following-sibling::*)]//theta[@xml:id="id9"][following-sibling::mu[@xml:lang="no-nb"][@xml:id="id10"]//alpha[@xml:id="id11"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id12"][following-sibling::phi[starts-with(concat(@class,"-"),"another attribute value-")][position() = 1]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <phi> <any xml:lang="nb" xml:id="id1"/> @@ -23082,6 +27032,11 @@ </test> <test> <xpath>//lambda[starts-with(concat(@name,"-"),"attribute value-")][@xml:id="id1"]//rho[contains(concat(@attrib,"$"),"se$")][@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]//upsilon[@xml:id="id3"][not(child::node())][following-sibling::sigma[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id4"]/beta[not(preceding-sibling::*)]/tau[@xml:lang="en-GB"][not(preceding-sibling::*)]/upsilon[@xml:id="id5"][following-sibling::*[position()=2]][following-sibling::kappa[starts-with(concat(@attr,"-"),"this-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/lambda[contains(concat(@class,"$"),"e$")][@xml:id="id6"][not(preceding-sibling::*)]//upsilon[@or][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(concat(@title,"-"),"100%-")][@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)]/eta[@xml:lang="no"][following-sibling::psi[starts-with(concat(@data,"-"),"false-")][@xml:id="id8"][not(child::node())][following-sibling::*[starts-with(@content,"12345")][@xml:id="id9"][not(following-sibling::*)]/xi[contains(@src,"e")][@xml:lang="nb"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::sigma[@src][@xml:lang="en-US"][@xml:id="id11"][not(following-sibling::*)]//alpha[starts-with(@name,"att")][@xml:lang="nb"][@xml:id="id12"][following-sibling::mu[@xml:id="id13"]/eta[@xml:lang="no-nb"][@xml:id="id14"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <lambda name="attribute value" xml:id="id1"> <rho attrib="false" xml:lang="en-US" xml:id="id2"> @@ -23122,6 +27077,11 @@ </test> <test> <xpath>//gamma[starts-with(@name,"attribu")][@xml:lang="nb"]//delta[starts-with(@src,"another attribu")][not(preceding-sibling::*)][not(following-sibling::*)]/xi[following-sibling::chi[starts-with(concat(@insert,"-"),"attribute-")][@xml:id="id1"][not(child::node())][following-sibling::nu[@attribute="attribute-value"][@xml:lang="no"][not(following-sibling::*)]/zeta[@insert][@xml:lang="no-nb"][not(following-sibling::*)]/eta[not(child::node())][following-sibling::phi[@or="content"][@xml:lang="en-GB"][@xml:id="id2"][following-sibling::lambda[contains(@number,"bute value")][preceding-sibling::*[position() = 2]]/epsilon[starts-with(@and,"solid 1px g")][not(preceding-sibling::*)][following-sibling::iota[contains(concat(@string,"$"),"%$")][@xml:lang="no-nb"]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <gamma name="attribute" xml:lang="nb"> <delta src="another attribute value"> @@ -23145,6 +27105,11 @@ </test> <test> <xpath>//iota/kappa[@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::lambda[@xml:id="id2"][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::*[@xml:id="id3"][preceding-sibling::*[position() = 3]]/kappa[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)]//phi[contains(concat(@class,"$"),"another attribute value$")][@xml:lang="en"][not(preceding-sibling::*)]//sigma[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <iota> <kappa xml:lang="en-GB" xml:id="id1"/> @@ -23164,6 +27129,11 @@ </test> <test> <xpath>//rho[starts-with(@src,"fals")][@xml:id="id1"]//nu[starts-with(concat(@att,"-"),"_blank-")][@xml:lang="no"][not(following-sibling::*)]/gamma[@token][not(preceding-sibling::*)][following-sibling::zeta[contains(concat(@attr,"$"),"value$")][preceding-sibling::*[position() = 1]][not(following-sibling::zeta)]/nu[@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//alpha[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[not(child::node())][following-sibling::kappa[contains(@true,"Value")][@xml:lang="no"][@xml:id="id4"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <rho src="false" xml:id="id1"> <nu att="_blank" xml:lang="no"> @@ -23186,6 +27156,11 @@ </test> <test> <xpath>//beta[contains(concat(@false,"$"),"this.nodeValue$")]//epsilon[contains(concat(@string,"$"),"123456789$")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[starts-with(concat(@true,"-"),"true-")][not(child::node())][following-sibling::mu[not(following-sibling::*)]//pi[@true="_blank"][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::omicron//iota[@abort="content"][@xml:lang="no-nb"]/chi[@xml:lang="no-nb"][not(child::node())][following-sibling::theta[@and][@xml:lang="no"][not(preceding-sibling::theta)]/chi[@xml:lang="en"][not(following-sibling::*)]//chi[@xml:lang="en-GB"][@xml:id="id4"][following-sibling::sigma[@xml:id="id5"]/eta[@xml:lang="en"][not(following-sibling::*)]/chi[@attr][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::epsilon[@class][@xml:id="id7"][following-sibling::phi[contains(concat(@number,"$"),"se$")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/eta[@xml:lang="en-US"][@xml:id="id8"][not(preceding-sibling::*)]//zeta[contains(concat(@src,"$"),"ribute$")][@xml:lang="en-US"][not(preceding-sibling::*)]//iota[@name][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[starts-with(@attrib,"1234")][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@false][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(preceding-sibling::mu)]/iota[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <beta false="this.nodeValue"> <epsilon string="123456789" xml:id="id1"/> @@ -23228,6 +27203,11 @@ </test> <test> <xpath>//gamma[@abort="123456789"][@xml:lang="nb"][@xml:id="id1"]/kappa[starts-with(@name,"so")][@xml:id="id2"]/mu[@name][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:lang="en-US"][following-sibling::psi[contains(concat(@number,"$"),"ue$")][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::lambda[@string="_blank"][@xml:lang="nb"][preceding-sibling::*[position() = 3]][following-sibling::alpha[preceding-sibling::*[position() = 4]][not(following-sibling::*)]//delta[contains(concat(@abort,"$"),"t$")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[@false][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=7]][not(child::node())][following-sibling::upsilon[contains(@content,"nt")][@xml:lang="no-nb"][not(child::node())][following-sibling::pi[contains(@src,"e")][@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=5]][following-sibling::sigma[contains(concat(@number,"$"),"value$")][@xml:lang="en-GB"][following-sibling::kappa[@token][following-sibling::kappa[contains(concat(@true,"$"),"content$")][@xml:lang="en-US"][following-sibling::kappa[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][preceding-sibling::*[position() = 7]][following-sibling::*[position()=1]][following-sibling::kappa[starts-with(@src,"attribute value")][@xml:id="id6"][preceding-sibling::*[position() = 8]][not(following-sibling::*)]/pi[@token][@xml:id="id7"][not(preceding-sibling::*)]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <gamma abort="123456789" xml:lang="nb" xml:id="id1"> <kappa name="solid 1px green" xml:id="id2"> @@ -23256,6 +27236,11 @@ </test> <test> <xpath>//tau[@xml:id="id1"]//gamma[not(preceding-sibling::*)]/alpha[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[contains(@title,"nk")][@xml:lang="no"]//psi[@xml:lang="no-nb"][@xml:id="id2"]//zeta[contains(@att,"ank")][@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@attr="123456789"][@xml:id="id4"][following-sibling::xi[contains(concat(@false,"$"),"_blank$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <tau xml:id="id1"> <gamma> @@ -23276,6 +27261,11 @@ </test> <test> <xpath>//chi[@xml:lang="en-US"]/gamma[@attribute][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@attribute="content"][@xml:id="id2"]/upsilon[starts-with(concat(@desciption,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id3"][following-sibling::theta[@desciption="true"][@xml:lang="en-GB"][@xml:id="id4"][following-sibling::*[position()=3]][following-sibling::omicron[@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::xi[@attribute][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::psi[preceding-sibling::*[position() = 4]]/pi//psi[@name][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@xml:id="id7"]//mu[@attr][@xml:lang="en-US"][@xml:id="id8"][following-sibling::mu[@xml:lang="nb"][@xml:id="id9"][not(child::node())][following-sibling::kappa[@xml:lang="no"][@xml:id="id10"]]]]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <chi xml:lang="en-US"> <gamma attribute="100%"/> @@ -23305,6 +27295,11 @@ </test> <test> <xpath>//zeta[@token][@xml:id="id1"]/omega[@xml:lang="no-nb"][@xml:id="id2"]/nu[contains(@insert,"gre")][@xml:lang="no"][@xml:id="id3"]/upsilon[not(preceding-sibling::*)]/iota[@desciption][@xml:id="id4"]/alpha[@content][@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[@attrib][@xml:id="id6"][not(child::node())][following-sibling::xi[starts-with(@attr,"content")][@xml:lang="en"][@xml:id="id7"][following-sibling::iota[preceding-sibling::*[position() = 3]][not(following-sibling::*)]//pi[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::zeta[@true][@xml:lang="en-GB"][@xml:id="id9"][following-sibling::*[position()=2]][following-sibling::psi[@content][@xml:lang="no-nb"][not(child::node())][following-sibling::*[@xml:id="id10"][not(following-sibling::*)][not(following-sibling::any)]/alpha[@xml:lang="en-US"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[starts-with(concat(@content,"-"),"this.nodeValue-")][@xml:id="id12"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <zeta token="attribute-value" xml:id="id1"> <omega xml:lang="no-nb" xml:id="id2"> @@ -23335,6 +27330,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]/pi[@xml:lang="no"][@xml:id="id2"]//nu[@xml:lang="en"][not(child::node())][following-sibling::tau[contains(@name,"e value")][@xml:lang="en"][@xml:id="id3"][following-sibling::zeta[@desciption="this-is-att-value"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::tau[@xml:id="id5"][not(following-sibling::*)]//*[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@and][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[contains(concat(@true,"$"),"ibute$")][@xml:lang="en"][@xml:id="id8"][not(following-sibling::*)]/chi[@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::upsilon[starts-with(concat(@attrib,"-"),"_blank-")][@xml:lang="no-nb"][@xml:id="id10"][not(child::node())][following-sibling::tau[@object][preceding-sibling::*[position() = 2]]//mu[@token="this-is-att-value"][@xml:id="id11"][not(child::node())][following-sibling::*[@name="false"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@xml:lang="en"][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][following-sibling::phi[starts-with(@token,"this-is-att-valu")][@xml:lang="no"][@xml:id="id12"][not(following-sibling::*)]//tau[@data="attribute value"][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::delta[starts-with(concat(@delete,"-"),"another attribute value-")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::epsilon[@xml:lang="nb"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <pi xml:lang="no" xml:id="id2"> @@ -23372,6 +27372,11 @@ </test> <test> <xpath>//mu[starts-with(concat(@content,"-"),"123456789-")][@xml:id="id1"]/tau[@desciption="attribute"][@xml:lang="en"][@xml:id="id2"]/zeta[contains(@abort,"89")][@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::xi[starts-with(@src,"12345")][@xml:lang="no-nb"][following-sibling::rho[starts-with(@class,"true")][@xml:id="id4"][preceding-sibling::*[position() = 2]]//epsilon[@abort][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::sigma[contains(@object,"0%")][@xml:id="id5"]/tau[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/zeta[not(preceding-sibling::*)][not(following-sibling::*)]//iota[not(following-sibling::*)]/iota[@xml:lang="nb"][not(child::node())][following-sibling::pi[not(child::node())][following-sibling::alpha[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::pi[@string="true"][@xml:lang="nb"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]/pi[contains(concat(@abort,"$"),"9$")][following-sibling::*[position()=2]][following-sibling::zeta[@xml:lang="nb"][following-sibling::iota//upsilon[@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]//nu[contains(concat(@src,"$"),"solid 1px green$")][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(@string,"00%")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <mu content="123456789" xml:id="id1"> <tau desciption="attribute" xml:lang="en" xml:id="id2"> @@ -23412,6 +27417,11 @@ </test> <test> <xpath>//phi[@xml:lang="en"][@xml:id="id1"]/rho[contains(concat(@true,"$"),"_blank$")][@xml:lang="nb"][not(preceding-sibling::*)]/omicron[contains(concat(@false,"$"),"tribute value$")][@xml:id="id2"][not(child::node())][following-sibling::chi[@number="solid 1px green"][not(following-sibling::*)]/omicron[not(preceding-sibling::*)][not(following-sibling::*)]//beta[@att="_blank"][@xml:lang="nb"][@xml:id="id3"]//omega[@xml:lang="no-nb"][following-sibling::chi[not(following-sibling::*)]//epsilon[@xml:lang="en-GB"][not(child::node())][following-sibling::nu[@desciption="this.nodeValue"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:lang="en-US"][preceding-sibling::*[position() = 2]]/mu[starts-with(concat(@object,"-"),"solid 1px green-")][@xml:lang="en-US"][not(following-sibling::*)][not(preceding-sibling::mu)]/chi[@abort="true"][@xml:lang="en"][@xml:id="id5"][not(child::node())][following-sibling::iota[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/gamma[@attribute="100%"]/omicron[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[@number="100%"][@xml:lang="en-US"][@xml:id="id8"][following-sibling::beta[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::tau[preceding-sibling::*[position() = 2]]//delta[@xml:id="id10"][not(child::node())][following-sibling::omicron[contains(concat(@object,"$"),"ttribute$")][@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//iota[contains(@title,"s")][@xml:id="id12"][not(following-sibling::*)]//xi[starts-with(concat(@desciption,"-"),"this-")][not(following-sibling::*)]//nu[@xml:lang="en"]][position() = 1]][position() = 1]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en" xml:id="id1"> <rho true="_blank" xml:lang="nb"> @@ -23458,6 +27468,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]//psi[@attrib][not(following-sibling::*)]//mu[@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(concat(@name,"$"),"ntent$")][@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]//pi[@or]//iota[@true][@xml:lang="en"][not(child::node())][following-sibling::xi[@abort][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[contains(@false,"ibute-va")][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:id="id4"]//alpha[not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="no-nb"]//pi[@false="this.nodeValue"][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)]/sigma[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::eta[@attr="attribute value"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[not(child::node())][following-sibling::rho[@xml:id="id6"][not(following-sibling::*)]/omega[starts-with(concat(@false,"-"),"attribute value-")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[starts-with(@true,"this.no")]/rho[starts-with(@att,"_")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[contains(@object,"blan")][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[contains(@false,"reen")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[contains(concat(@title,"$"),"1px green$")][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <psi attrib="true"> @@ -23501,6 +27516,11 @@ </test> <test> <xpath>//lambda[contains(concat(@desciption,"$"),"00%$")][@xml:id="id1"]/epsilon[@xml:lang="en-US"]//alpha[@xml:id="id2"][not(preceding-sibling::alpha)]//omicron[@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::omicron[contains(@object,"56")][not(child::node())][following-sibling::tau[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::gamma[@attribute][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//gamma[not(preceding-sibling::*)]//xi[@insert="_blank"][@xml:id="id5"][not(preceding-sibling::xi)][following-sibling::gamma[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::*[@xml:lang="en-GB"][following-sibling::rho[contains(@and,"t")][not(following-sibling::*)]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <lambda desciption="100%" xml:id="id1"> <epsilon xml:lang="en-US"> @@ -23525,6 +27545,11 @@ </test> <test> <xpath>//lambda[@xml:lang="en-US"]//beta[@xml:lang="nb"]/lambda[@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]/nu[following-sibling::omega[@xml:lang="no-nb"][not(following-sibling::*)]/rho[@string][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="en-US"> <beta xml:lang="nb"> @@ -23542,6 +27567,11 @@ </test> <test> <xpath>//omega[starts-with(@token,"this-is-att-valu")][@xml:lang="no"]//mu[starts-with(@attrib,"solid 1px gr")][@xml:lang="en"][@xml:id="id1"][not(following-sibling::*)]//gamma[not(preceding-sibling::*)]/sigma[not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:lang="en"][@xml:id="id2"]//omega[starts-with(concat(@and,"-"),"attribute-")][not(preceding-sibling::*)]/epsilon[@xml:id="id3"][not(preceding-sibling::*)]//omicron[contains(@insert,"lue")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(preceding-sibling::delta)][following-sibling::lambda[preceding-sibling::*[position() = 1]]/theta[starts-with(@att,"attribu")][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[contains(@or,"789")][following-sibling::*[position()=1]][following-sibling::tau[@insert][@xml:lang="en"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//*[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <omega token="this-is-att-value" xml:lang="no"> <mu attrib="solid 1px green" xml:lang="en" xml:id="id1"> @@ -23573,6 +27603,11 @@ </test> <test> <xpath>//omega[contains(@title,"ru")][@xml:id="id1"]//psi[@title][@xml:lang="en-GB"][not(following-sibling::*)]//alpha[not(child::node())][following-sibling::tau[@string][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[@title="content"][@xml:lang="nb"][@xml:id="id3"]/omicron[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/phi[@attr][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::zeta[@false][@xml:lang="nb"]//eta[@xml:id="id5"][not(preceding-sibling::*)]//mu[@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:id="id7"][preceding-sibling::*[position() = 1]]/delta[@xml:lang="no"][not(following-sibling::*)]//nu[contains(concat(@title,"$"),"this.nodeValue$")][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda//nu[@att][@xml:id="id9"][not(preceding-sibling::*)][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <omega title="true" xml:id="id1"> <psi title="100%" xml:lang="en-GB"> @@ -23606,6 +27641,11 @@ </test> <test> <xpath>//epsilon[@xml:id="id1"]//sigma[not(preceding-sibling::*)]//*[contains(concat(@attribute,"$"),"e$")][@xml:lang="nb"][@xml:id="id2"][not(following-sibling::*)]/zeta[not(preceding-sibling::*)]//iota[@xml:lang="en-GB"][following-sibling::xi[@xml:lang="nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][not(following-sibling::rho)]//rho[starts-with(@src,"attribu")][not(preceding-sibling::*)][following-sibling::*[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//upsilon[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::iota[@xml:id="id5"]/psi[@xml:id="id6"][following-sibling::mu[not(following-sibling::*)]//kappa[@src="attribute value"][@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::omicron[starts-with(concat(@false,"-"),"true-")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[not(child::node())][following-sibling::gamma[starts-with(@insert,"a")][@xml:id="id8"][not(following-sibling::*)]//zeta[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[starts-with(@attribute,"fal")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omicron[@xml:lang="no"][not(following-sibling::*)]/sigma[starts-with(@src,"another")][following-sibling::*[position()=1]][following-sibling::delta//phi[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:id="id1"> <sigma> @@ -23650,6 +27690,11 @@ </test> <test> <xpath>//delta[starts-with(@content,"_bl")]//eta[@xml:lang="nb"][following-sibling::*[position()=3]][following-sibling::lambda[@xml:id="id1"][following-sibling::*[position()=2]][following-sibling::kappa[starts-with(concat(@string,"-"),"false-")][@xml:id="id2"][following-sibling::xi[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/zeta[following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[contains(concat(@attr,"$"),"se$")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[starts-with(concat(@object,"-"),"content-")][@xml:lang="nb"][not(following-sibling::*)]/theta[not(preceding-sibling::*)][following-sibling::chi[@src][@xml:id="id5"]/kappa[@data][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@number][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::xi[@true][preceding-sibling::*[position() = 2]][not(preceding-sibling::xi)][following-sibling::upsilon[@xml:id="id7"][following-sibling::omicron[@xml:lang="nb"]/lambda[@xml:lang="en-GB"][@xml:id="id8"]/zeta[@xml:id="id9"]/epsilon[@xml:lang="no-nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[contains(concat(@title,"$"),"k$")][@xml:lang="en-US"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <delta content="_blank"> <eta xml:lang="nb"/> @@ -23685,6 +27730,11 @@ </test> <test> <xpath>//chi[@string][@xml:lang="en"]/mu[starts-with(@and,"th")][@xml:lang="en-US"]/alpha[starts-with(@src,"1234567")][@xml:id="id1"][not(preceding-sibling::*)]/nu[@xml:lang="en"][@xml:id="id2"][following-sibling::upsilon[@content][@xml:id="id3"][following-sibling::tau[following-sibling::*[position()=1]][following-sibling::delta[@string][@xml:lang="en-US"][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <chi string="this-is-att-value" xml:lang="en"> <mu and="this.nodeValue" xml:lang="en-US"> @@ -23702,6 +27752,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-US"][@xml:id="id1"]/kappa[@attribute="this.nodeValue"][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::epsilon[starts-with(concat(@att,"-"),"solid 1px green-")][@xml:id="id2"]/alpha[@xml:lang="no"][@xml:id="id3"][following-sibling::omicron[not(following-sibling::*)]//psi[@xml:id="id4"][not(preceding-sibling::*)]//theta[contains(@false,"nod")][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(@desciption,"00%")][@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/omega[starts-with(@att,"another")][@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[starts-with(@number,"1")][@xml:id="id7"][not(following-sibling::*)]//upsilon[contains(@token,"co")][@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::lambda[@false="content"][preceding-sibling::*[position() = 1]]/beta[@att][@xml:lang="en-US"][not(child::node())][following-sibling::beta[@xml:lang="no"][not(following-sibling::*)]//rho[contains(concat(@attribute,"$"),"ntent$")][@xml:lang="nb"]/*[@xml:lang="nb"][following-sibling::iota[@token="this.nodeValue"][preceding-sibling::*[position() = 1]]//omicron[@false="123456789"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[following-sibling::mu[contains(@true,"nt")][@xml:id="id9"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(preceding-sibling::mu)]/upsilon[@object][not(preceding-sibling::*)]/beta[contains(@and,"true")][@xml:lang="nb"][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-US" xml:id="id1"> <kappa attribute="this.nodeValue" xml:lang="en-US"/> @@ -23745,6 +27800,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]/lambda[@xml:id="id2"]//omega[contains(concat(@attribute,"$"),"23456789$")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::gamma[contains(concat(@attribute,"$"),"lank$")][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]]/chi[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[@attr][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <lambda xml:id="id2"> @@ -23761,6 +27821,11 @@ </test> <test> <xpath>//omega[@xml:lang="no"][@xml:id="id1"]//upsilon[@xml:lang="no"][not(preceding-sibling::*)]/beta[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id3"][following-sibling::delta[@content][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]]//mu[@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::mu[@token="true"][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@attrib][@xml:lang="no-nb"][@xml:id="id5"][not(following-sibling::*)]/omega[contains(concat(@title,"$"),"se$")][@xml:lang="en-US"][@xml:id="id6"]/xi[@xml:id="id7"]/theta[contains(concat(@attr,"$"),"lue$")][@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)]//sigma[@xml:lang="no-nb"][not(child::node())][following-sibling::lambda[@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::xi[@and][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/*[starts-with(@src,"true")][@xml:lang="en"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="en-GB"][@xml:id="id11"][not(preceding-sibling::phi or following-sibling::phi)]/zeta[not(preceding-sibling::*)]//xi[@xml:lang="en-US"][not(child::node())][following-sibling::gamma[@true="content"][@xml:lang="no-nb"][@xml:id="id12"][preceding-sibling::*[position() = 1]]//beta[@xml:lang="en-GB"][@xml:id="id13"]//chi[@xml:lang="en-US"][not(following-sibling::*)]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>1</nth> + </result> <tree> <omega xml:lang="no" xml:id="id1"> <upsilon xml:lang="no"> @@ -23802,6 +27867,11 @@ </test> <test> <xpath>//theta[contains(concat(@insert,"$"),"attribute$")][@xml:lang="nb"][@xml:id="id1"]//kappa[not(following-sibling::*)]//theta[@xml:lang="en-US"]//chi[@xml:id="id2"]/*[@name][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::theta[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]//mu[not(child::node())][following-sibling::iota[@insert][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::kappa[contains(@insert,"al")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/pi[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@true][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::alpha[@xml:id="id7"]/chi[@xml:lang="no-nb"]//xi[@true][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <theta insert="attribute" xml:lang="nb" xml:id="id1"> <kappa> @@ -23833,6 +27903,11 @@ </test> <test> <xpath>//psi[@xml:lang="no-nb"]//mu[starts-with(concat(@content,"-"),"attribute value-")][not(preceding-sibling::*)][following-sibling::chi[@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[@class="attribute-value"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@xml:lang="en"][following-sibling::*[position()=3]][following-sibling::upsilon[following-sibling::*[position()=2]][not(child::node())][following-sibling::*[@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta//xi[@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="no-nb"][not(following-sibling::*)]/zeta[not(preceding-sibling::*)]/kappa[not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <psi xml:lang="no-nb"> <mu content="attribute value"/> @@ -23860,6 +27935,11 @@ </test> <test> <xpath>//lambda[@insert="content"]//omicron[@desciption][@xml:lang="en-GB"][@xml:id="id1"]/zeta[starts-with(concat(@delete,"-"),"true-")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(preceding-sibling::zeta)]//iota[@content][@xml:lang="nb"]/xi[contains(@token,"e")][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@number="_blank"][not(preceding-sibling::*)][not(parent::*/*[position()=2])]/gamma[starts-with(concat(@name,"-"),"true-")][@xml:lang="en"][not(preceding-sibling::*)]/zeta[@att="content"][@xml:lang="no-nb"][@xml:id="id3"]//omega[not(following-sibling::*)]/upsilon[contains(concat(@object,"$")," green$")][@xml:lang="en"][@xml:id="id4"]//*[starts-with(@src,"tr")][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(@and,"anot")][not(following-sibling::*)]//*[contains(@content,"tru")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[contains(concat(@token,"$"),"100%$")][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@data="attribute value"][@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[contains(concat(@insert,"$"),"lank$")][@xml:lang="no"][@xml:id="id9"]//delta[@xml:id="id10"][not(preceding-sibling::*)]/mu[contains(concat(@abort,"$"),"r attribute value$")][not(following-sibling::*)]/omicron[@delete="attribute-value"][@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::pi[contains(@true,"nodeValue")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>1</nth> + </result> <tree> <lambda insert="content"> <omicron desciption="false" xml:lang="en-GB" xml:id="id1"> @@ -23907,6 +27987,11 @@ </test> <test> <xpath>//tau[@xml:lang="no"]/delta[not(preceding-sibling::*)][following-sibling::eta[contains(@abort," 1px gr")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[starts-with(@object,"1")][@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[contains(concat(@title,"$"),"te value$")][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@and][@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]/rho[contains(@attribute,"onten")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta/omicron[@delete="this-is-att-value"][following-sibling::*[position()=3]][following-sibling::omicron[@object="123456789"][@xml:lang="en"][@xml:id="id3"][following-sibling::epsilon[following-sibling::nu[starts-with(concat(@attrib,"-"),"false-")][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][not(preceding-sibling::nu)]//omicron[@xml:lang="en-GB"][@xml:id="id5"][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no"> <delta/> @@ -23936,6 +28021,11 @@ </test> <test> <xpath>//omicron[@xml:id="id1"]/beta[not(preceding-sibling::*)][following-sibling::kappa[starts-with(@content,"this-is-att-v")][@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/alpha//alpha[not(following-sibling::*)]/eta[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@content][following-sibling::epsilon[@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[@xml:id="id5"][preceding-sibling::*[position() = 2]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omicron xml:id="id1"> <beta/> @@ -23957,6 +28047,11 @@ </test> <test> <xpath>//phi//theta[starts-with(concat(@true,"-"),"content-")][not(child::node())][following-sibling::epsilon[@xml:id="id1"][not(child::node())][following-sibling::psi[not(child::node())][following-sibling::chi[starts-with(concat(@data,"-"),"another attribute value-")][@xml:lang="en-US"][@xml:id="id2"]//rho[@token][@xml:lang="en"]//omicron[@attribute="attribute"][not(following-sibling::*)]//chi[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::theta[contains(concat(@and,"$"),"ttribute value$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[@and][@xml:lang="no-nb"]/eta[@number="content"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::omega[contains(@abort,"nt")][preceding-sibling::*[position() = 1]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <phi> <theta true="content"/> @@ -23982,6 +28077,11 @@ </test> <test> <xpath>//*[@xml:lang="en-GB"][@xml:id="id1"]//xi[starts-with(@content,"tru")][following-sibling::chi[@src][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[starts-with(@attribute,"solid 1")][@xml:lang="nb"][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::eta[starts-with(@or,"1234")][preceding-sibling::*[position() = 4]]//rho[@xml:lang="no-nb"][not(following-sibling::*)]//omega[starts-with(@or,"1234")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:id="id5"]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-GB" xml:id="id1"> <xi content="true"/> @@ -24001,6 +28101,11 @@ </test> <test> <xpath>//gamma[@or="this-is-att-value"]//chi[@xml:lang="no"][following-sibling::lambda[@xml:lang="no-nb"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::gamma[@and="attribute"][@xml:lang="en"][@xml:id="id2"]/epsilon[following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[starts-with(@false,"f")][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[starts-with(concat(@abort,"-"),"false-")][not(child::node())][following-sibling::theta[contains(@name,"k")][@xml:id="id4"][not(following-sibling::*)]/chi[@xml:lang="no"][@xml:id="id5"][not(following-sibling::*)]//phi[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[@xml:id="id6"][not(child::node())][following-sibling::delta[@xml:id="id7"]/alpha[contains(@object,"r attribute ")][@xml:lang="no"][not(preceding-sibling::*)]/upsilon[@xml:lang="nb"][not(child::node())][following-sibling::alpha[@xml:id="id8"][preceding-sibling::*[position() = 1]]/pi[starts-with(@object,"thi")][not(following-sibling::*)]/delta[@xml:id="id9"][not(following-sibling::*)]/omega[@xml:id="id10"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <gamma or="this-is-att-value"> <chi xml:lang="no"/> @@ -24036,6 +28141,11 @@ </test> <test> <xpath>//zeta[@xml:id="id1"]//phi[contains(concat(@attribute,"$"),"reen$")][@xml:lang="en-US"][not(child::node())][following-sibling::iota[@object][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::lambda[preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[starts-with(@token,"attribute-value")][@xml:id="id3"][not(following-sibling::*)]/rho[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)]//xi[not(child::node())][following-sibling::eta[@name][@xml:id="id6"][not(following-sibling::*)]/omicron[@class="attribute-value"][@xml:id="id7"][following-sibling::sigma[starts-with(@attrib,"attribute v")][@xml:lang="en-GB"][not(following-sibling::*)]//omicron[@xml:lang="en"]//upsilon[@abort][not(preceding-sibling::*)][following-sibling::omega[@number][@xml:lang="no"][@xml:id="id8"][following-sibling::nu[contains(concat(@src,"$"),"ibute value$")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//omega[@xml:lang="en-US"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(preceding-sibling::omega)][following-sibling::phi[@xml:lang="no-nb"][@xml:id="id10"][not(following-sibling::*)]//theta[starts-with(concat(@abort,"-"),"attribute-")][@xml:id="id11"]/delta[contains(@desciption,"lue")][not(following-sibling::*)]//omicron[@token][@xml:id="id12"][not(preceding-sibling::*)]/lambda[contains(@number,"reen")][@xml:lang="en-GB"][@xml:id="id13"][following-sibling::lambda[@att][@xml:id="id14"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::epsilon[@delete="solid 1px green"][@xml:lang="en-US"][@xml:id="id15"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/phi[contains(concat(@name,"$")," attribute value$")][@xml:lang="en-GB"][@xml:id="id16"][not(preceding-sibling::*)]]]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <zeta xml:id="id1"> <phi attribute="solid 1px green" xml:lang="en-US"/> @@ -24080,6 +28190,11 @@ </test> <test> <xpath>//lambda[@src]/nu[not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@attr,"$"),"00%$")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/phi[contains(concat(@string,"$"),"s.nodeValue$")][@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@false="_blank"][@xml:id="id2"][not(following-sibling::*)]//iota[@delete][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::xi[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:lang="nb"][not(following-sibling::*)]/delta[starts-with(concat(@object,"-"),"attribute-")][@xml:lang="nb"]/alpha[@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::gamma[preceding-sibling::*[position() = 1]]//xi[not(child::node())][following-sibling::iota[starts-with(@number,"this.n")][@xml:lang="no"][@xml:id="id7"][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <lambda src="100%"> <nu/> @@ -24108,6 +28223,11 @@ </test> <test> <xpath>//iota[@xml:lang="en"][@xml:id="id1"]//psi[@false][@xml:id="id2"][not(preceding-sibling::*)]//sigma[@xml:id="id3"][not(child::node())][following-sibling::sigma[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omicron[contains(concat(@true,"$"),"r attribute value$")][not(child::node())][following-sibling::psi[starts-with(concat(@att,"-"),"attribute-")][@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omicron[@and][@xml:lang="en-US"][@xml:id="id6"][not(following-sibling::*)]//chi[@xml:lang="en-US"][not(following-sibling::*)]//epsilon[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@attribute][@xml:id="id8"][not(following-sibling::*)]//iota[contains(@title,"34")][@xml:lang="nb"][@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::phi[starts-with(concat(@attr,"-"),"123456789-")][@xml:lang="en"][@xml:id="id10"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="en" xml:id="id1"> <psi false="100%" xml:id="id2"> @@ -24133,6 +28253,11 @@ </test> <test> <xpath>//omega/upsilon[@xml:lang="en"]//zeta[@false][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::nu[starts-with(concat(@content,"-"),"_blank-")][@xml:lang="en-GB"][@xml:id="id2"][following-sibling::mu[following-sibling::*[position()=5]][following-sibling::tau[contains(concat(@false,"$"),"lse$")][@xml:id="id3"][not(child::node())][following-sibling::epsilon[@number][following-sibling::*[position()=3]][not(child::node())][following-sibling::eta[starts-with(@abort,"this.node")][@xml:lang="nb"][@xml:id="id4"][following-sibling::*[position()=2]][following-sibling::iota[@xml:lang="no-nb"][preceding-sibling::*[position() = 6]][following-sibling::beta[@false="attribute value"][@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 7]][not(following-sibling::*)]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <omega> <upsilon xml:lang="en"> @@ -24152,6 +28277,11 @@ </test> <test> <xpath>//omega[@xml:lang="no-nb"][@xml:id="id1"]/chi[contains(@title,"b")][@xml:lang="en-US"][@xml:id="id2"][following-sibling::alpha[starts-with(concat(@token,"-"),"123456789-")][@xml:id="id3"]//eta[starts-with(concat(@abort,"-"),"solid 1px green-")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:lang="nb"][@xml:id="id5"]//*[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@object][@xml:lang="no-nb"][@xml:id="id6"]//nu[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[contains(concat(@false,"$"),"e value$")][preceding-sibling::*[position() = 1]][following-sibling::mu[@xml:lang="nb"][@xml:id="id7"][not(following-sibling::*)]//psi[starts-with(@desciption,"1")][following-sibling::pi[@data][@xml:lang="en-US"][@xml:id="id8"][following-sibling::beta[@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 2]]//lambda[@content][@xml:lang="en-GB"][not(preceding-sibling::*)]/lambda[@xml:lang="no-nb"][not(preceding-sibling::*)]]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="no-nb" xml:id="id1"> <chi title="attribute" xml:lang="en-US" xml:id="id2"/> @@ -24182,6 +28312,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-US"]//kappa[@xml:id="id1"][following-sibling::*[position()=2]][following-sibling::gamma[contains(concat(@src,"$"),"rue$")][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::phi//epsilon[@insert][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[contains(@src,"other")][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::beta[@desciption="this-is-att-value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau[not(preceding-sibling::*)][not(following-sibling::*)][not(parent::*/*[position()=2])]//pi[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::nu[starts-with(@number,"10")][preceding-sibling::*[position() = 1]]/lambda[contains(@content," value")][@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-US"> <kappa xml:id="id1"/> @@ -24205,6 +28340,11 @@ </test> <test> <xpath>//beta[@attrib][@xml:lang="en-US"]//chi[@desciption][@xml:lang="no"][following-sibling::rho[starts-with(@attrib,"this")][@xml:id="id1"][preceding-sibling::*[position() = 1]]//sigma[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@true][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[@delete="attribute value"][@xml:lang="en-GB"][not(preceding-sibling::*)]//omicron[@object="another attribute value"][@xml:lang="en-GB"]/lambda[contains(concat(@token,"$"),"value$")][@xml:lang="en-US"][not(preceding-sibling::*)]//iota[starts-with(concat(@true,"-"),"attribute-")][@xml:id="id3"][following-sibling::lambda[@xml:lang="en-GB"][following-sibling::delta[@data][@xml:id="id4"][preceding-sibling::*[position() = 2]]//chi[@delete="attribute value"][@xml:lang="en-GB"][@xml:id="id5"]/pi[starts-with(concat(@abort,"-"),"true-")][not(following-sibling::*)]//kappa[@xml:lang="nb"][not(following-sibling::*)]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <beta attrib="100%" xml:lang="en-US"> <chi desciption="true" xml:lang="no"/> @@ -24236,6 +28376,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]//iota[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::lambda[contains(concat(@number,"$"),"e$")][@xml:lang="en-GB"][@xml:id="id2"]//sigma[contains(concat(@class,"$"),"ue$")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][following-sibling::pi[preceding-sibling::*[position() = 2]][following-sibling::*[position()=4]][not(child::node())][following-sibling::zeta[starts-with(@data,"th")][@xml:id="id4"][not(child::node())][following-sibling::lambda[starts-with(@title,"this.nodeValu")][@xml:id="id5"][not(child::node())][following-sibling::beta[@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 5]][following-sibling::xi[@xml:id="id7"][not(following-sibling::*)]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <alpha xml:id="id1"> <iota xml:lang="en-GB"/> @@ -24255,6 +28400,11 @@ </test> <test> <xpath>//delta[@false][@xml:id="id1"]/chi[@true][@xml:lang="en-GB"]//rho[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[not(preceding-sibling::*)][not(following-sibling::tau)]/sigma[contains(@token,"ribut")][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[contains(concat(@name,"$"),"ue$")][@xml:id="id3"]//phi[@xml:id="id4"][not(child::node())][following-sibling::omicron[@xml:id="id5"][not(following-sibling::*)]/delta[@token][@xml:lang="no"]/sigma[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@xml:id="id7"][not(child::node())][following-sibling::sigma[starts-with(concat(@delete,"-"),"true-")][@xml:id="id8"][not(following-sibling::*)]//lambda[@name][@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::iota[contains(@and,"t")][preceding-sibling::*[position() = 1]]/chi[@xml:lang="en-US"][@xml:id="id10"][following-sibling::epsilon[@xml:lang="en"][@xml:id="id11"][not(following-sibling::*)]//omega[@object][not(preceding-sibling::*)][following-sibling::omicron[@xml:id="id12"][preceding-sibling::*[position() = 1]]/phi[@attrib][@xml:lang="en-US"][@xml:id="id13"]//*[contains(@and,"ue")][not(preceding-sibling::*)][not(following-sibling::*)]/*[not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <delta false="content" xml:id="id1"> <chi true="true" xml:lang="en-GB"> @@ -24298,6 +28448,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en"]/zeta[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::omicron[starts-with(@false,"this")][following-sibling::gamma[not(following-sibling::*)]//epsilon[@xml:lang="no"]/nu[@xml:lang="nb"][@xml:id="id2"][not(child::node())][following-sibling::*[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)]/lambda[contains(concat(@object,"$"),"e value$")][not(preceding-sibling::*)]//*[starts-with(concat(@attr,"-"),"_blank-")][@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::chi[starts-with(@or,"solid 1px")][@xml:lang="no"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en"> <zeta xml:lang="en-US" xml:id="id1"/> @@ -24322,6 +28477,11 @@ </test> <test> <xpath>//omega[contains(concat(@src,"$"),"9$")][@xml:id="id1"]/zeta[@xml:id="id2"][not(child::node())][following-sibling::rho[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:lang="no-nb"][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id4"]//tau[@xml:lang="nb"][@xml:id="id5"]//iota[starts-with(@content,"this")][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[contains(@delete,"00%")][@xml:id="id7"][not(child::node())][following-sibling::zeta[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/nu[@xml:lang="en"][@xml:id="id8"][not(following-sibling::*)]/kappa[@attribute][@xml:id="id9"][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][not(following-sibling::*)]/nu[@xml:lang="en-GB"][@xml:id="id10"]//psi[starts-with(@abort,"so")][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::psi[contains(concat(@true,"$"),"00%$")][@xml:id="id12"][following-sibling::*[position()=2]][not(child::node())][following-sibling::eta[@xml:id="id13"][not(child::node())][following-sibling::nu[@or="attribute value"][@xml:lang="en"]][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <omega src="123456789" xml:id="id1"> <zeta xml:id="id2"/> @@ -24353,6 +28513,11 @@ </test> <test> <xpath>//beta[contains(concat(@attr,"$"),"00%$")][@xml:lang="no-nb"]/tau[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::tau)]//tau[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@xml:lang="no"][not(child::node())][following-sibling::tau[@title][@xml:lang="nb"]//delta[starts-with(concat(@name,"-"),"this.nodeValue-")][@xml:lang="no"][not(child::node())][following-sibling::theta[not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <beta attr="100%" xml:lang="no-nb"> <tau xml:lang="no" xml:id="id1"> @@ -24373,6 +28538,11 @@ </test> <test> <xpath>//xi[@token="content"][@xml:id="id1"]//chi[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:lang="en"][@xml:id="id3"]/delta[contains(@attr,"9")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::upsilon[contains(@number,"s")][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::gamma[starts-with(concat(@attr,"-"),"attribute value-")][not(child::node())][following-sibling::tau[starts-with(concat(@title,"-"),"100%-")][preceding-sibling::*[position() = 3]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <xi token="content" xml:id="id1"> <chi xml:id="id2"> @@ -24390,6 +28560,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no-nb"][@xml:id="id1"]/theta[starts-with(@false,"attribute")][@xml:lang="no-nb"][not(following-sibling::*)]/beta[not(child::node())][following-sibling::pi[not(child::node())][following-sibling::alpha[starts-with(@att,"at")][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/tau[@xml:lang="no-nb"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[starts-with(@content,"_blan")][@xml:lang="en"][not(following-sibling::*)]//iota[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]/rho[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[contains(@data,"ttribute value")][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@xml:lang="en"][@xml:id="id5"][following-sibling::*[position()=3]][not(child::node())][following-sibling::alpha[starts-with(concat(@data,"-"),"123456789-")][@xml:lang="nb"][@xml:id="id6"][following-sibling::omicron[@attribute][@xml:lang="no"][@xml:id="id7"][not(child::node())][following-sibling::zeta[starts-with(@true,"co")][@xml:lang="no-nb"][@xml:id="id8"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="no-nb" xml:id="id1"> <theta false="attribute" xml:lang="no-nb"> @@ -24417,6 +28592,11 @@ </test> <test> <xpath>//sigma[@content][@xml:lang="no-nb"]/iota[starts-with(@true,"this-is-att-va")][@xml:id="id1"][following-sibling::phi[contains(concat(@true,"$"),"alue$")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::pi[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::omicron[@src][@xml:id="id3"][following-sibling::mu[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 5]]/delta[@data="another attribute value"][following-sibling::*[position()=1]][following-sibling::mu[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <sigma content="attribute" xml:lang="no-nb"> <iota true="this-is-att-value" xml:id="id1"/> @@ -24438,6 +28618,11 @@ </test> <test> <xpath>//mu//beta//zeta[starts-with(@number,"12345678")][not(preceding-sibling::*)]//omega[@xml:lang="no"][not(following-sibling::*)]/pi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::upsilon[contains(concat(@attrib,"$"),"lue$")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[contains(concat(@attrib,"$"),"blank$")][preceding-sibling::*[position() = 2]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <mu> <beta> @@ -24456,6 +28641,11 @@ </test> <test> <xpath>//theta[@false="solid 1px green"][@xml:lang="nb"]/lambda[starts-with(concat(@desciption,"-"),"123456789-")][@xml:id="id1"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::theta)]//kappa[starts-with(concat(@attrib,"-"),"content-")]//tau[contains(@class,"alse")][@xml:lang="no-nb"][@xml:id="id3"][following-sibling::omega[@xml:id="id4"][not(child::node())][following-sibling::*[@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omicron[@class][not(child::node())][following-sibling::omicron[contains(@attrib,"te")][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 4]]/phi[@string][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[@xml:id="id9"][not(preceding-sibling::*)][following-sibling::mu[contains(concat(@string,"$"),"this-is-att-value$")][preceding-sibling::*[position() = 1]]][position() = 1]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <theta false="solid 1px green" xml:lang="nb"> <lambda desciption="123456789" xml:id="id1"/> @@ -24481,6 +28671,11 @@ </test> <test> <xpath>//omega[@xml:lang="nb"]//upsilon[@xml:lang="en-GB"][following-sibling::*[position()=2]][not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][not(child::node())][following-sibling::rho[starts-with(concat(@content,"-"),"solid 1px green-")][@xml:lang="en-GB"][not(following-sibling::*)]/delta[starts-with(concat(@attrib,"-"),"_blank-")][@xml:lang="no-nb"]/chi[contains(@insert,"s-att-val")][@xml:lang="en"][@xml:id="id1"][not(child::node())][following-sibling::delta[@attrib="123456789"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::omega[contains(concat(@false,"$"),"nt$")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]]//psi[@xml:id="id4"][following-sibling::kappa[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]]/iota[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::zeta[contains(@attribute,"7")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::upsilon[@xml:lang="nb"][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[following-sibling::*[not(following-sibling::*)]/epsilon[@xml:lang="en-US"][following-sibling::eta[not(child::node())][following-sibling::phi[@attrib][following-sibling::delta[@attribute][@xml:lang="nb"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="nb"> <upsilon xml:lang="en-GB"/> @@ -24513,6 +28708,11 @@ </test> <test> <xpath>//theta[@xml:lang="en-GB"]//psi[@attr][@xml:id="id1"][not(preceding-sibling::*)]//omicron[@number][not(following-sibling::*)][not(following-sibling::omicron)]/kappa[@token][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/delta[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)]/phi[@class="this.nodeValue"][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::upsilon)]//eta[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::epsilon[starts-with(concat(@token,"-"),"attribute-")][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/iota][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="en-GB"> <psi attr="another attribute value" xml:id="id1"> @@ -24538,6 +28738,11 @@ </test> <test> <xpath>//mu[contains(@content,"ibute")]//upsilon[@xml:id="id1"]//omega[starts-with(@string,"c")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::kappa[@xml:id="id3"][not(preceding-sibling::kappa)]//iota[@xml:id="id4"][not(preceding-sibling::*)]/xi[not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <mu content="attribute"> <upsilon xml:id="id1"> @@ -24555,6 +28760,11 @@ </test> <test> <xpath>//sigma[@xml:lang="no-nb"]//alpha[starts-with(concat(@name,"-"),"attribute value-")][@xml:id="id1"][not(child::node())][following-sibling::pi[@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::zeta[@attr][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//lambda[contains(concat(@src,"$"),"ttribute value$")][@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::*[@xml:lang="en"]//phi[@delete][@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::phi[@xml:id="id4"]/beta[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::beta[starts-with(concat(@and,"-"),"this.nodeValue-")][following-sibling::*[position()=2]][following-sibling::chi[contains(concat(@data,"$"),"ttribute value$")][not(child::node())][following-sibling::epsilon[@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//*[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[@xml:lang="en-US"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="no-nb"> <alpha name="attribute value" xml:id="id1"/> @@ -24581,6 +28791,11 @@ </test> <test> <xpath>//mu//mu[@insert][@xml:lang="nb"][@xml:id="id1"]//phi[@xml:id="id2"][not(child::node())][following-sibling::mu[@content][@xml:id="id3"][following-sibling::tau[preceding-sibling::*[position() = 2]]//epsilon[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::*[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::rho[@name][@xml:id="id4"][not(following-sibling::*)][not(preceding-sibling::rho)]/tau[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::gamma[@content][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <mu> <mu insert="false" xml:lang="nb" xml:id="id1"> @@ -24602,6 +28817,11 @@ </test> <test> <xpath>//beta/alpha[starts-with(concat(@false,"-"),"123456789-")][@xml:lang="no-nb"][not(child::node())][following-sibling::phi[@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:lang="nb"][not(following-sibling::*)][not(preceding-sibling::theta)]/omega[contains(@token,"ue")][not(preceding-sibling::*)]/zeta[starts-with(@title,"t")][not(following-sibling::*)]/kappa[@data="attribute"][following-sibling::rho[@xml:lang="no"][not(child::node())][following-sibling::delta[@xml:id="id2"][preceding-sibling::*[position() = 2]]//delta[@number][@xml:lang="en-GB"][not(preceding-sibling::*)]//theta[@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:id="id5"][not(following-sibling::*)]//eta[@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:lang="nb"][not(following-sibling::*)]/eta[@xml:lang="nb"]//xi[@xml:id="id6"][following-sibling::eta[@xml:lang="no-nb"][not(child::node())][following-sibling::delta[@delete="this-is-att-value"][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::delta)][following-sibling::mu[starts-with(concat(@true,"-"),"solid 1px green-")][preceding-sibling::*[position() = 3]]][position() = 1]]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <beta> <alpha false="123456789" xml:lang="no-nb"/> @@ -24639,6 +28859,11 @@ </test> <test> <xpath>//*/theta[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/rho[starts-with(concat(@src,"-"),"100%-")]/iota[@delete][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]//chi/sigma[@or][@xml:lang="en-US"][following-sibling::omicron[contains(@attrib,"lue")][preceding-sibling::*[position() = 1]]/chi[not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="no"][following-sibling::*[position()=3]][following-sibling::upsilon[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::pi[@attribute][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[contains(@delete,"00%")][not(following-sibling::*)]//omicron[@xml:lang="en-US"][@xml:id="id3"][following-sibling::beta[@insert][@xml:id="id4"][not(child::node())][following-sibling::epsilon[contains(concat(@token,"$"),"e$")][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 2]]//epsilon[@xml:lang="no-nb"][not(preceding-sibling::*)]/chi[contains(concat(@and,"$"),"ank$")][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[contains(@name,"nt")][@xml:lang="en-GB"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::omicron)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <any> <theta xml:lang="en" xml:id="id1"> @@ -24674,6 +28899,11 @@ </test> <test> <xpath>//omega[@xml:lang="en"]/upsilon[@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)]//mu[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[starts-with(@attribute,"att")][@xml:id="id3"][not(following-sibling::*)]/lambda[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::zeta[contains(concat(@true,"$"),"lue$")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/beta[starts-with(concat(@src,"-"),"another attribute value-")][not(preceding-sibling::*)][following-sibling::mu//tau[not(following-sibling::*)]//sigma[@xml:lang="en-GB"][not(preceding-sibling::*)]/pi[starts-with(concat(@attrib,"-"),"_blank-")][@xml:lang="nb"][not(following-sibling::*)]/iota[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-GB"][not(following-sibling::*)]/phi[@xml:lang="en-US"]//omega[@data][@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)]//omega[contains(@desciption,"lue")][@xml:id="id10"][not(preceding-sibling::*)]/nu[contains(concat(@desciption,"$"),"deValue$")][@xml:lang="no"][following-sibling::delta[@xml:id="id11"][following-sibling::upsilon[@xml:lang="en-GB"][@xml:id="id12"][following-sibling::iota[starts-with(concat(@string,"-"),"attribute-")][preceding-sibling::*[position() = 3]][following-sibling::upsilon[@xml:id="id13"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <omega xml:lang="en"> <upsilon xml:lang="no-nb" xml:id="id1"> @@ -24718,6 +28948,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="nb"]/epsilon[not(following-sibling::*)]/omega[starts-with(concat(@title,"-"),"false-")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[contains(concat(@delete,"$"),"e-value$")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]//lambda[contains(concat(@attribute,"$"),"is-att-value$")][@xml:id="id3"][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"]/chi[@or][not(following-sibling::*)]/delta[contains(concat(@desciption,"$"),"bute value$")][@xml:lang="en-GB"][@xml:id="id4"]//gamma[not(preceding-sibling::*)]/chi[@content][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(concat(@number,"$"),"blank$")][@xml:id="id5"][preceding-sibling::*[position() = 1]]/pi[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[starts-with(@false,"attribute val")][not(following-sibling::*)]//alpha[contains(concat(@object,"$"),"ank$")][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@attrib="this.nodeValue"][@xml:lang="nb"][not(preceding-sibling::*)]//rho[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="nb"> <epsilon> @@ -24754,6 +28989,11 @@ </test> <test> <xpath>//eta[@insert][@xml:lang="no-nb"]/omega[@xml:lang="en-US"][not(preceding-sibling::*)]/chi[@false="this.nodeValue"][@xml:id="id1"]//xi[@xml:id="id2"][following-sibling::omicron[starts-with(@att,"attribute-value")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omicron[@content="true"][preceding-sibling::*[position() = 2]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <eta insert="false" xml:lang="no-nb"> <omega xml:lang="en-US"> @@ -24770,6 +29010,11 @@ </test> <test> <xpath>//pi/chi[@data][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::omega[@xml:id="id2"][not(child::node())][following-sibling::beta[@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id4"][not(following-sibling::*)]//omega[contains(@string,"alue")]//eta[starts-with(concat(@data,"-"),"solid 1px green-")][@xml:lang="en-GB"][@xml:id="id5"][following-sibling::*[position()=3]][not(child::node())][following-sibling::eta[contains(@attrib,"ue")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::beta[contains(@abort,"00%")][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 3]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <pi> <chi data="solid 1px green" xml:id="id1"/> @@ -24790,6 +29035,11 @@ </test> <test> <xpath>//sigma[@false][@xml:lang="no"][@xml:id="id1"]/sigma[contains(@name,"V")][@xml:id="id2"]/omega[contains(concat(@delete,"$"),"%$")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[@insert="123456789"]/mu[@xml:id="id4"][not(following-sibling::*)]/pi[@data="false"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>1</nth> + </result> <tree> <sigma false="_blank" xml:lang="no" xml:id="id1"> <sigma name="this.nodeValue" xml:id="id2"> @@ -24808,6 +29058,11 @@ </test> <test> <xpath>//*[@xml:lang="en-GB"][@xml:id="id1"]/tau[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[contains(@name,"is.")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/zeta[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::chi[@xml:id="id3"][following-sibling::alpha[@delete][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[starts-with(concat(@src,"-"),"attribute value-")][following-sibling::phi[@src="attribute"][following-sibling::psi[starts-with(concat(@src,"-"),"true-")][@xml:id="id5"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(preceding-sibling::psi or following-sibling::psi)][not(child::node())][following-sibling::omicron[@attribute][preceding-sibling::*[position() = 3]][following-sibling::rho[@abort="this.nodeValue"][@xml:lang="nb"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::pi[@att]/nu[not(following-sibling::*)]//theta[@token][@xml:id="id7"][not(child::node())][following-sibling::chi[not(following-sibling::*)][position() = 1]]][position() = 1]]]]]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <any xml:lang="en-GB" xml:id="id1"> <tau xml:lang="en"/> @@ -24835,6 +29090,11 @@ </test> <test> <xpath>//upsilon[@xml:id="id1"]/mu[@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::kappa[@true][@xml:id="id3"]/kappa[@xml:lang="en"][following-sibling::upsilon[starts-with(concat(@insert,"-"),"true-")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[@insert="another attribute value"][not(preceding-sibling::*)][not(child::node())][following-sibling::*//zeta[contains(@true,"1234567")][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::zeta)]/rho[starts-with(@att,"soli")][@xml:lang="en-GB"]/omicron[contains(concat(@class,"$"),"n$")][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@attr="false"][not(following-sibling::*)]/tau[@desciption="solid 1px green"][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:id="id6"][not(following-sibling::*)]//upsilon[@xml:lang="en-US"][not(following-sibling::*)]//pi[@title="solid 1px green"][@xml:id="id7"][not(preceding-sibling::*)]//kappa[@xml:lang="nb"][not(child::node())][following-sibling::nu[@or][@xml:id="id8"][not(following-sibling::*)]/sigma[following-sibling::phi[contains(@attribute,"eV")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::mu[not(following-sibling::*)]//omicron[@attr][@xml:id="id9"][not(following-sibling::*)]]]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:id="id1"> <mu xml:lang="en-US" xml:id="id2"/> @@ -24875,6 +29135,11 @@ </test> <test> <xpath>//lambda[@att]//nu[contains(concat(@desciption,"$"),"te value$")][@xml:lang="no"][@xml:id="id1"][not(child::node())][following-sibling::chi[@att][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[contains(@true,"lan")][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]/beta[contains(@content,"e v")][@xml:lang="en-US"][following-sibling::omega[@string][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(preceding-sibling::omega)][not(child::node())][following-sibling::iota[contains(@true,"e")][@xml:lang="en-GB"][@xml:id="id4"][not(following-sibling::*)]/epsilon[contains(concat(@insert,"$"),"e$")][@xml:lang="no-nb"][@xml:id="id5"]//iota[@and][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][not(child::node())][following-sibling::iota[contains(concat(@attr,"$"),"-value$")][@xml:lang="en"][@xml:id="id6"]//lambda[@xml:lang="no"][@xml:id="id7"][following-sibling::tau[contains(@or,"100")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[contains(concat(@true,"$"),"attribute$")][not(following-sibling::*)]/delta[@attribute][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::zeta[@xml:lang="en"][@xml:id="id8"]//delta[@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[starts-with(concat(@object,"-"),"true-")][@xml:lang="no-nb"]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <lambda att="false"> <nu desciption="attribute value" xml:lang="no" xml:id="id1"/> @@ -24908,6 +29173,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en-GB"][@xml:id="id1"]//psi[starts-with(@true,"a")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(@delete,"lue")][@xml:lang="en-US"][following-sibling::*[position()=1]][following-sibling::eta[contains(@insert,"ribute")][@xml:lang="en-US"]/kappa[contains(concat(@title,"$"),"te-value$")][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::sigma[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 2]][following-sibling::tau[contains(@attribute,"ute v")][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(preceding-sibling::tau)][not(child::node())][following-sibling::alpha[starts-with(@or,"attrib")][@xml:lang="en"][preceding-sibling::*[position() = 4]][following-sibling::sigma[@and][not(following-sibling::*)]][position() = 1]]]]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en-GB" xml:id="id1"> <psi true="attribute-value" xml:lang="nb" xml:id="id2"> @@ -24929,6 +29199,11 @@ </test> <test> <xpath>//lambda//nu[@xml:lang="nb"][not(child::node())][following-sibling::lambda[contains(concat(@desciption,"$"),"id 1px green$")]//omega[@or="attribute-value"][not(child::node())][following-sibling::rho[@xml:lang="en"][@xml:id="id1"][following-sibling::*[position()=2]][not(child::node())][following-sibling::zeta[@string][@xml:lang="en"][not(child::node())][following-sibling::lambda[starts-with(@class,"this-is-a")][@xml:lang="en"][@xml:id="id2"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/eta[contains(@attr," green")]/epsilon[starts-with(concat(@content,"-"),"123456789-")][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::zeta[@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/eta[@token][not(preceding-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <lambda> <nu xml:lang="nb"/> @@ -24952,6 +29227,11 @@ </test> <test> <xpath>//kappa[@xml:id="id1"]/xi[@xml:lang="no-nb"]/sigma[@string="true"][@xml:lang="en"][@xml:id="id2"][following-sibling::gamma[@name][@xml:id="id3"][not(preceding-sibling::gamma)][following-sibling::chi[@false][@xml:id="id4"][following-sibling::epsilon[starts-with(@string,"false")][@xml:id="id5"][preceding-sibling::*[position() = 3]][following-sibling::xi[@data="solid 1px green"][@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 4]]/mu[@attrib="_blank"][@xml:lang="en-GB"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::gamma[@desciption="content"][not(following-sibling::*)]//gamma[@and][@xml:lang="no"][following-sibling::psi[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::psi[contains(@attribute,"n")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]/lambda[@xml:id="id8"][not(preceding-sibling::*)][following-sibling::nu[starts-with(@name,"s")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[starts-with(concat(@true,"-"),"this.nodeValue-")][@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <kappa xml:id="id1"> <xi xml:lang="no-nb"> @@ -24981,6 +29261,11 @@ </test> <test> <xpath>//pi//beta[starts-with(concat(@data,"-"),"false-")][not(preceding-sibling::*)][following-sibling::upsilon[contains(concat(@name,"$"),"se$")][@xml:id="id1"]/alpha[@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]/mu[@xml:id="id3"]//lambda[@xml:lang="no-nb"][following-sibling::*[position()=5]][following-sibling::psi[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::rho[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::tau[@xml:lang="no-nb"][following-sibling::alpha[@name="this-is-att-value"][@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::gamma[@xml:id="id5"][not(following-sibling::*)]//theta[not(preceding-sibling::*)]/xi[@object][@xml:lang="en-GB"][not(child::node())][following-sibling::chi[@or][@xml:lang="no-nb"]]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <pi> <beta data="false"/> @@ -25008,6 +29293,11 @@ </test> <test> <xpath>//mu[@token="100%"]//psi[@xml:lang="en-US"][not(preceding-sibling::*)]//nu[starts-with(@token,"another attri")][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="nb"][preceding-sibling::*[position() = 1]]/mu[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@xml:lang="en"][not(following-sibling::*)]/*[@xml:id="id3"][not(following-sibling::*)]/zeta[@xml:id="id4"][not(following-sibling::*)]//sigma[contains(@true,"6789")][following-sibling::*[position()=3]][following-sibling::rho[@and][@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[not(child::node())][following-sibling::zeta[starts-with(concat(@name,"-"),"100%-")][@xml:id="id6"][not(following-sibling::*)][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <mu token="100%"> <psi xml:lang="en-US"> @@ -25035,6 +29325,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]//mu[@attrib="123456789"][@xml:id="id2"][not(following-sibling::*)]/upsilon[starts-with(concat(@number,"-"),"attribute value-")][@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)]/upsilon[starts-with(@name,"attribute")][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@att="true"][@xml:lang="en-GB"][not(following-sibling::*)]/iota[starts-with(concat(@content,"-"),"100%-")][@xml:id="id5"][not(preceding-sibling::*)]//sigma[starts-with(@delete,"100%")][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::zeta[@attr][@xml:lang="en-US"][@xml:id="id7"][following-sibling::gamma[@xml:lang="nb"][@xml:id="id8"][not(child::node())][following-sibling::phi[starts-with(@and,"this-is-att")][@xml:lang="nb"][preceding-sibling::*[position() = 3]]//zeta[@xml:lang="en-GB"][@xml:id="id9"]//mu[@xml:lang="en-US"]/theta[@xml:id="id10"][following-sibling::gamma[contains(concat(@abort,"$"),"alse$")][@xml:id="id11"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:lang="en-GB"][not(following-sibling::*)]/delta[starts-with(concat(@attribute,"-"),"another attribute value-")][@xml:lang="no-nb"][@xml:id="id12"]//kappa[contains(concat(@desciption,"$"),"alue$")][@xml:lang="en"][@xml:id="id13"][following-sibling::delta[@delete][not(following-sibling::*)]//omicron[@src][@xml:id="id14"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::nu[@xml:lang="en-US"][@xml:id="id15"][preceding-sibling::*[position() = 1]][following-sibling::pi[@string="another attribute value"][preceding-sibling::*[position() = 2]]/gamma[@src][@xml:id="id16"][not(child::node())][following-sibling::*[@true][@xml:lang="no"][@xml:id="id17"][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>1</nth> + </result> <tree> <xi xml:id="id1"> <mu attrib="123456789" xml:id="id2"> @@ -25077,6 +29372,11 @@ </test> <test> <xpath>//alpha[@xml:id="id1"]/theta[@xml:lang="no"][not(following-sibling::*)]//rho[@or][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::rho[contains(concat(@token,"$"),"true$")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/pi[starts-with(@content,"_")][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::*[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//*[@xml:lang="nb"][@xml:id="id4"][not(child::node())][following-sibling::phi[contains(concat(@name,"$"),"ntent$")][@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//omega[starts-with(concat(@data,"-"),"content-")][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <alpha xml:id="id1"> <theta xml:lang="no"> @@ -25099,6 +29399,11 @@ </test> <test> <xpath>//upsilon[contains(@object,"-is-at")][@xml:lang="en-GB"]//mu[@or="false"][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@name][@xml:id="id2"][not(preceding-sibling::*)]/iota[@token][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::iota)]/xi[@title="content"][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::chi[starts-with(concat(@abort,"-"),"solid 1px green-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@src="another attribute value"][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <upsilon object="this-is-att-value" xml:lang="en-GB"> <mu or="false" xml:lang="en-US" xml:id="id1"> @@ -25118,6 +29423,11 @@ </test> <test> <xpath>//phi[contains(concat(@data,"$"),"tribute$")][@xml:lang="no-nb"][@xml:id="id1"]//kappa[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::*[position()=3]][following-sibling::iota[@string][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[not(following-sibling::*)]//lambda[@false="content"][following-sibling::*[position()=2]][not(child::node())][following-sibling::phi[@xml:lang="en"][following-sibling::sigma[starts-with(@object,"this.nodeValu")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]]/sigma[@attribute][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[starts-with(concat(@string,"-"),"this-")][@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@object][@xml:id="id8"][following-sibling::*[position()=2]][following-sibling::delta[starts-with(@insert,"this-is-a")][@xml:id="id9"][following-sibling::eta[@xml:id="id10"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//tau[starts-with(@true,"con")][@xml:lang="en-GB"][@xml:id="id11"][following-sibling::kappa[starts-with(@title,"fal")][@xml:lang="en-GB"][@xml:id="id12"][preceding-sibling::*[position() = 1]]/delta[@string][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi data="attribute" xml:lang="no-nb" xml:id="id1"> <kappa xml:lang="en-GB" xml:id="id2"/> @@ -25152,6 +29462,11 @@ </test> <test> <xpath>//tau[@name="content"][@xml:id="id1"]//*[contains(@and,"blank")][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[starts-with(concat(@string,"-"),"attribute-")][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@token="this-is-att-value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/theta[@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[@title="100%"][not(preceding-sibling::*)]/epsilon[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::iota[contains(@title,"e")][@xml:id="id7"][following-sibling::lambda[@xml:id="id8"]//mu[@object="this.nodeValue"][@xml:lang="en-US"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)][not(following-sibling::chi)]/psi[starts-with(@insert,"false")][following-sibling::rho[contains(concat(@desciption,"$"),"456789$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <tau name="content" xml:id="id1"> <any and="_blank" xml:id="id2"/> @@ -25181,6 +29496,11 @@ </test> <test> <xpath>//phi[@true][@xml:lang="en-GB"][@xml:id="id1"]/iota[@insert][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::zeta[not(following-sibling::*)]//xi[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:lang="no-nb"][not(child::node())][following-sibling::gamma[contains(concat(@attribute,"$"),"ue$")][@xml:id="id3"]/zeta[@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[preceding-sibling::*[position() = 1]]/nu[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[starts-with(@attrib,"_blan")][preceding-sibling::*[position() = 1]][following-sibling::iota[contains(concat(@title,"$"),"e$")][@xml:lang="en-GB"][@xml:id="id6"][following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:lang="en-US"][following-sibling::nu[preceding-sibling::*[position() = 4]]/theta[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[@string="this.nodeValue"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:lang="no-nb"][@xml:id="id8"]/gamma[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[starts-with(concat(@title,"-"),"this-")][@xml:id="id9"][preceding-sibling::*[position() = 1]][following-sibling::epsilon[@xml:lang="en-US"][not(following-sibling::*)]//kappa[following-sibling::theta[contains(@object,"ttribute-val")][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <phi true="attribute value" xml:lang="en-GB" xml:id="id1"> <iota insert="123456789" xml:lang="en" xml:id="id2"/> @@ -25217,6 +29537,11 @@ </test> <test> <xpath>//theta[@delete][@xml:lang="no"][@xml:id="id1"]/theta[starts-with(concat(@content,"-"),"true-")][not(following-sibling::*)]/mu[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:id="id3"][not(following-sibling::*)]//*[contains(@true,"a")][not(preceding-sibling::*)][following-sibling::omicron[@xml:lang="nb"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[starts-with(@object,"conten")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/omega[not(preceding-sibling::omega)]//pi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[contains(@and,"nk")][@xml:id="id5"][not(child::node())][following-sibling::delta[@xml:id="id6"][not(following-sibling::*)]/mu[@or][following-sibling::omicron[starts-with(@or,"anot")][following-sibling::kappa[@src][preceding-sibling::*[position() = 2]][following-sibling::delta[starts-with(concat(@attrib,"-"),"true-")][@xml:lang="no"][@xml:id="id7"]]][position() = 1]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <theta delete="true" xml:lang="no" xml:id="id1"> <theta content="true"> @@ -25246,6 +29571,11 @@ </test> <test> <xpath>//sigma[starts-with(concat(@desciption,"-"),"100%-")][@xml:lang="nb"][@xml:id="id1"]/epsilon[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)]/pi[@xml:lang="no"]//epsilon[contains(concat(@number,"$"),"0%$")][@xml:lang="no"][not(following-sibling::*)]/mu[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::omicron[@content="attribute-value"][@xml:lang="no-nb"]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <sigma desciption="100%" xml:lang="nb" xml:id="id1"> <epsilon xml:lang="no-nb" xml:id="id2"> @@ -25263,6 +29593,11 @@ </test> <test> <xpath>//psi[starts-with(@attribute,"soli")][@xml:id="id1"]/alpha[starts-with(@delete,"100")][@xml:id="id2"][not(following-sibling::*)]//eta//kappa[following-sibling::eta[not(following-sibling::*)]/lambda[not(child::node())][following-sibling::upsilon[contains(@attr,"u")][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::zeta[@content="content"][@xml:lang="no-nb"][@xml:id="id4"][not(child::node())][following-sibling::chi[@xml:lang="en"][following-sibling::phi[starts-with(@string,"cont")][@xml:lang="nb"][preceding-sibling::*[position() = 4]]/sigma[contains(@false,"ont")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@xml:id="id6"][not(following-sibling::*)]/omega[@xml:id="id7"]/tau[contains(@desciption,"lan")][@xml:lang="en-GB"][@xml:id="id8"][not(following-sibling::*)]/chi[@abort="false"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[@xml:id="id9"]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <psi attribute="solid 1px green" xml:id="id1"> <alpha delete="100%" xml:id="id2"> @@ -25296,6 +29631,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]/phi[@xml:id="id2"][not(child::node())][following-sibling::mu[starts-with(@title,"this.n")][preceding-sibling::*[position() = 1]][following-sibling::rho[not(child::node())][following-sibling::psi[@xml:lang="en"][@xml:id="id3"]//tau[@xml:id="id4"][not(preceding-sibling::*)]//zeta[starts-with(concat(@object,"-"),"another attribute value-")][@xml:lang="en"][not(preceding-sibling::*)]/sigma[contains(@abort,"ribute")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[contains(@insert,"e")][@xml:id="id5"][preceding-sibling::*[position() = 1]]//iota[contains(concat(@number,"$"),"se$")][@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::iota)]/pi[not(preceding-sibling::*)]/omega[@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[contains(@attribute,"ue")][@xml:lang="en"][@xml:id="id8"][not(following-sibling::*)]/psi[@data][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::pi[contains(concat(@or,"$"),"ribute-value$")][@xml:lang="en-US"][following-sibling::phi[@att="attribute value"][@xml:id="id10"][preceding-sibling::*[position() = 2]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <phi xml:id="id2"/> @@ -25328,6 +29668,11 @@ </test> <test> <xpath>//pi[contains(concat(@and,"$"),"r attribute value$")]//nu[starts-with(@attrib,"100%")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::psi[contains(concat(@name,"$"),"0%$")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::tau[@xml:id="id1"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//sigma[not(child::node())][following-sibling::upsilon[@false][@xml:lang="nb"][@xml:id="id2"]/epsilon[starts-with(@and,"another at")]/pi[@string][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::eta[@string="attribute"][@xml:lang="en-GB"][following-sibling::pi[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[@xml:lang="nb"][not(preceding-sibling::*)]//sigma[not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@false][@xml:lang="en-US"][preceding-sibling::*[position() = 1]]/pi[contains(@true,"ther attribute value")][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]/theta[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[@xml:lang="no"][not(preceding-sibling::xi)][not(child::node())][following-sibling::phi[@xml:id="id5"][preceding-sibling::*[position() = 1]]/theta[starts-with(@attr,"fals")][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[contains(@insert,"nt")]][position() = 1]]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <pi and="another attribute value"> <nu attrib="100%" xml:lang="en-US"/> @@ -25365,6 +29710,11 @@ </test> <test> <xpath>//mu[@xml:id="id1"]/upsilon//psi[starts-with(concat(@attr,"-"),"_blank-")][@xml:id="id2"][not(preceding-sibling::*)]//epsilon[starts-with(@delete,"1234")][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:id="id3"][not(following-sibling::*)]//sigma[@object][@xml:lang="en"][not(preceding-sibling::*)]/beta[@class][@xml:lang="nb"]//*[not(child::node())][following-sibling::phi[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[@true][not(preceding-sibling::*)][not(following-sibling::*)]//psi[not(preceding-sibling::*)][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <mu xml:id="id1"> <upsilon> @@ -25391,6 +29741,11 @@ </test> <test> <xpath>//theta[contains(@name,"89")][@xml:lang="no"]/eta[contains(concat(@attribute,"$"),"e$")][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::alpha[@xml:lang="no-nb"][@xml:id="id1"][not(child::node())][following-sibling::tau[@xml:lang="nb"][not(following-sibling::*)]/iota[contains(concat(@data,"$"),"bute$")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::eta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <theta name="123456789" xml:lang="no"> <eta attribute="false"/> @@ -25406,6 +29761,11 @@ </test> <test> <xpath>//xi[@xml:id="id1"]/omicron[@xml:id="id2"][not(following-sibling::*)]/pi[contains(@string,"t")]//eta[@xml:lang="en-GB"]/beta[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[not(following-sibling::*)]/psi[starts-with(concat(@attribute,"-"),"false-")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@att="attribute"][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::phi[@xml:lang="nb"][@xml:id="id4"]//kappa[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::mu[contains(@or,"co")][@xml:lang="en-GB"][not(child::node())][following-sibling::alpha[contains(@src,"12345")][@xml:lang="no-nb"][not(following-sibling::*)]//lambda[starts-with(@attrib,"123456")][@xml:lang="en"][@xml:id="id5"]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <xi xml:id="id1"> <omicron xml:id="id2"> @@ -25434,6 +29794,11 @@ </test> <test> <xpath>//*/eta[starts-with(@attr,"conten")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::eta)][following-sibling::xi[@xml:lang="en-US"][@xml:id="id2"][following-sibling::xi[@xml:lang="no"][preceding-sibling::*[position() = 2]]//alpha[starts-with(concat(@data,"-"),"attribute-")][@xml:id="id3"][not(child::node())][following-sibling::chi[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::psi[@xml:id="id4"][following-sibling::kappa[@xml:id="id5"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <any> <eta attr="content" xml:lang="en-US" xml:id="id1"/> @@ -25451,6 +29816,11 @@ </test> <test> <xpath>//pi[@xml:lang="en"]/upsilon[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[starts-with(@attr,"fals")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[@attr][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]//sigma[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@att][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="en"> <upsilon xml:id="id1"/> @@ -25467,6 +29837,11 @@ </test> <test> <xpath>//iota[@attrib][@xml:id="id1"]//phi[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::*[@delete][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/theta[starts-with(@title,"this-is-att-val")][not(preceding-sibling::*)][following-sibling::epsilon//xi[@attrib][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::gamma[starts-with(@title,"t")][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::epsilon[@xml:id="id5"][not(following-sibling::*)]/psi[position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <iota attrib="true" xml:id="id1"> <phi xml:lang="en-GB" xml:id="id2"/> @@ -25487,6 +29862,11 @@ </test> <test> <xpath>//tau/psi[@xml:lang="nb"][@xml:id="id1"][following-sibling::beta[not(following-sibling::*)]/kappa[@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]/pi[@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::chi[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]/nu[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//upsilon[starts-with(@attribute,"true")][@xml:lang="no"][@xml:id="id7"]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <tau> <psi xml:lang="nb" xml:id="id1"/> @@ -25508,6 +29888,11 @@ </test> <test> <xpath>//lambda[@xml:id="id1"]/pi[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[contains(concat(@attr,"$"),"%$")][@xml:lang="en-US"][@xml:id="id3"][not(child::node())][following-sibling::xi[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::alpha[@attr][@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::alpha)]//upsilon[not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//chi[@data][@xml:lang="en"][@xml:id="id7"][following-sibling::lambda[@xml:lang="en-US"][not(preceding-sibling::lambda)][not(child::node())][following-sibling::delta[@att="100%"][@xml:id="id8"][preceding-sibling::*[position() = 2]][following-sibling::upsilon[contains(concat(@src,"$"),"bute value$")][@xml:lang="en-US"][preceding-sibling::*[position() = 3]]//gamma[@xml:id="id9"][following-sibling::mu[@xml:lang="en-US"][@xml:id="id10"]/delta[@xml:lang="en-GB"][following-sibling::beta[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[starts-with(concat(@attr,"-"),"content-")][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[contains(@string,"a")][preceding-sibling::*[position() = 3]]//upsilon[contains(@delete,"%")]//theta[@token="another attribute value"][@xml:lang="en-US"][following-sibling::phi[@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi[contains(concat(@attribute,"$"),"lue$")][@xml:lang="en-GB"][@xml:id="id12"][preceding-sibling::*[position() = 2]][position() = 1]]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>1</nth> + </result> <tree> <lambda xml:id="id1"> <pi xml:lang="en-GB" xml:id="id2"> @@ -25545,6 +29930,11 @@ </test> <test> <xpath>//delta[@xml:lang="en-US"]//xi[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@xml:lang="en"][following-sibling::pi[@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)]/delta[@xml:lang="en-US"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@xml:id="id3"]//phi[@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::nu[not(following-sibling::*)]//delta[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::gamma[@xml:lang="nb"]/alpha[@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/gamma[contains(@att,"e")][not(preceding-sibling::*)][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 1]]/mu[not(following-sibling::*)]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en-US"> <xi xml:lang="en-US"> @@ -25574,6 +29964,11 @@ </test> <test> <xpath>//delta[@xml:lang="en-GB"]/upsilon[@xml:id="id1"][not(following-sibling::*)]//kappa[@xml:lang="en-US"][following-sibling::upsilon[@xml:lang="en-GB"][following-sibling::*[position()=2]][following-sibling::lambda[@abort][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@content][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//phi[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[preceding-sibling::*[position() = 1]]//tau[starts-with(concat(@title,"-"),"_blank-")][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[starts-with(@abort,"this.n")][@xml:lang="en-GB"]]]]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en-GB"> <upsilon xml:id="id1"> @@ -25595,6 +29990,11 @@ </test> <test> <xpath>//sigma[@xml:lang="no"][@xml:id="id1"]//mu[not(preceding-sibling::*)][following-sibling::xi[starts-with(@string,"sol")][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(preceding-sibling::xi)]//gamma[contains(concat(@token,"$"),"e$")][@xml:lang="en-GB"][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::pi[contains(concat(@insert,"$"),"green$")][following-sibling::*[position()=1]][following-sibling::gamma[@att][@xml:lang="en-US"][not(following-sibling::*)]//chi[@delete][@xml:id="id4"][not(following-sibling::*)]//zeta[@xml:lang="no-nb"][@xml:id="id5"][not(child::node())][following-sibling::*[starts-with(@src,"attr")][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[@delete="content"][@xml:lang="en"]//mu[@xml:id="id7"]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="no" xml:id="id1"> <mu/> @@ -25618,6 +30018,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-GB"]/gamma[@xml:lang="en"][@xml:id="id1"]//mu[contains(concat(@att,"$"),"px green$")][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[starts-with(concat(@object,"-"),"attribute-")][@xml:lang="no-nb"]/psi[starts-with(concat(@src,"-"),"attribute-")][@xml:id="id2"][not(preceding-sibling::*)]//chi[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[@insert="attribute value"][@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@xml:lang="no"][following-sibling::rho[starts-with(concat(@desciption,"-"),"123456789-")][preceding-sibling::*[position() = 2]]/mu[@token][@xml:lang="en"][@xml:id="id5"]/kappa[starts-with(@number,"fals")][not(child::node())][following-sibling::alpha[@src][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@xml:lang="en"]/iota[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[starts-with(concat(@name,"-"),"attribute-")][@xml:lang="no"][@xml:id="id7"]/theta[@number="solid 1px green"][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-GB"> <gamma xml:lang="en" xml:id="id1"> @@ -25650,6 +30055,11 @@ </test> <test> <xpath>//phi[contains(@delete,"r attribu")][@xml:lang="no-nb"]/epsilon[@xml:id="id1"][not(preceding-sibling::*)]/beta[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@delete][@xml:id="id3"][not(following-sibling::*)]//psi[starts-with(concat(@src,"-"),"this.nodeValue-")][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta[@true="100%"][@xml:lang="en-US"]//upsilon[@xml:id="id6"][following-sibling::omega[@xml:id="id7"]/upsilon[not(preceding-sibling::*)][not(following-sibling::*)]/rho[@insert][@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:id="id9"]//delta[@xml:lang="en"][@xml:id="id10"]//iota[@xml:lang="no-nb"][@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@xml:lang="nb"][@xml:id="id12"][following-sibling::tau[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::beta[@xml:id="id13"][not(following-sibling::*)]//pi[@class][@xml:id="id14"][following-sibling::*[position()=1]][following-sibling::delta[@and][@xml:id="id15"][preceding-sibling::*[position() = 1]]/alpha[contains(@abort,"bute-v")][@xml:lang="en-GB"][@xml:id="id16"]/epsilon[@xml:lang="en-US"][@xml:id="id17"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <phi delete="another attribute value" xml:lang="no-nb"> <epsilon xml:id="id1"> @@ -25694,6 +30104,11 @@ </test> <test> <xpath>//beta[starts-with(concat(@and,"-"),"this.nodeValue-")][@xml:id="id1"]/zeta[starts-with(@false,"con")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)][not(following-sibling::theta)]/delta[@xml:id="id4"]/eta[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)]//pi[@desciption][@xml:lang="no"]/pi[not(following-sibling::*)]//pi[following-sibling::*[position()=3]][not(child::node())][following-sibling::upsilon[@false][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]//eta[contains(@att," value")][@xml:lang="en"][not(preceding-sibling::*)][not(preceding-sibling::eta)]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <beta and="this.nodeValue" xml:id="id1"> <zeta false="content" xml:lang="nb" xml:id="id2"/> @@ -25720,6 +30135,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]//sigma[@xml:lang="no-nb"][not(following-sibling::*)]/eta[@xml:id="id2"][not(following-sibling::*)]/sigma[starts-with(concat(@title,"-"),"content-")][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::*)]/tau[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omega[@xml:lang="en"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[@xml:id="id4"][preceding-sibling::*[position() = 2]]//omicron[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:lang="no-nb"][not(following-sibling::*)]//tau[contains(@string,"true")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha//phi[@attr][@xml:lang="no-nb"][@xml:id="id5"]/zeta[@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[starts-with(@or,"false")][@xml:id="id7"][not(following-sibling::*)]//upsilon[@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@xml:lang="nb"][not(following-sibling::*)]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <rho xml:id="id1"> <sigma xml:lang="no-nb"> @@ -25752,6 +30172,11 @@ </test> <test> <xpath>//kappa[contains(concat(@object,"$"),"ribute value$")][@xml:id="id1"]/epsilon[starts-with(@attrib,"fa")][@xml:id="id2"][not(preceding-sibling::*)]//omega[starts-with(concat(@delete,"-"),"attribute value-")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//phi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::nu[@true][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::mu[starts-with(@and,"this-is-att-val")][not(following-sibling::*)]/pi[contains(@attr,"ibute")][@xml:id="id5"][not(preceding-sibling::*)]/phi[@xml:id="id6"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[not(following-sibling::*)]/epsilon[@or="attribute-value"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[starts-with(@data,"fal")][@xml:id="id8"][following-sibling::epsilon//chi[@attribute="false"][@xml:lang="en"][following-sibling::rho[@insert="this-is-att-value"][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <kappa object="attribute value" xml:id="id1"> <epsilon attrib="false" xml:id="id2"> @@ -25781,6 +30206,11 @@ </test> <test> <xpath>//lambda[@xml:lang="no"]//*[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::iota[@name="123456789"][@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::omicron[preceding-sibling::*[position() = 2]]/tau[starts-with(concat(@src,"-"),"this.nodeValue-")][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[contains(concat(@abort,"$"),"-att-value$")][following-sibling::nu[starts-with(concat(@attrib,"-"),"123456789-")][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@xml:id="id4"][preceding-sibling::*[position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <lambda xml:lang="no"> <any xml:lang="en-US" xml:id="id1"/> @@ -25801,6 +30231,11 @@ </test> <test> <xpath>//beta[@xml:lang="en-US"][@xml:id="id1"]/psi[@and][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[not(child::node())][following-sibling::theta[@true="true"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(concat(@src,"$"),"Value$")][@xml:id="id3"][not(following-sibling::*)]//upsilon[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[contains(@attrib,"reen")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::xi[contains(concat(@name,"$"),"89$")][@xml:id="id5"][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::nu[@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//xi//eta[@or][@xml:lang="nb"][@xml:id="id6"]//iota//phi[@object][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::iota[following-sibling::*[position()=3]][following-sibling::mu[@xml:lang="en"][preceding-sibling::*[position() = 2]][following-sibling::delta[@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::gamma[starts-with(@and,"this.nod")][preceding-sibling::*[position() = 4]]/kappa[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][not(child::node())][following-sibling::nu[@xml:id="id7"]]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="en-US" xml:id="id1"> <psi and="true" xml:id="id2"> @@ -25838,6 +30273,11 @@ </test> <test> <xpath>//gamma[contains(concat(@content,"$"),"this.nodeValue$")]//lambda[@xml:lang="no-nb"][not(preceding-sibling::*)]/upsilon[@xml:lang="en"]/beta[@xml:lang="en-GB"][not(following-sibling::*)]/omicron[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]]/kappa[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:lang="en-GB"][following-sibling::*[position()=1]][not(preceding-sibling::beta)][following-sibling::nu[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//xi[not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]//sigma[@attr="this.nodeValue"][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[contains(concat(@desciption,"$"),"rue$")][@xml:id="id5"][preceding-sibling::*[position() = 1]]/tau[@xml:id="id6"][not(preceding-sibling::*)][not(preceding-sibling::tau)][following-sibling::delta[contains(@token,"-va")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <gamma content="this.nodeValue"> <lambda xml:lang="no-nb"> @@ -25871,6 +30311,11 @@ </test> <test> <xpath>//beta[@xml:lang="en-US"]//phi[@class][@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::kappa[@delete]//gamma[starts-with(@att,"conten")][@xml:lang="nb"][not(preceding-sibling::*)]/chi[contains(concat(@desciption,"$"),"100%$")][@xml:lang="no"][not(following-sibling::*)]/omicron[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::chi[contains(@true,"alue")][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="en-US"> <phi class="_blank" xml:lang="no-nb" xml:id="id1"/> @@ -25889,6 +30334,11 @@ </test> <test> <xpath>//pi[@xml:lang="no"]//epsilon[@xml:lang="en"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="en-US"]/phi[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::tau[@xml:id="id2"][not(child::node())][following-sibling::omicron[@abort="attribute"][@xml:lang="no"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::sigma/rho[@string][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[starts-with(concat(@name,"-"),"content-")][not(child::node())][following-sibling::upsilon[@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]/zeta[@data][@xml:lang="nb"][following-sibling::*[position()=2]][following-sibling::xi[@true="true"][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::beta[@class][@xml:lang="nb"][preceding-sibling::*[position() = 2]]/epsilon[@insert][@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::theta[@xml:lang="no"][not(following-sibling::*)]/eta[contains(@token,"ute")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@xml:lang="en-GB"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[starts-with(@attr,"_")][@xml:lang="en-US"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::sigma[contains(@class,"ribut")][@xml:id="id8"]//pi[@false][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[@xml:id="id9"]][position() = 1]][position() = 1]]]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="no"> <epsilon xml:lang="en"/> @@ -25928,6 +30378,11 @@ </test> <test> <xpath>//pi[@xml:lang="en-US"]/theta[@xml:id="id1"][not(child::node())][following-sibling::iota[@data][@xml:lang="nb"][not(child::node())][following-sibling::omega[@xml:id="id2"][not(child::node())][following-sibling::zeta[preceding-sibling::*[position() = 3]][not(following-sibling::*)]/xi[@number="attribute-value"][@xml:id="id3"][not(preceding-sibling::*)]//mu[@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[@content][@xml:lang="en-GB"][not(preceding-sibling::*)]//upsilon[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@src][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[contains(@att,"is-att-value")][@xml:lang="en-US"][following-sibling::theta[@xml:id="id7"]/psi[@or][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::xi[preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="en-US"> <theta xml:id="id1"/> @@ -25956,6 +30411,11 @@ </test> <test> <xpath>//tau/theta[contains(@delete,"_blan")][@xml:lang="en-GB"][not(child::node())][following-sibling::epsilon[contains(concat(@title,"$"),"green$")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[not(following-sibling::*)]/chi[@or][not(preceding-sibling::*)]/zeta[@attrib][@xml:lang="no-nb"][@xml:id="id1"][not(following-sibling::*)]/theta[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[contains(@object,".nodeV")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//gamma[@xml:lang="no"][not(preceding-sibling::gamma or following-sibling::gamma)][not(child::node())][following-sibling::sigma[contains(concat(@and,"$"),"e$")][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::alpha[@xml:lang="no"][@xml:id="id4"][following-sibling::kappa[starts-with(concat(@false,"-"),"false-")][@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 3]]//rho[@xml:id="id6"][not(preceding-sibling::*)]/omicron[contains(@attribute,"nt")][@xml:lang="en"][@xml:id="id7"][not(following-sibling::*)]//lambda[@false][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[@xml:id="id8"][following-sibling::*[position()=2]][following-sibling::tau[@xml:lang="en-US"][not(child::node())][following-sibling::tau[@token]/iota[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <tau> <theta delete="_blank" xml:lang="en-GB"/> @@ -25991,6 +30451,11 @@ </test> <test> <xpath>//pi[starts-with(concat(@delete,"-"),"this.nodeValue-")][@xml:lang="no-nb"]/tau[starts-with(concat(@content,"-"),"true-")][not(following-sibling::*)]//omega[starts-with(@data,"attribu")][@xml:lang="no-nb"][not(following-sibling::*)]//gamma[@xml:id="id1"][not(following-sibling::*)]/eta[@xml:lang="no-nb"][not(preceding-sibling::*)]/zeta[@false="true"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[not(following-sibling::*)]//omega[@xml:lang="en-GB"][following-sibling::*[position()=6]][following-sibling::iota[@xml:lang="en"][following-sibling::*[position()=5]][following-sibling::tau[@content="100%"][@xml:lang="nb"][following-sibling::sigma[starts-with(concat(@insert,"-"),"100%-")][@xml:lang="nb"][@xml:id="id2"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=3]][not(child::node())][following-sibling::gamma[@false="this-is-att-value"][@xml:id="id3"][not(child::node())][following-sibling::upsilon[following-sibling::chi[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]//theta[@insert][@xml:lang="en"][@xml:id="id5"][not(child::node())][following-sibling::iota[contains(concat(@delete,"$"),"ue$")][@xml:lang="en-GB"][@xml:id="id6"][not(following-sibling::*)]//mu[@xml:lang="en"][not(preceding-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <pi delete="this.nodeValue" xml:lang="no-nb"> <tau content="true"> @@ -26023,6 +30488,11 @@ </test> <test> <xpath>//tau[@xml:lang="nb"]/alpha[contains(@string,"8")][@xml:lang="nb"][@xml:id="id1"][not(following-sibling::*)]/rho[contains(@data,"6789")][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[contains(concat(@and,"$"),"6789$")][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[starts-with(concat(@src,"-"),"this-")][@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::iota[@string][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::kappa[@xml:lang="en-US"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@true="attribute"][@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 4]]//kappa[following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]]//kappa[@xml:lang="no-nb"][@xml:id="id6"][following-sibling::beta[starts-with(@string,"100")][@xml:lang="no"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="nb"> <alpha string="123456789" xml:lang="nb" xml:id="id1"> @@ -26047,6 +30517,11 @@ </test> <test> <xpath>//gamma[contains(@insert,"bla")][@xml:lang="en-GB"][@xml:id="id1"]//omega[@xml:lang="en-US"][@xml:id="id2"][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::upsilon[@xml:id="id4"][preceding-sibling::*[position() = 2]]/beta[@delete][not(preceding-sibling::*)][not(following-sibling::*)]/kappa[@xml:lang="no-nb"][@xml:id="id5"][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <gamma insert="_blank" xml:lang="en-GB" xml:id="id1"> <omega xml:lang="en-US" xml:id="id2"/> @@ -26063,6 +30538,11 @@ </test> <test> <xpath>//zeta[contains(@delete,"%")][@xml:id="id1"]/mu[@xml:lang="en"][following-sibling::*[position()=1]][following-sibling::gamma[@xml:lang="no-nb"]/phi[@xml:lang="en-US"][@xml:id="id2"][following-sibling::upsilon[@and][@xml:lang="no"][@xml:id="id3"][not(preceding-sibling::upsilon)][following-sibling::pi[preceding-sibling::*[position() = 2]]/omega[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]/phi[@xml:id="id5"][following-sibling::pi[@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::pi)]/theta[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::phi[starts-with(concat(@attribute,"-"),"this.nodeValue-")][@xml:lang="en"][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[starts-with(concat(@or,"-"),"attribute value-")][@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::psi[contains(concat(@att,"$"),"123456789$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 4]]/delta[not(preceding-sibling::*)][not(following-sibling::*)]/iota[@name="false"]//alpha[@xml:lang="en-GB"][@xml:id="id10"][not(preceding-sibling::*)]/nu[@xml:id="id11"][not(preceding-sibling::*)]//theta[@xml:lang="no-nb"][not(preceding-sibling::*)]/*/iota[contains(concat(@object,"$"),"true$")][@xml:id="id12"][not(child::node())][following-sibling::kappa[contains(@token,"k")][@xml:lang="nb"][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <zeta delete="100%" xml:id="id1"> <mu xml:lang="en"/> @@ -26104,6 +30584,11 @@ </test> <test> <xpath>//beta[@data][@xml:lang="en-US"]//iota[@attr="100%"][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::delta[contains(concat(@true,"$"),"ibute value$")][@xml:lang="en-US"]//rho[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)]//iota[not(preceding-sibling::*)][not(following-sibling::*)]//nu[contains(@name,"ute")][@xml:lang="no"][not(following-sibling::*)]/omega[@title][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]/theta[@delete][@xml:lang="no"][not(following-sibling::*)]/psi[not(child::node())][following-sibling::delta[@xml:id="id3"]/xi[contains(concat(@desciption,"$"),"te$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[preceding-sibling::*[position() = 1]]/upsilon[not(preceding-sibling::*)][not(following-sibling::*)]//iota/chi[contains(concat(@object,"$"),"e$")][@xml:id="id4"][following-sibling::omega[@class="attribute"][@xml:lang="no"][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <beta data="attribute-value" xml:lang="en-US"> <iota attr="100%" xml:lang="en-US"/> @@ -26138,6 +30623,11 @@ </test> <test> <xpath>//chi[@att="this.nodeValue"][@xml:lang="en-GB"]/epsilon[@xml:lang="en-GB"][@xml:id="id1"][following-sibling::sigma[contains(concat(@data,"$"),"een$")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//gamma[@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[starts-with(@false,"c")][@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/alpha[contains(@number,"no")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]//mu[contains(concat(@and,"$"),"Value$")][following-sibling::rho[starts-with(concat(@data,"-"),"attribute-")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[contains(@title,"Value")][@xml:id="id6"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[@xml:lang="en-US"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <chi att="this.nodeValue" xml:lang="en-GB"> <epsilon xml:lang="en-GB" xml:id="id1"/> @@ -26160,6 +30650,11 @@ </test> <test> <xpath>//xi[contains(@att,"ri")][@xml:id="id1"]//chi[@string="content"][@xml:id="id2"][not(preceding-sibling::*)]/pi[@abort][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id5"][not(following-sibling::*)]/chi[not(preceding-sibling::*)][following-sibling::iota[@name][@xml:lang="en-US"][following-sibling::rho[contains(concat(@att,"$"),"bute value$")][not(following-sibling::*)]/delta[@att][@xml:id="id6"][following-sibling::tau[contains(@attr,"t")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@xml:id="id8"][preceding-sibling::*[position() = 2]][not(preceding-sibling::kappa or following-sibling::kappa)]//psi[@xml:lang="en-GB"][@xml:id="id9"]/delta[@string][not(preceding-sibling::*)]//omicron/eta[starts-with(concat(@class,"-"),"content-")][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[starts-with(concat(@class,"-"),"123456789-")][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <xi att="attribute value" xml:id="id1"> <chi string="content" xml:id="id2"> @@ -26194,6 +30689,11 @@ </test> <test> <xpath>//beta[@name]//rho[@desciption][@xml:id="id1"]/mu[@xml:lang="en"][not(child::node())][following-sibling::chi[@object][@xml:id="id2"][not(following-sibling::*)]/kappa[contains(concat(@or,"$"),"0%$")][@xml:id="id3"][following-sibling::omicron[starts-with(concat(@number,"-"),"another attribute value-")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=9]][not(preceding-sibling::omicron)][following-sibling::eta[@or="false"][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::sigma[@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=7]][following-sibling::epsilon[contains(concat(@delete,"$"),"rue$")][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::eta[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 5]][following-sibling::*[position()=5]][following-sibling::beta[@xml:id="id7"][preceding-sibling::*[position() = 6]][not(child::node())][following-sibling::gamma[@xml:lang="en-GB"][preceding-sibling::*[position() = 7]][following-sibling::*[position()=3]][not(child::node())][following-sibling::pi[starts-with(@title,"ano")][@xml:lang="nb"][not(child::node())][following-sibling::eta[@content][@xml:lang="en-US"][@xml:id="id8"][following-sibling::*[starts-with(@and,"_blank")][@xml:lang="en-GB"][@xml:id="id9"][not(following-sibling::*)]/omicron[@abort="false"][@xml:lang="no-nb"][@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@xml:lang="en-US"][@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[starts-with(concat(@or,"-"),"false-")][@xml:lang="no"][@xml:id="id12"][preceding-sibling::*[position() = 1]]//rho[@xml:lang="no-nb"][@xml:id="id13"][following-sibling::zeta[starts-with(@name,"another attrib")][@xml:lang="no-nb"][not(child::node())][following-sibling::upsilon[@xml:lang="en-GB"][@xml:id="id14"][not(following-sibling::*)]]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <beta name="this.nodeValue"> <rho desciption="attribute" xml:id="id1"> @@ -26228,6 +30728,11 @@ </test> <test> <xpath>//sigma[@xml:lang="en"][@xml:id="id1"]/kappa[@src][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[contains(@attr,"another ")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::delta[not(preceding-sibling::delta or following-sibling::delta)]/*[@xml:lang="nb"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[starts-with(@and,"12345678")][@xml:lang="en-GB"][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::omega[@delete="attribute-value"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//xi[@xml:lang="en"][following-sibling::iota[@xml:lang="en"][following-sibling::*[position()=1]][not(following-sibling::iota)][following-sibling::gamma[@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//eta[@xml:id="id7"]/zeta[@true][@xml:id="id8"]/xi[contains(@token,"fa")][not(following-sibling::*)]//omicron[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//delta[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[starts-with(@att,"attr")][not(following-sibling::*)]//zeta[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[starts-with(concat(@true,"-"),"_blank-")][@xml:lang="en-GB"][@xml:id="id10"][not(preceding-sibling::*)]/theta[@object][@xml:lang="en-US"][@xml:id="id11"][not(preceding-sibling::*)][not(child::node())][following-sibling::theta[contains(@token,"blank")]/omega[not(preceding-sibling::*)][not(following-sibling::*)][not(parent::*/*[position()=2])]/iota[starts-with(@or,"_")][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[contains(concat(@insert,"$"),"ttribute$")][not(following-sibling::*)]//alpha[@xml:lang="no-nb"][not(preceding-sibling::*)]]][position() = 1]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="en" xml:id="id1"> <kappa src="100%" xml:id="id2"/> @@ -26274,6 +30779,11 @@ </test> <test> <xpath>//eta[@true]/beta[starts-with(@attrib,"a")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="en-GB"][not(following-sibling::*)]/kappa[@title][@xml:lang="no"][following-sibling::omega[@xml:id="id1"][not(following-sibling::*)]/delta[@xml:lang="en-GB"][not(preceding-sibling::*)]//beta[@xml:lang="en-GB"]//eta[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@abort][following-sibling::*[position()=1]][following-sibling::rho[@xml:id="id3"]/gamma[@xml:id="id4"][not(following-sibling::*)]/gamma[@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]]/epsilon[@false][@xml:lang="nb"][not(preceding-sibling::*)]/nu[not(parent::*/*[position()=2])]/zeta[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]//delta[@name="this-is-att-value"][not(child::node())][following-sibling::pi[@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <eta true="100%"> <beta attrib="another attribute value" xml:lang="nb"/> @@ -26310,6 +30820,11 @@ </test> <test> <xpath>//omega[starts-with(concat(@true,"-"),"123456789-")]//xi[contains(concat(@src,"$"),"true$")][@xml:id="id1"][not(following-sibling::*)]/psi[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::zeta[@xml:id="id3"]/upsilon[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::alpha[contains(concat(@content,"$"),"alse$")][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="en-GB"][@xml:id="id5"][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <omega true="123456789"> <xi src="true" xml:id="id1"> @@ -26327,6 +30842,11 @@ </test> <test> <xpath>//lambda[@insert][@xml:lang="en-US"]//delta[@xml:lang="en-GB"][@xml:id="id1"][following-sibling::*[position()=2]][following-sibling::kappa[@attribute][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@data][@xml:id="id3"][not(following-sibling::kappa)]/zeta[contains(@att,"1")][@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]/kappa[@xml:lang="en-US"][not(following-sibling::*)]//*[contains(@src,"u")][@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[contains(concat(@att,"$"),"e$")][@xml:lang="en"][@xml:id="id6"][not(following-sibling::*)]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <lambda insert="100%" xml:lang="en-US"> <delta xml:lang="en-GB" xml:id="id1"/> @@ -26347,6 +30867,11 @@ </test> <test> <xpath>//delta[@xml:lang="en-GB"]//*[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[starts-with(concat(@and,"-"),"another attribute value-")][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//delta[@content="false"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::delta[starts-with(@delete,"12")][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau[@xml:id="id3"][not(following-sibling::*)]/kappa[contains(concat(@attrib,"$")," attribute value$")][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@xml:id="id4"][not(following-sibling::*)]/sigma[not(preceding-sibling::*)][not(following-sibling::*)]//delta[contains(@insert,"ank")][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//phi/delta[starts-with(@src,"attribut")][@xml:id="id6"][not(preceding-sibling::*)]/gamma[@xml:lang="en-GB"][@xml:id="id7"][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="en-GB"> <any/> @@ -26377,6 +30902,11 @@ </test> <test> <xpath>//kappa[@xml:lang="no"]//omega[starts-with(@src,"tru")][@xml:lang="en"][not(following-sibling::*)]//omega[starts-with(@false,"another attribu")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:id="id1"][not(following-sibling::*)]/pi[@and][@xml:lang="en"][not(following-sibling::*)]/omicron[@xml:id="id2"][following-sibling::zeta[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::omega[contains(concat(@name,"$"),"lse$")][@xml:lang="en"][not(following-sibling::*)]//theta[@att][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::eta[@token][@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/gamma[@xml:id="id4"]//beta[@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 1]]//tau[@attr][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="en"][@xml:id="id6"][not(preceding-sibling::delta)]/tau[starts-with(@attrib,"c")][@xml:lang="no"][not(preceding-sibling::*)]/gamma[contains(@true,"alue")][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>1</nth> + </result> <tree> <kappa xml:lang="no"> <omega src="true" xml:lang="en"> @@ -26411,6 +30941,11 @@ </test> <test> <xpath>//kappa[@delete][@xml:id="id1"]/gamma[starts-with(@name,"false")][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=4]][not(child::node())][following-sibling::mu[following-sibling::kappa[starts-with(concat(@delete,"-"),"attribute-")][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::iota[starts-with(concat(@class,"-"),"this.nodeValue-")][@xml:id="id4"][not(child::node())][following-sibling::*[@xml:id="id5"][preceding-sibling::*[position() = 4]]/delta[contains(@object,"t")][@xml:id="id6"]/iota[@content][@xml:lang="en-GB"][@xml:id="id7"][not(child::node())][following-sibling::pi[@xml:lang="no-nb"][@xml:id="id8"]//phi[@content][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:lang="no-nb"][not(following-sibling::*)]//iota[starts-with(@and,"soli")][not(preceding-sibling::*)][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <kappa delete="attribute value" xml:id="id1"> <gamma name="false" xml:lang="nb" xml:id="id2"/> @@ -26435,6 +30970,11 @@ </test> <test> <xpath>//*[contains(@class,"23")][@xml:id="id1"]//omicron[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)]//psi[starts-with(@attribute,"solid 1px gr")][@xml:lang="no-nb"][following-sibling::*[position()=7]][following-sibling::xi[contains(@number,"k")][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=6]][following-sibling::eta[@xml:id="id4"][following-sibling::sigma[@xml:lang="nb"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::pi[@delete="content"][preceding-sibling::*[position() = 4]][following-sibling::*[@xml:lang="no"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::gamma[contains(@class,"his-is-att-value")][@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 6]][following-sibling::lambda[@xml:id="id6"][preceding-sibling::*[position() = 7]]/rho[@xml:lang="nb"][not(preceding-sibling::*)]/eta[@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[starts-with(concat(@attrib,"-"),"this-")][@xml:lang="nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::theta[@and][@xml:id="id8"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/*[@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/*[@insert][not(preceding-sibling::*)]//gamma[@true][@xml:lang="no"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@abort="another attribute value"][@xml:lang="en-GB"]]][position() = 1]]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <any class="123456789" xml:id="id1"> <omicron token="attribute-value" xml:lang="no" xml:id="id2"> @@ -26468,6 +31008,11 @@ </test> <test> <xpath>//rho[@token][@xml:lang="nb"]//omicron[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::epsilon[@xml:id="id2"][preceding-sibling::*[position() = 2]]//epsilon[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::omicron[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(concat(@abort,"$"),"0%$")][not(preceding-sibling::delta)][following-sibling::phi[@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <rho token="solid 1px green" xml:lang="nb"> <omicron xml:id="id1"/> @@ -26485,6 +31030,11 @@ </test> <test> <xpath>//eta[contains(concat(@false,"$"),"true$")][@xml:lang="no-nb"]/iota[starts-with(@insert,"c")][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::omega[@xml:lang="nb"][not(following-sibling::*)]/nu[starts-with(@string,"f")][@xml:lang="en-GB"][@xml:id="id2"]/eta[@xml:lang="en"][not(following-sibling::*)]/xi[starts-with(concat(@token,"-"),"123456789-")][@xml:id="id3"][not(child::node())][following-sibling::pi[starts-with(@content,"100%")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[starts-with(@false,"12")][@xml:lang="no-nb"][following-sibling::*[position()=1]][following-sibling::*[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/zeta[contains(@string,"nk")][@xml:id="id7"][following-sibling::gamma[@number][@xml:lang="no"][@xml:id="id8"][following-sibling::phi[contains(concat(@title,"$"),"0%$")]//omega[@xml:lang="no-nb"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::zeta[contains(concat(@and,"$"),"tribute value$")][@xml:id="id10"][preceding-sibling::*[position() = 1]]//tau[@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::zeta[@xml:id="id12"][preceding-sibling::*[position() = 1]]/sigma[contains(@token,"456789")][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <eta false="true" xml:lang="no-nb"> <iota insert="content" xml:id="id1"/> @@ -26520,6 +31070,11 @@ </test> <test> <xpath>//kappa[contains(concat(@insert,"$"),"00%$")][@xml:lang="en-GB"][@xml:id="id1"]//pi[@xml:lang="no"][@xml:id="id2"][not(following-sibling::*)]/zeta[@xml:lang="en-US"][not(preceding-sibling::*)]/tau[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::delta[@token="this.nodeValue"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[not(preceding-sibling::*)][not(child::node())][following-sibling::alpha/pi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::eta[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(preceding-sibling::eta)][following-sibling::tau[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//mu[starts-with(concat(@desciption,"-"),"100%-")][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@string="attribute-value"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <kappa insert="100%" xml:lang="en-GB" xml:id="id1"> <pi xml:lang="no" xml:id="id2"> @@ -26547,6 +31102,11 @@ </test> <test> <xpath>//upsilon[starts-with(concat(@att,"-"),"_blank-")][@xml:lang="no-nb"]/chi[@object][@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)]/alpha[@xml:lang="no-nb"][@xml:id="id3"]//iota[starts-with(@object,"1")][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::omega[starts-with(@delete,"123456")][@xml:lang="nb"][preceding-sibling::*[position() = 1]]/xi[starts-with(@content,"attribute-v")][@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::phi[not(following-sibling::*)]//lambda[contains(@token,"als")][@xml:lang="no"][@xml:id="id6"][following-sibling::lambda[starts-with(concat(@data,"-"),"false-")][@xml:id="id7"][not(following-sibling::*)]/iota[contains(@desciption,"k")][@xml:lang="en"][@xml:id="id8"]//theta[@insert][@xml:id="id9"][not(preceding-sibling::*)]//alpha[@xml:id="id10"][following-sibling::*[position()=2]][following-sibling::mu[@xml:lang="nb"][@xml:id="id11"][following-sibling::pi[contains(@attr,"ttribute")][@xml:lang="en-US"][@xml:id="id12"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/alpha[starts-with(concat(@or,"-"),"_blank-")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[starts-with(concat(@name,"-"),"attribute-")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::alpha[@xml:lang="nb"][following-sibling::*[position()=1]][not(preceding-sibling::alpha)][not(child::node())][following-sibling::upsilon[@xml:lang="nb"]/kappa[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::sigma[@xml:id="id13"][not(following-sibling::*)]//gamma[@xml:lang="nb"][@xml:id="id14"][not(following-sibling::*)]/omicron[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <upsilon att="_blank" xml:lang="no-nb"> <chi object="true" xml:lang="no-nb" xml:id="id1"> @@ -26591,6 +31151,11 @@ </test> <test> <xpath>//eta[starts-with(concat(@object,"-"),"content-")]/nu[@and="solid 1px green"][@xml:lang="en-US"][@xml:id="id1"][not(child::node())][following-sibling::tau[contains(concat(@attribute,"$"),"lank$")]//tau[@xml:id="id2"][not(child::node())][following-sibling::mu[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[contains(concat(@number,"$"),"ontent$")][@xml:id="id3"][not(following-sibling::*)]/iota[contains(concat(@class,"$"),"odeValue$")][@xml:id="id4"][not(following-sibling::*)]//lambda[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@string][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::omega[@xml:id="id5"][preceding-sibling::*[position() = 2]]/phi[@xml:lang="no"]/*[starts-with(concat(@attrib,"-"),"this.nodeValue-")][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@xml:lang="nb"]/beta[starts-with(concat(@token,"-"),"false-")][@xml:lang="nb"][following-sibling::mu[starts-with(concat(@content,"-"),"another attribute value-")][@xml:lang="no"][@xml:id="id8"][following-sibling::delta[preceding-sibling::*[position() = 2]][following-sibling::omega[contains(@desciption,"tr")]/phi[not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::sigma[@xml:lang="en-US"]/eta[@xml:lang="no-nb"][@xml:id="id9"][not(following-sibling::*)]/sigma[@xml:lang="nb"][@xml:id="id10"][not(following-sibling::*)]/lambda[not(following-sibling::*)]/upsilon[starts-with(concat(@content,"-"),"content-")][@xml:lang="en-US"][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <eta object="content"> <nu and="solid 1px green" xml:lang="en-US" xml:id="id1"/> @@ -26637,6 +31202,11 @@ </test> <test> <xpath>//psi[contains(@name,"e")][@xml:lang="no"][@xml:id="id1"]//chi[@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:id="id3"][not(following-sibling::*)]/alpha[not(preceding-sibling::*)]//nu[@xml:id="id4"]//kappa[contains(concat(@false,"$"),"nother attribute value$")][following-sibling::sigma[@xml:lang="en-US"][not(following-sibling::*)]/mu[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[starts-with(@delete,"solid 1p")]/psi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[not(following-sibling::*)]/chi[contains(@name,"%")][@xml:lang="no-nb"][@xml:id="id6"][following-sibling::phi[preceding-sibling::*[position() = 1]]//iota[@xml:lang="no-nb"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@xml:lang="en"][@xml:id="id8"][not(preceding-sibling::*)]/chi[starts-with(concat(@delete,"-"),"true-")][@xml:lang="en-US"][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <psi name="another attribute value" xml:lang="no" xml:id="id1"> <chi xml:lang="en" xml:id="id2"/> @@ -26672,6 +31242,11 @@ </test> <test> <xpath>//zeta[@xml:lang="en-US"]/theta[@title][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::nu[@number="123456789"][@xml:lang="no"]/sigma[starts-with(@attribute,"attribu")][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en"][following-sibling::*[position()=2]][not(child::node())][following-sibling::sigma[@and][@xml:id="id1"][preceding-sibling::sigma[2]][not(child::node())][following-sibling::omega[@xml:id="id2"]/nu[@insert="123456789"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[contains(concat(@abort,"$"),"eValue$")][@xml:id="id4"][not(child::node())][following-sibling::kappa[preceding-sibling::*[position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <zeta xml:lang="en-US"> <theta title="solid 1px green" xml:lang="en-US"/> @@ -26693,6 +31268,11 @@ </test> <test> <xpath>//beta[@xml:lang="no-nb"]/omega[@xml:lang="en-GB"][@xml:id="id1"][not(following-sibling::*)]//alpha[@xml:lang="no"][@xml:id="id2"]//tau[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[following-sibling::eta[@number][@xml:lang="no"][@xml:id="id3"]//epsilon[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]/sigma[@xml:id="id5"][not(child::node())][following-sibling::theta[starts-with(concat(@name,"-"),"true-")][@xml:lang="en-US"][not(child::node())][following-sibling::rho//xi[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="en"][@xml:id="id6"]//sigma[@title][@xml:lang="en"][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <beta xml:lang="no-nb"> <omega xml:lang="en-GB" xml:id="id1"> @@ -26719,6 +31299,11 @@ </test> <test> <xpath>//zeta[@content]/chi[not(child::node())][following-sibling::*[starts-with(@abort,"att")][@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 1]]//mu[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[contains(@false,"ribute")][@xml:lang="en-GB"]/alpha[@number][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@src][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::omicron[@abort="_blank"][@xml:id="id4"][not(child::node())][following-sibling::iota[@xml:lang="nb"][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::omega[@xml:lang="no-nb"][@xml:id="id5"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//xi[following-sibling::*[position()=2]][not(child::node())][following-sibling::mu[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::tau[@data][@xml:id="id6"][not(following-sibling::*)]//iota[@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en"][preceding-sibling::*[position() = 1]]//sigma[@true][@xml:lang="en"][@xml:id="id8"][following-sibling::beta[preceding-sibling::*[position() = 1]][following-sibling::omicron[@xml:lang="no-nb"][not(following-sibling::*)][position() = 1]]]]][position() = 1]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <zeta content="this-is-att-value"> <chi/> @@ -26753,6 +31338,11 @@ </test> <test> <xpath>//gamma[@xml:id="id1"]/*[following-sibling::*[position()=3]][not(child::node())][following-sibling::eta[preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="en-GB"][following-sibling::lambda[@xml:lang="no-nb"][@xml:id="id2"][preceding-sibling::*[position() = 3]]/omega[not(preceding-sibling::*)][not(following-sibling::*)]//omega//delta[starts-with(@attrib,"10")][following-sibling::*[position()=3]][not(child::node())][following-sibling::gamma[@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::chi[starts-with(@content,"100%")][@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[starts-with(@string,"att")][@xml:id="id4"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/sigma[@xml:lang="nb"][@xml:id="id5"][not(child::node())][following-sibling::nu[starts-with(concat(@att,"-"),"_blank-")][preceding-sibling::*[position() = 1]]/rho[@xml:lang="nb"][@xml:id="id6"]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <gamma xml:id="id1"> <any/> @@ -26780,6 +31370,11 @@ </test> <test> <xpath>//phi[@xml:lang="en-GB"]//chi[@xml:id="id1"][not(child::node())][following-sibling::delta[@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/lambda[starts-with(@number,"123456")][@xml:lang="en"][not(following-sibling::*)]//zeta[@xml:id="id2"][not(preceding-sibling::*)]//beta[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@xml:lang="no"][@xml:id="id4"][not(child::node())][following-sibling::alpha[contains(@false,"0%")][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[following-sibling::tau[@xml:id="id6"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//psi[starts-with(@string,"12345")][@xml:lang="nb"][@xml:id="id7"][not(preceding-sibling::*)]//delta[@delete][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//mu[@delete][not(preceding-sibling::*)]//xi[starts-with(concat(@abort,"-"),"123456789-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(preceding-sibling::xi)]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <phi xml:lang="en-GB"> <chi xml:id="id1"/> @@ -26811,6 +31406,11 @@ </test> <test> <xpath>//iota[@xml:lang="no"]//omega[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::rho[@xml:lang="en"][@xml:id="id1"][following-sibling::*[position()=2]][not(child::node())][following-sibling::nu[starts-with(concat(@string,"-"),"attribute-")][@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::chi[starts-with(concat(@object,"-"),"123456789-")][@xml:id="id3"][not(following-sibling::*)]//psi[@true][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="no-nb"][@xml:id="id4"][not(following-sibling::*)]//rho[contains(@true,"%")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@xml:id="id6"][not(following-sibling::*)]//lambda[@title][@xml:lang="en"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@att][@xml:id="id8"][preceding-sibling::*[position() = 1]]/*[@desciption][@xml:id="id9"][not(preceding-sibling::any)][not(child::node())][following-sibling::zeta[@att][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::phi[@attribute="this.nodeValue"][@xml:lang="no"][preceding-sibling::*[position() = 2]]//beta[contains(@title,"ue")][@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@xml:id="id11"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[contains(@insert,"lan")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::epsilon[@name][@xml:id="id12"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no"> <omega xml:lang="en-US"/> @@ -26843,6 +31443,11 @@ </test> <test> <xpath>//iota[@xml:lang="nb"][@xml:id="id1"]//xi[not(following-sibling::*)]//sigma/chi[starts-with(concat(@delete,"-"),"false-")][not(preceding-sibling::*)][not(following-sibling::*)]//phi[not(child::node())][following-sibling::iota[@attr][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[@attribute="solid 1px green"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@xml:lang="en"]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="nb" xml:id="id1"> <xi> @@ -26864,6 +31469,11 @@ </test> <test> <xpath>//xi[contains(@object,"al")][@xml:lang="nb"][@xml:id="id1"]/omega[starts-with(@data,"12345678")][@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@token][@xml:lang="en-US"][following-sibling::lambda[@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]/omega[starts-with(concat(@data,"-"),"true-")][@xml:id="id5"][not(following-sibling::*)]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <xi object="false" xml:lang="nb" xml:id="id1"> <omega data="123456789" xml:lang="en-GB" xml:id="id2"/> @@ -26879,6 +31489,11 @@ </test> <test> <xpath>//lambda[@string="another attribute value"][@xml:id="id1"]/delta[@xml:lang="en-US"][not(following-sibling::*)]/kappa[@attrib="solid 1px green"][@xml:id="id2"][not(preceding-sibling::*)]//iota[@xml:id="id3"][not(preceding-sibling::*)]//chi[following-sibling::*[position()=4]][not(child::node())][following-sibling::rho[@xml:id="id4"][following-sibling::tau[@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 3]][following-sibling::zeta[@xml:id="id6"]//lambda[@xml:lang="no-nb"][following-sibling::theta[starts-with(concat(@data,"-"),"another attribute value-")][not(following-sibling::*)]/delta[starts-with(concat(@token,"-"),"false-")][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[@xml:id="id7"][preceding-sibling::*[position() = 1]]//iota[starts-with(concat(@attribute,"-"),"true-")][@xml:id="id8"][not(following-sibling::*)]/lambda[@xml:lang="en"][@xml:id="id9"][not(following-sibling::*)]//omicron[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[@token][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[@xml:lang="no"][@xml:id="id11"][not(preceding-sibling::*)]/psi[starts-with(@att,"this-is")][@xml:lang="en"][not(preceding-sibling::*)][following-sibling::*[@attrib][@xml:lang="en-US"][@xml:id="id12"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//iota[@or="solid 1px green"][@xml:id="id13"][not(preceding-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <lambda string="another attribute value" xml:id="id1"> <delta xml:lang="en-US"> @@ -26922,6 +31537,11 @@ </test> <test> <xpath>//xi/nu[starts-with(@name,"_bla")][@xml:id="id1"]//upsilon[@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 1]]/chi[@string][@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[contains(@attrib,"tt-value")][not(following-sibling::*)]//chi[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[starts-with(@class,"c")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi//alpha[not(following-sibling::*)]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <xi> <nu name="_blank" xml:id="id1"> @@ -26944,6 +31564,11 @@ </test> <test> <xpath>//alpha[starts-with(concat(@attribute,"-"),"_blank-")][@xml:lang="en-US"]/omicron[@and="attribute-value"][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::zeta[@attribute][@xml:id="id1"][not(following-sibling::*)]/delta[@content][not(following-sibling::*)]//delta[@xml:lang="no-nb"]//lambda[@xml:lang="no-nb"][not(preceding-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <alpha attribute="_blank" xml:lang="en-US"> <omicron and="attribute-value" xml:lang="no"/> @@ -26961,6 +31586,11 @@ </test> <test> <xpath>//alpha[contains(concat(@string,"$"),"e value$")][@xml:id="id1"]//delta[contains(concat(@attrib,"$"),"tribute$")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//gamma[contains(@desciption,"u")][not(preceding-sibling::*)]/mu[@xml:lang="no-nb"][not(following-sibling::*)]//chi[@xml:lang="no"][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota[@xml:lang="en"][not(following-sibling::*)]/psi[starts-with(@name,"con")][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[contains(@src,"value")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//nu[@xml:id="id3"]//zeta[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]/iota[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <alpha string="attribute value" xml:id="id1"> <delta attrib="attribute" xml:lang="no-nb" xml:id="id2"> @@ -26987,6 +31617,11 @@ </test> <test> <xpath>//beta[@attrib]//sigma[@xml:lang="en-US"][@xml:id="id1"][following-sibling::*[position()=5]][not(child::node())][following-sibling::lambda[@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][not(child::node())][following-sibling::theta[@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::rho[starts-with(concat(@and,"-"),"123456789-")][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::*[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::pi[@name][not(following-sibling::*)]/kappa[starts-with(@or,"a")][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::theta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::phi[@xml:id="id6"][not(following-sibling::*)]/gamma[@att][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <beta attrib="123456789"> <sigma xml:lang="en-US" xml:id="id1"/> @@ -27008,6 +31643,11 @@ </test> <test> <xpath>//omega[@delete][@xml:lang="no"][@xml:id="id1"]//psi[@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::delta[@object][@xml:lang="no"]/phi[@xml:id="id3"]//nu[@xml:id="id4"][not(child::node())][following-sibling::theta[@desciption][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/epsilon[@xml:lang="no-nb"][not(child::node())][following-sibling::psi[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/zeta/phi[contains(@or,"te")][@xml:lang="no-nb"][not(following-sibling::*)]//alpha[@src][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@xml:lang="no"][not(child::node())][following-sibling::sigma[following-sibling::*[position()=1]][not(child::node())][following-sibling::alpha[starts-with(@or,"attribute ")][@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)]/alpha[contains(concat(@attr,"$"),"%$")][@xml:lang="en"][@xml:id="id7"][not(child::node())][following-sibling::epsilon[starts-with(concat(@content,"-"),"another attribute value-")][not(following-sibling::epsilon)]//gamma[@number="solid 1px green"][@xml:id="id8"][not(following-sibling::*)]//eta[contains(@object,"tru")][@xml:lang="en-GB"][@xml:id="id9"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[contains(concat(@attr,"$"),"-is-att-value$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id10"][preceding-sibling::*[position() = 2]][following-sibling::theta[preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]]]]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <omega delete="content" xml:lang="no" xml:id="id1"> <psi xml:lang="en-GB" xml:id="id2"/> @@ -27046,6 +31686,11 @@ </test> <test> <xpath>//xi[@xml:lang="no-nb"]/alpha[@insert][@xml:lang="no-nb"][@xml:id="id1"][not(preceding-sibling::*)]//psi[@attrib][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::lambda[starts-with(@att,"another attribute")][@xml:lang="no"][@xml:id="id3"][not(child::node())][following-sibling::omega[contains(@src,"se")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//psi[not(following-sibling::*)][not(preceding-sibling::psi)]//epsilon[@xml:id="id4"][not(preceding-sibling::*)]//kappa[contains(@token,"ttribut")][@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)]//nu[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[@attrib="_blank"][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[not(following-sibling::*)]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <xi xml:lang="no-nb"> <alpha insert="true" xml:lang="no-nb" xml:id="id1"> @@ -27070,6 +31715,11 @@ </test> <test> <xpath>//theta[@xml:id="id1"]//iota[@attrib][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::kappa[contains(@and,"an")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::beta[@src="content"][@xml:lang="no-nb"][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::psi[contains(concat(@attrib,"$"),"6789$")][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 3]]/gamma[not(following-sibling::*)]//gamma[starts-with(@att,"this-is-att-va")][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <theta xml:id="id1"> <iota attrib="this.nodeValue" xml:id="id2"/> @@ -27087,6 +31737,11 @@ </test> <test> <xpath>//alpha[@xml:lang="en-US"][@xml:id="id1"]/rho[@xml:lang="en"][@xml:id="id2"][not(following-sibling::*)]/delta[@xml:id="id3"][following-sibling::*[@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/tau//zeta[@xml:lang="en-US"][not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="en-US" xml:id="id1"> <rho xml:lang="en" xml:id="id2"> @@ -27105,6 +31760,11 @@ </test> <test> <xpath>//iota[@xml:lang="no-nb"][@xml:id="id1"]/omega[@xml:lang="en-US"][not(preceding-sibling::*)]//rho[@xml:lang="en"][not(following-sibling::*)]//theta[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:id="id3"][following-sibling::alpha[@xml:lang="nb"][not(following-sibling::*)]/nu[@false="123456789"][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::epsilon[@xml:lang="en-US"][@xml:id="id4"][following-sibling::omega[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 2]]]]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <iota xml:lang="no-nb" xml:id="id1"> <omega xml:lang="en-US"> @@ -27125,6 +31785,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]/sigma[starts-with(concat(@delete,"-"),"this-")][@xml:lang="no"][@xml:id="id2"][not(child::node())][following-sibling::sigma[@xml:id="id3"][not(following-sibling::*)]/sigma[@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::chi[contains(@object,"i")][@xml:id="id5"][following-sibling::*[position()=3]][not(child::node())][following-sibling::theta[@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::psi[@and][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][following-sibling::theta[starts-with(concat(@insert,"-"),"content-")][@xml:id="id7"]]]]]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <sigma delete="this-is-att-value" xml:lang="no" xml:id="id2"/> @@ -27142,6 +31807,11 @@ </test> <test> <xpath>//eta[@xml:lang="en"][@xml:id="id1"]//psi[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[@xml:lang="no"][@xml:id="id2"][following-sibling::iota[starts-with(@insert,"this.nodeValue")][not(following-sibling::*)]/alpha[following-sibling::sigma[contains(@abort,"s.")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[not(following-sibling::*)]//phi[@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::delta[preceding-sibling::*[position() = 1]]/phi[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[contains(concat(@or,"$"),"value$")][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//zeta//theta[@xml:id="id5"][following-sibling::*[position()=8]][not(child::node())][following-sibling::tau[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[contains(concat(@class,"$"),"ue$")][not(child::node())][following-sibling::beta[starts-with(concat(@string,"-"),"solid 1px green-")][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 3]][following-sibling::lambda[@desciption][@xml:lang="no-nb"][@xml:id="id8"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::chi[@object][@xml:lang="en"][preceding-sibling::*[position() = 5]][not(following-sibling::chi)][following-sibling::delta[@att][@xml:lang="no"][@xml:id="id9"][preceding-sibling::*[position() = 6]][not(child::node())][following-sibling::rho[contains(@insert,"e")][preceding-sibling::*[position() = 7]][following-sibling::*[position()=1]][following-sibling::rho[@xml:lang="nb"][preceding-sibling::*[position() = 8]]//epsilon[contains(@attrib,"other attribute value")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@xml:lang="en-US"][not(following-sibling::*)]/omicron[@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="en" xml:id="id1"> <psi xml:lang="no-nb"> @@ -27184,6 +31854,11 @@ </test> <test> <xpath>//*[@xml:id="id1"]//psi[@data][@xml:id="id2"]/iota[@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::gamma[starts-with(@delete,"10")][@xml:id="id3"][not(following-sibling::*)]//omega[@xml:lang="no"][not(preceding-sibling::*)]/chi[contains(@insert,"at")]//omega[contains(concat(@attribute,"$"),"true$")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[contains(@object,"conte")][@xml:lang="no"][@xml:id="id4"]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <any xml:id="id1"> <psi data="_blank" xml:id="id2"> @@ -27205,6 +31880,11 @@ </test> <test> <xpath>//nu[@xml:lang="en"][@xml:id="id1"]/nu[not(preceding-sibling::*)]/mu[starts-with(@false,"th")][@xml:id="id2"][not(following-sibling::*)]//omicron[@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]/epsilon[@attribute][@xml:lang="en-US"][following-sibling::kappa[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[@desciption="false"][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)]//omega[contains(concat(@class,"$"),"false$")][following-sibling::*[position()=1]][following-sibling::phi[@data="100%"][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="en" xml:id="id1"> <nu> @@ -27227,6 +31907,11 @@ </test> <test> <xpath>//kappa[starts-with(concat(@object,"-"),"100%-")][@xml:lang="en-US"]//pi[@or][@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]]//alpha[@attr][@xml:lang="en-GB"]//kappa[contains(@or,"ntent")][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)]//omicron[not(preceding-sibling::*)]/omega[not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@insert][not(preceding-sibling::*)][following-sibling::gamma[contains(concat(@false,"$"),"%$")][@xml:id="id4"][not(following-sibling::*)]/theta[@xml:lang="en"]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <kappa object="100%" xml:lang="en-US"> <pi or="solid 1px green" xml:id="id1"/> @@ -27253,6 +31938,11 @@ </test> <test> <xpath>//delta[@xml:id="id1"]/theta[@xml:lang="en-GB"][@xml:id="id2"][not(preceding-sibling::*)]//lambda[starts-with(@att,"another attribute")][@xml:lang="no"][not(preceding-sibling::*)]//pi[contains(@token,"ank")][@xml:lang="en"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id5"][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[starts-with(concat(@abort,"-"),"this.nodeValue-")][@xml:lang="no-nb"][@xml:id="id6"][not(following-sibling::kappa)][following-sibling::psi[contains(concat(@attrib,"$"),"ribute value$")][@xml:id="id7"][preceding-sibling::*[position() = 3]]//psi[@token][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=5]][not(child::node())][following-sibling::mu[preceding-sibling::*[position() = 1]][following-sibling::*[@insert][@xml:id="id9"][following-sibling::lambda[@attr][@xml:lang="no-nb"][@xml:id="id10"][following-sibling::rho[starts-with(concat(@desciption,"-"),"this-")][@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::alpha[@xml:lang="en-GB"][@xml:id="id11"]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <delta xml:id="id1"> <theta xml:lang="en-GB" xml:id="id2"> @@ -27279,6 +31969,11 @@ </test> <test> <xpath>//nu[starts-with(concat(@attrib,"-"),"this-")]//gamma/rho[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[@xml:id="id2"][not(child::node())][following-sibling::epsilon/upsilon[contains(concat(@object,"$"),"ntent$")][@xml:lang="nb"][not(following-sibling::*)]/pi[@xml:lang="en-GB"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[preceding-sibling::*[position() = 1]]/*[@delete][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=3]][following-sibling::lambda[@xml:id="id4"][not(child::node())][following-sibling::delta[@xml:lang="en-GB"][following-sibling::psi[not(following-sibling::*)]/zeta[starts-with(@or,"attribute")][not(preceding-sibling::*)]/rho[contains(@string,"bute-value")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"]//upsilon[@abort="attribute-value"][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]/upsilon[@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:id="id6"][not(following-sibling::*)]/beta[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[contains(@content,"t")][@xml:lang="en"][@xml:id="id8"][not(child::node())][following-sibling::*[starts-with(@token,"_bl")][@xml:id="id9"][following-sibling::rho[contains(concat(@content,"$"),"ribute-value$")][@xml:lang="no-nb"][@xml:id="id10"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <nu attrib="this-is-att-value"> <gamma> @@ -27322,6 +32017,11 @@ </test> <test> <xpath>//tau[@xml:lang="nb"]/delta[not(preceding-sibling::*)]//omicron[contains(concat(@content,"$"),"nodeValue$")][@xml:lang="nb"][not(following-sibling::*)]//tau[@xml:lang="nb"][@xml:id="id1"]/theta[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:lang="en-US"]/delta[@xml:lang="en-US"][not(preceding-sibling::*)]//theta[not(child::node())][following-sibling::kappa[starts-with(concat(@desciption,"-"),"another attribute value-")][@xml:lang="no-nb"][@xml:id="id2"][not(following-sibling::*)]//chi[@string][@xml:id="id3"][following-sibling::sigma[following-sibling::*[position()=1]][following-sibling::gamma[starts-with(concat(@attr,"-"),"_blank-")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]/epsilon[contains(concat(@false,"$"),"e$")][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//theta[@data="solid 1px green"][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[not(preceding-sibling::*)][not(following-sibling::*)]/zeta[not(following-sibling::*)]//lambda[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)]//omicron[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][not(following-sibling::*)]/omicron[@xml:lang="en"][@xml:id="id7"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="nb"> <delta> @@ -27363,6 +32063,11 @@ </test> <test> <xpath>//lambda[@xml:id="id1"]/kappa[contains(concat(@false,"$"),"k$")][@xml:id="id2"][following-sibling::zeta[not(child::node())][following-sibling::pi[contains(concat(@attrib,"$"),"e$")][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::delta[@xml:lang="en-GB"][not(child::node())][following-sibling::gamma[contains(@title,"ttribu")][@xml:id="id4"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/iota[@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::upsilon)]//sigma[@true][not(preceding-sibling::*)]/eta[@xml:lang="no-nb"]//lambda[@token][@xml:lang="en"][@xml:id="id7"][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <lambda xml:id="id1"> <kappa false="_blank" xml:id="id2"/> @@ -27386,6 +32091,11 @@ </test> <test> <xpath>//kappa[@string="attribute"][@xml:id="id1"]/iota[contains(@title,"%")][@xml:id="id2"][following-sibling::xi[starts-with(concat(@src,"-"),"this.nodeValue-")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//theta[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]//pi[position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <kappa string="attribute" xml:id="id1"> <iota title="100%" xml:id="id2"/> @@ -27402,6 +32112,11 @@ </test> <test> <xpath>//mu[starts-with(concat(@data,"-"),"attribute-")]//gamma[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[contains(@name,"-a")][@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[@xml:id="id2"][not(following-sibling::*)]//kappa[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[starts-with(@number,"a")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::delta[contains(@attribute,"r attribute value")][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[starts-with(concat(@src,"-"),"this-")][@xml:lang="en"][@xml:id="id5"][not(following-sibling::*)]/*[@or="_blank"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::lambda[starts-with(concat(@title,"-"),"content-")][@xml:lang="nb"][following-sibling::*[position()=1]][following-sibling::nu[starts-with(@token,"attrib")][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/beta[not(preceding-sibling::*)][not(following-sibling::*)]//zeta[starts-with(@att,"another attribu")][not(child::node())][following-sibling::phi[starts-with(concat(@data,"-"),"100%-")][@xml:lang="en-US"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][not(child::node())][following-sibling::pi[not(child::node())][following-sibling::*//pi[@xml:id="id6"][not(following-sibling::*)]//alpha[starts-with(concat(@abort,"-"),"true-")][@xml:id="id7"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <mu data="attribute"> <gamma xml:id="id1"> @@ -27438,6 +32153,11 @@ </test> <test> <xpath>//*[contains(@string,"ent")][@xml:lang="nb"]//*[starts-with(@and,"true")][@xml:lang="en-US"][following-sibling::eta[@content="this.nodeValue"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::delta[@xml:lang="no"][not(child::node())][following-sibling::beta[contains(@src," 1")][@xml:id="id2"][following-sibling::psi[contains(concat(@string,"$"),"00%$")][@xml:id="id3"][following-sibling::iota[@xml:id="id4"][preceding-sibling::*[position() = 5]][not(following-sibling::*)][not(preceding-sibling::iota)]//zeta[contains(@string,"green")][@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]//beta[not(following-sibling::*)]/sigma[starts-with(@attribute,"another attribut")][@xml:lang="no"][not(preceding-sibling::*)]/delta[@string][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@class][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::nu[@xml:lang="en-US"][@xml:id="id7"][not(child::node())][following-sibling::beta[contains(@delete,"0%")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//mu[@xml:lang="no-nb"][not(following-sibling::*)]/eta[@xml:id="id8"][following-sibling::*[position()=5]][not(child::node())][following-sibling::phi[@xml:lang="no"][preceding-sibling::*[position() = 1]][following-sibling::zeta[contains(concat(@content,"$"),"-value$")][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::tau[contains(@or,"10")][@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 3]][following-sibling::psi[@xml:id="id10"][following-sibling::beta[@xml:lang="no-nb"]/mu[@xml:id="id11"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]]]][position() = 1]][position() = 1]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>1</nth> + </result> <tree> <any string="content" xml:lang="nb"> <any and="true" xml:lang="en-US"/> @@ -27476,6 +32196,11 @@ </test> <test> <xpath>//xi//*[starts-with(concat(@abort,"-"),"attribute value-")][@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)]//beta[starts-with(@object,"this.nodeV")][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@and]/omicron[@xml:id="id2"]//lambda[@src="this-is-att-value"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[@token][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>1</nth> + </result> <tree> <xi> <any abort="attribute value" xml:lang="en-US" xml:id="id1"> @@ -27496,6 +32221,11 @@ </test> <test> <xpath>//rho/psi[@xml:id="id1"][following-sibling::beta[contains(concat(@class,"$"),"6789$")][@xml:lang="nb"][not(following-sibling::*)]/omicron[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::eta[@and][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[preceding-sibling::*[position() = 2]][following-sibling::theta/omicron[starts-with(concat(@object,"-"),"123456789-")][@xml:id="id2"][not(following-sibling::*)]//pi[@name][not(preceding-sibling::*)]/zeta[@class]//mu[contains(@insert,"u")][@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/gamma[starts-with(concat(@string,"-"),"100%-")][@xml:lang="no-nb"][not(preceding-sibling::*)][following-sibling::nu[@xml:id="id4"][preceding-sibling::*[position() = 1]]/epsilon[starts-with(concat(@attrib,"-"),"solid 1px green-")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:lang="en-GB"][@xml:id="id6"]/lambda[contains(concat(@string,"$"),"e$")][not(preceding-sibling::*)][following-sibling::nu/xi[starts-with(@abort,"attribute")][@xml:lang="nb"][not(preceding-sibling::*)]/*[contains(@number,"ttribute")][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@content][@xml:lang="en-US"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <rho> <psi xml:id="id1"/> @@ -27536,6 +32266,11 @@ </test> <test> <xpath>//phi[@object]/sigma[contains(@insert,"tr")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[starts-with(@abort,"12345678")][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@or]/beta[not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[@desciption][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//zeta[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)]/omicron[@content][not(preceding-sibling::*)][not(following-sibling::*)]/lambda[contains(concat(@or,"$"),"lank$")][@xml:id="id2"]//sigma[@xml:id="id3"][following-sibling::gamma[@attribute][not(following-sibling::*)]//omicron[@attribute][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(preceding-sibling::omicron)][following-sibling::iota[@src][not(child::node())][following-sibling::rho[@xml:id="id5"][not(child::node())][following-sibling::*[@xml:lang="no"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//gamma[@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@att][@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//zeta[@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:id="id8"][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <phi object="solid 1px green"> <sigma insert="true" xml:lang="en"> @@ -27574,6 +32309,11 @@ </test> <test> <xpath>//zeta[@token="attribute"][@xml:lang="en-US"]//zeta[@and][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[contains(concat(@title,"$"),"attribute value$")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/omicron[@xml:lang="en"]//nu[contains(@insert," value")][@xml:lang="en-GB"][@xml:id="id1"][following-sibling::tau[@true][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/xi[starts-with(@content,"t")][following-sibling::delta[@xml:lang="no"][@xml:id="id2"]/nu[contains(concat(@attr,"$"),"this-is-att-value$")][@xml:id="id3"][not(preceding-sibling::*)]//omicron[starts-with(concat(@delete,"-"),"false-")][@xml:lang="no"][@xml:id="id4"]//beta[starts-with(concat(@content,"-"),"this.nodeValue-")][@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@abort][@xml:lang="no"][@xml:id="id6"]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>1</nth> + </result> <tree> <zeta token="attribute" xml:lang="en-US"> <zeta and="123456789"/> @@ -27600,6 +32340,11 @@ </test> <test> <xpath>//eta[@xml:lang="no"][@xml:id="id1"]/*[starts-with(concat(@desciption,"-"),"attribute value-")][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::psi[@xml:id="id2"][preceding-sibling::*[position() = 1]]//chi[@xml:lang="nb"][not(following-sibling::*)]/beta[contains(@src,"bute")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[@delete][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::tau[@xml:id="id4"][not(following-sibling::*)]//chi[@content="this-is-att-value"][@xml:lang="en-GB"][following-sibling::theta[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/kappa[@content][@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::theta[contains(@attrib,"nt")][@xml:lang="en-GB"][following-sibling::gamma[starts-with(concat(@token,"-"),"_blank-")][@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::omicron[starts-with(@name,"_blan")][not(following-sibling::*)]//pi[@xml:lang="en"]/theta[@xml:lang="no"][not(following-sibling::*)]//iota[@xml:lang="no"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[contains(@and,"als")][@xml:id="id10"][not(child::node())][following-sibling::sigma[contains(@data,"bute valu")][not(following-sibling::*)]//gamma[not(preceding-sibling::*)]//mu[@xml:id="id11"]]][position() = 1]]]][position() = 1]]]]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="no" xml:id="id1"> <any desciption="attribute value"/> @@ -27639,6 +32384,11 @@ </test> <test> <xpath>//zeta//delta[following-sibling::*[position()=9]][not(preceding-sibling::delta)][not(child::node())][following-sibling::psi[@xml:lang="nb"][following-sibling::phi[contains(concat(@att,"$"),"%$")][not(child::node())][following-sibling::omega[@xml:lang="en-US"][@xml:id="id1"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::pi[@xml:lang="no"][following-sibling::tau[starts-with(concat(@and,"-"),"this-")][@xml:id="id2"][preceding-sibling::*[position() = 5]][not(child::node())][following-sibling::beta[starts-with(@number,"this.nodeVa")][@xml:id="id3"][preceding-sibling::*[position() = 6]][following-sibling::beta[starts-with(concat(@object,"-"),"123456789-")][@xml:id="id4"][not(child::node())][following-sibling::iota[contains(concat(@or,"$"),"nk$")][@xml:lang="no"][not(child::node())][following-sibling::kappa[not(following-sibling::*)]/tau[not(following-sibling::*)]/*[@xml:lang="nb"][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id5"]/rho[@xml:id="id6"][not(following-sibling::*)]/phi[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[@xml:lang="no"][@xml:id="id7"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//xi[@xml:id="id8"][following-sibling::zeta[@xml:lang="en-GB"][not(following-sibling::*)]//theta[@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]//eta[starts-with(@desciption,"this.n")]/phi[starts-with(@number,"con")][@xml:lang="no"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::psi[@xml:lang="no-nb"][@xml:id="id11"][preceding-sibling::*[position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <zeta> <delta/> @@ -27679,6 +32429,11 @@ </test> <test> <xpath>//delta[contains(concat(@or,"$"),"e$")]//phi[@xml:lang="en-GB"][not(child::node())][following-sibling::sigma[starts-with(@token,"10")]/*[starts-with(@src,"true")][@xml:lang="en-US"][following-sibling::*[position()=3]][following-sibling::alpha[@xml:lang="en"][@xml:id="id1"][following-sibling::tau[@string][@xml:id="id2"][not(child::node())][following-sibling::lambda[preceding-sibling::*[position() = 3]][not(following-sibling::*)]]]]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <delta or="attribute value"> <phi xml:lang="en-GB"/> @@ -27695,6 +32450,11 @@ </test> <test> <xpath>//gamma[starts-with(@false,"_blank")][@xml:lang="en"]//omicron[@xml:lang="no"][@xml:id="id1"][not(following-sibling::*)][not(preceding-sibling::omicron)]/omega[not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::nu[@object]//omicron[@xml:lang="en-US"][not(child::node())][following-sibling::zeta[@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::sigma[@attribute][@xml:lang="en-GB"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::xi[preceding-sibling::*[position() = 4]][not(following-sibling::*)]//theta[starts-with(concat(@object,"-"),"this-")][@xml:id="id5"]/pi[@attrib][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[starts-with(concat(@desciption,"-"),"false-")][@xml:lang="no"][@xml:id="id6"][preceding-sibling::*[position() = 1]]//*[@xml:id="id7"][not(preceding-sibling::*)][not(preceding-sibling::any)][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id8"][not(following-sibling::*)]/chi[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::iota[@xml:lang="en-US"][preceding-sibling::*[position() = 1]]//rho[not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]][position() = 1]]]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <gamma false="_blank" xml:lang="en"> <omicron xml:lang="no" xml:id="id1"> @@ -27728,6 +32488,11 @@ </test> <test> <xpath>//tau[@xml:id="id1"]/kappa[@xml:lang="no"]//psi[@xml:lang="no-nb"][@xml:id="id2"][not(child::node())][following-sibling::sigma[@desciption="_blank"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/theta[@xml:id="id3"][not(preceding-sibling::*)]//omicron[@object][not(preceding-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <tau xml:id="id1"> <kappa xml:lang="no"> @@ -27745,6 +32510,11 @@ </test> <test> <xpath>//omicron//beta[starts-with(concat(@string,"-"),"123456789-")][@xml:lang="en-GB"][not(preceding-sibling::*)][not(child::node())][following-sibling::epsilon[@or="this.nodeValue"][not(following-sibling::*)]//pi[starts-with(concat(@att,"-"),"_blank-")][@xml:lang="no-nb"]/delta[@delete]/rho[contains(@or,"lue")][@xml:lang="en-GB"]/alpha[not(preceding-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <omicron> <beta string="123456789" xml:lang="en-GB"/> @@ -27764,6 +32534,11 @@ </test> <test> <xpath>//epsilon[contains(concat(@true,"$"),"olid 1px green$")]//upsilon[@attribute][@xml:lang="no"][@xml:id="id1"][following-sibling::*[position()=1]][following-sibling::eta[@xml:id="id2"][preceding-sibling::*[position() = 1]]//omicron[@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//lambda[@att][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::omicron[@and][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[@name][following-sibling::*[@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::pi[@xml:id="id6"][following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[starts-with(concat(@data,"-"),"attribute-")][@xml:lang="no"][preceding-sibling::*[position() = 3]][following-sibling::rho[@number][@xml:lang="nb"][not(child::node())][following-sibling::kappa[contains(concat(@attribute,"$"),"ibute-value$")][@xml:lang="en-GB"]//*[@desciption="attribute-value"][not(child::node())][following-sibling::zeta[@name][@xml:lang="no-nb"][@xml:id="id7"][not(following-sibling::*)]//omega[@xml:id="id8"][not(following-sibling::*)]/phi[not(preceding-sibling::*)]//psi[@xml:id="id9"][not(child::node())][following-sibling::epsilon[contains(concat(@insert,"$"),"nt$")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][position() = 1]][position() = 1]]]]]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <epsilon true="solid 1px green"> <upsilon attribute="solid 1px green" xml:lang="no" xml:id="id1"/> @@ -27798,6 +32573,11 @@ </test> <test> <xpath>//eta//psi[following-sibling::upsilon[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@false][@xml:lang="no-nb"][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@xml:id="id1"][not(following-sibling::*)]/theta[not(preceding-sibling::*)][not(child::node())][following-sibling::delta[contains(concat(@name,"$"),"ue$")]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>psi</localname> + <nth>0</nth> + </result> <tree> <eta> <psi/> @@ -27814,6 +32594,11 @@ </test> <test> <xpath>//chi[@object][@xml:lang="no"]//nu[@xml:lang="en-US"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=6]][not(child::node())][following-sibling::iota[starts-with(@data,"sol")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][following-sibling::xi[@attribute][following-sibling::mu[@xml:lang="en"][@xml:id="id2"][following-sibling::upsilon[@xml:lang="nb"][not(child::node())][following-sibling::mu[starts-with(@token,"attribute")][@xml:lang="en-US"][@xml:id="id3"][not(child::node())][following-sibling::epsilon[contains(concat(@number,"$"),"456789$")][@xml:lang="no"][preceding-sibling::*[position() = 6]]//kappa[starts-with(@desciption,"fal")][@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@token="content"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[@xml:lang="nb"][following-sibling::iota[@xml:id="id6"]/pi[starts-with(concat(@att,"-"),"attribute-")][@xml:lang="no"][not(preceding-sibling::*)][not(following-sibling::*)]/chi[not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:id="id7"][preceding-sibling::*[position() = 1]]//mu[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id8"][following-sibling::mu[@class][@xml:lang="nb"][@xml:id="id9"][not(following-sibling::*)]/phi[@attribute][@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:id="id11"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]][position() = 1]]]]]][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <chi object="attribute value" xml:lang="no"> <nu xml:lang="en-US" xml:id="id1"/> @@ -27848,6 +32633,11 @@ </test> <test> <xpath>//tau[@xml:lang="no"]/omega[@xml:lang="no"][@xml:id="id1"]/gamma[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//iota[@xml:id="id2"]/mu[@xml:lang="en"][@xml:id="id3"]/delta[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(concat(@and,"$"),"ttribute$")][@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[@att][@xml:id="id5"][not(child::node())][following-sibling::gamma//omicron[@xml:id="id6"][not(child::node())][following-sibling::delta[@src="attribute value"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][not(child::node())][following-sibling::*[@xml:lang="nb"][@xml:id="id7"][following-sibling::*[position()=2]][following-sibling::iota[@xml:id="id8"][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 4]]//chi[@xml:lang="no-nb"][@xml:id="id9"]/gamma[contains(concat(@name,"$"),"true$")][@xml:lang="en-GB"][@xml:id="id10"][not(preceding-sibling::*)][not(preceding-sibling::gamma)]/phi[@number="123456789"][@xml:lang="nb"][@xml:id="id11"][not(preceding-sibling::*)][following-sibling::*[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[not(preceding-sibling::*)]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="no"> <omega xml:lang="no" xml:id="id1"> @@ -27885,6 +32675,11 @@ </test> <test> <xpath>//pi[contains(@desciption,"%")][@xml:lang="nb"]/lambda[@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[@insert][@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]/beta[contains(concat(@attribute,"$"),"tribute$")][@xml:lang="en-GB"]/mu[@desciption][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::zeta[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::tau[@number][@xml:id="id4"]/kappa[not(preceding-sibling::*)][following-sibling::nu[contains(@data,"is.nodeValue")][@xml:lang="en"][@xml:id="id5"]/mu[not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@attr="content"][@xml:id="id6"][not(following-sibling::*)]//delta[not(following-sibling::*)]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <pi desciption="100%" xml:lang="nb"> <lambda xml:id="id1"> @@ -27911,6 +32706,11 @@ </test> <test> <xpath>//pi//lambda[@xml:id="id1"]//epsilon[@xml:id="id2"][following-sibling::alpha[contains(concat(@name,"$"),"rue$")][@xml:lang="en"][@xml:id="id3"][not(following-sibling::*)]/phi[contains(concat(@insert,"$"),"e$")][@xml:id="id4"][not(preceding-sibling::*)]/chi[@xml:lang="no-nb"][not(preceding-sibling::*)][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <pi> <lambda xml:id="id1"> @@ -27928,6 +32728,11 @@ </test> <test> <xpath>//sigma[@xml:lang="en-GB"][@xml:id="id1"]//eta[contains(@object,"id 1px")][@xml:lang="en-US"][@xml:id="id2"][not(following-sibling::*)]//omega[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::kappa[@false="this.nodeValue"][@xml:lang="en-US"][following-sibling::mu[@attribute][preceding-sibling::*[position() = 2]]/gamma[@class][@xml:lang="en-GB"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::sigma[contains(@class,"-is-att-v")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//pi[contains(concat(@data,"$"),"ank$")][not(preceding-sibling::*)]//omega[starts-with(concat(@false,"-"),"this-")][@xml:id="id5"]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="en-GB" xml:id="id1"> <eta object="solid 1px green" xml:lang="en-US" xml:id="id2"> @@ -27949,6 +32754,11 @@ </test> <test> <xpath>//pi[@xml:id="id1"]/tau[@xml:lang="nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::psi[preceding-sibling::*[position() = 2]]/pi[@xml:lang="no"][not(child::node())][following-sibling::omega[contains(concat(@string,"$"),"ttribute$")][@xml:lang="en-GB"][following-sibling::mu[@xml:lang="en"][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::tau[contains(@insert,"lank")][@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]/xi[@number="123456789"][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/epsilon[@xml:lang="no"][not(child::node())][following-sibling::beta[starts-with(concat(@number,"-"),"_blank-")][@xml:id="id6"][preceding-sibling::*[position() = 1]][following-sibling::beta[starts-with(@src,"1234")][@xml:lang="en-US"][@xml:id="id7"][preceding-sibling::*[position() = 2]]/xi[@xml:lang="no-nb"][not(following-sibling::*)]/epsilon[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:id="id9"][following-sibling::lambda[contains(@attribute,"alue")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <pi xml:id="id1"> <tau xml:lang="nb" xml:id="id2"/> @@ -27979,6 +32789,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="en-US"]/nu[contains(@number,"se")][@xml:lang="en-US"][not(child::node())][following-sibling::chi[@false][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//omega[contains(concat(@and,"$"),"123456789$")][@xml:lang="en-GB"]/theta[not(preceding-sibling::*)][not(following-sibling::*)]/*[@content][@xml:id="id2"][not(following-sibling::*)]//phi[contains(concat(@false,"$"),"ttribute-value$")][@xml:lang="en-US"][not(child::node())][following-sibling::omega[starts-with(concat(@attribute,"-"),"solid 1px green-")][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::theta[@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/beta[@content][@xml:lang="no"]/beta[following-sibling::theta[@object="content"][@xml:lang="en-GB"][@xml:id="id4"]/rho[starts-with(@title,"100")][@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="en-US"> <nu number="false" xml:lang="en-US"/> @@ -28007,6 +32822,11 @@ </test> <test> <xpath>//*//tau[@content][@xml:lang="en"][following-sibling::nu[@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::eta[@xml:id="id2"][following-sibling::psi[@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::phi[@xml:lang="nb"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//mu[@xml:id="id3"][not(following-sibling::*)]//delta[not(preceding-sibling::*)][following-sibling::kappa[starts-with(concat(@number,"-"),"100%-")][@xml:lang="en-US"][following-sibling::delta[starts-with(@abort,"this-")][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[@xml:lang="en-US"][@xml:id="id5"][not(preceding-sibling::*)]//nu[starts-with(@src,"at")][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <any> <tau content="this-is-att-value" xml:lang="en"/> @@ -28031,6 +32851,11 @@ </test> <test> <xpath>//delta[@title]/tau[@xml:lang="nb"][@xml:id="id1"][not(child::node())][following-sibling::omicron[@xml:lang="en-US"][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/lambda[@object="attribute-value"][not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:lang="en-US"][@xml:id="id3"][following-sibling::xi[contains(@false,"a")][@xml:lang="en-US"][preceding-sibling::*[position() = 2]][following-sibling::epsilon[@number][@xml:lang="en-US"][@xml:id="id4"][not(child::node())][following-sibling::nu[@src="attribute value"][@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)]//xi[@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::upsilon[starts-with(@src,"this.no")][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <delta title="_blank"> <tau xml:lang="nb" xml:id="id1"/> @@ -28054,6 +32879,11 @@ </test> <test> <xpath>//xi[@false]//rho[@xml:id="id1"][not(preceding-sibling::*)]//delta[@xml:id="id2"]/psi[@xml:lang="no-nb"][not(following-sibling::*)]/theta[@xml:id="id3"][not(preceding-sibling::*)]/sigma[@xml:lang="en-US"]/phi[@content="another attribute value"][@xml:lang="en-GB"][not(child::node())][following-sibling::chi[@desciption][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/iota[contains(concat(@attrib,"$"),"ute$")][@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)]/sigma[@xml:id="id6"]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <xi false="attribute-value"> <rho xml:id="id1"> @@ -28079,6 +32909,11 @@ </test> <test> <xpath>//sigma/epsilon[@attr][@xml:id="id1"]/xi[@xml:id="id2"][not(preceding-sibling::*)]//sigma[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[@xml:id="id3"][not(preceding-sibling::*)][following-sibling::*[position()=4]][following-sibling::xi[@title][@xml:id="id4"][preceding-sibling::*[position() = 1]][not(preceding-sibling::xi)][not(child::node())][following-sibling::pi[@xml:id="id5"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::omicron[@attr][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=1]][following-sibling::*[preceding-sibling::*[position() = 4]]//theta[not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::chi[@xml:id="id8"][following-sibling::*[position()=2]][following-sibling::theta[@xml:lang="en-US"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::upsilon[contains(@true,"_b")][@xml:lang="en"][@xml:id="id9"][preceding-sibling::*[position() = 3]]/epsilon[@xml:id="id10"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[contains(@or," gree")][@xml:id="id11"][following-sibling::alpha[@token][@xml:id="id12"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::psi[@desciption="123456789"][@xml:lang="no"][preceding-sibling::*[position() = 3]]/gamma[@title][not(child::node())][following-sibling::omega[@xml:id="id13"][preceding-sibling::*[position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <sigma> <epsilon attr="this-is-att-value" xml:id="id1"> @@ -28114,6 +32949,11 @@ </test> <test> <xpath>//kappa[@string][@xml:lang="nb"][@xml:id="id1"]//lambda[starts-with(@attribute,"fal")][@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]/nu[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::theta[starts-with(@attribute,"con")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="en-GB"]/lambda[@xml:id="id4"][not(following-sibling::*)]/omega[starts-with(@token,"tru")][@xml:id="id5"]//tau[@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@xml:id="id6"]/mu[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 1]]//gamma[starts-with(@data,"thi")][not(preceding-sibling::*)]//theta[starts-with(concat(@desciption,"-"),"true-")][@xml:lang="en"][following-sibling::lambda[not(following-sibling::*)]//phi[@xml:lang="nb"][@xml:id="id8"][not(child::node())][following-sibling::*[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[starts-with(concat(@content,"-"),"this.nodeValue-")][@xml:id="id9"]/epsilon[position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <kappa string="solid 1px green" xml:lang="nb" xml:id="id1"> <lambda attribute="false" xml:lang="en-GB" xml:id="id2"> @@ -28150,6 +32990,11 @@ </test> <test> <xpath>//psi[@name][@xml:lang="no-nb"]/epsilon[@abort="attribute-value"][@xml:id="id1"]//pi[contains(concat(@attr,"$"),"k$")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[contains(concat(@token,"$"),"content$")][@xml:lang="no"][not(preceding-sibling::eta)][following-sibling::pi[starts-with(@string,"another attribute va")][@xml:id="id3"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][following-sibling::upsilon[starts-with(@attribute,"at")][@xml:id="id4"][following-sibling::pi[contains(concat(@string,"$")," attribute value$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 4]][following-sibling::alpha[@xml:id="id5"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <psi name="100%" xml:lang="no-nb"> <epsilon abort="attribute-value" xml:id="id1"> @@ -28167,6 +33012,11 @@ </test> <test> <xpath>//delta[@xml:lang="no-nb"][@xml:id="id1"]//*[contains(@and,"%")][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@content="false"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/kappa[starts-with(@delete,"fa")][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@xml:lang="no"][@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=4]][following-sibling::sigma[@xml:id="id5"][following-sibling::*[position()=3]][not(child::node())][following-sibling::tau[@xml:lang="nb"][preceding-sibling::*[position() = 3]][following-sibling::*[position()=2]][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::rho[@xml:lang="en-GB"][not(following-sibling::*)][position() = 1]]][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>any</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="no-nb" xml:id="id1"> <any and="100%"/> @@ -28185,6 +33035,11 @@ </test> <test> <xpath>//*[contains(@attr,"blank")]//sigma[contains(@abort,"t")][not(preceding-sibling::*)]/pi[@xml:lang="en-GB"]//phi[@string][@xml:id="id1"][following-sibling::*[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[starts-with(concat(@token,"-"),"another attribute value-")][@xml:id="id3"][not(preceding-sibling::*)][not(preceding-sibling::kappa or following-sibling::kappa)]/mu[not(preceding-sibling::*)][following-sibling::psi[@string][preceding-sibling::*[position() = 1]][following-sibling::alpha[@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::delta[starts-with(concat(@number,"-"),"123456789-")][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/sigma[contains(@false,"alue")][@xml:lang="nb"]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>phi</localname> + <nth>0</nth> + </result> <tree> <any attr="_blank"> <sigma abort="content"> @@ -28209,6 +33064,11 @@ </test> <test> <xpath>//eta[@desciption][@xml:id="id1"]//theta[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[starts-with(concat(@string,"-"),"100%-")][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]/omicron[starts-with(@true,"conten")][@xml:id="id3"][not(preceding-sibling::*)][following-sibling::lambda[@xml:lang="en"]//mu[not(preceding-sibling::*)]//*[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//nu[starts-with(concat(@and,"-"),"solid 1px green-")][not(preceding-sibling::*)]//psi[@xml:lang="en-US"][@xml:id="id4"]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <eta desciption="false" xml:id="id1"> <theta xml:lang="en-US"> @@ -28232,6 +33092,11 @@ </test> <test> <xpath>//pi[@xml:lang="en-GB"]/tau[@attribute][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[contains(concat(@desciption,"$"),"attribute value$")][@xml:lang="no"]//pi[starts-with(@class,"true")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]/sigma[contains(concat(@att,"$")," 1px green$")][not(preceding-sibling::*)][not(following-sibling::*)]//sigma[starts-with(concat(@string,"-"),"false-")]//phi[contains(@desciption,"100%")][@xml:lang="en-GB"][not(following-sibling::*)]//zeta[@xml:id="id3"][not(following-sibling::*)]/pi[@class="another attribute value"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[starts-with(concat(@attribute,"-"),"attribute value-")][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:lang="en-US"][@xml:id="id5"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::lambda[@false="attribute"][@xml:lang="en"][@xml:id="id6"][preceding-sibling::*[position() = 3]]//alpha[@title][@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <pi xml:lang="en-GB"> <tau attribute="attribute" xml:id="id1"/> @@ -28260,6 +33125,11 @@ </test> <test> <xpath>//nu[@xml:lang="no"][@xml:id="id1"]//chi[@xml:id="id2"][not(preceding-sibling::*)]//lambda[@xml:id="id3"][not(child::node())][following-sibling::beta[preceding-sibling::*[position() = 1]]//psi[contains(@true,"0%")][@xml:lang="no"][@xml:id="id4"]/nu[@attrib][@xml:lang="no"][following-sibling::*[position()=2]][following-sibling::omega[contains(concat(@abort,"$"),"-is-att-value$")][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::iota[@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]//psi[contains(concat(@desciption,"$"),"ue$")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::iota[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::xi[@attr][@xml:id="id8"][following-sibling::*[position()=5]][following-sibling::chi[contains(concat(@att,"$"),"nk$")][following-sibling::*[position()=4]][not(child::node())][following-sibling::chi[@xml:lang="en-GB"][@xml:id="id9"][not(child::node())][following-sibling::kappa[@desciption="solid 1px green"][@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 5]][following-sibling::eta[contains(concat(@desciption,"$"),"te$")][following-sibling::eta[@xml:lang="nb"][not(following-sibling::*)]/eta[@true="123456789"][@xml:lang="nb"][not(preceding-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="no" xml:id="id1"> <chi xml:id="id2"> @@ -28290,6 +33160,11 @@ </test> <test> <xpath>//theta[@att="false"][@xml:id="id1"]//epsilon[contains(concat(@false,"$"),"bute value$")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[starts-with(@or,"con")][@xml:lang="en-GB"][@xml:id="id3"][not(child::node())][following-sibling::mu[starts-with(concat(@att,"-"),"attribute-")][@xml:lang="no-nb"][@xml:id="id4"]/theta[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::omicron[following-sibling::tau[starts-with(@attrib,"attri")][@xml:lang="nb"][preceding-sibling::*[position() = 2]]//rho[@xml:lang="en-GB"][@xml:id="id6"][not(child::node())][following-sibling::tau[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/lambda[@xml:id="id8"]/rho[starts-with(@desciption,"attrib")][@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::upsilon[@xml:lang="no"][preceding-sibling::*[position() = 1]]//delta[@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::upsilon[contains(concat(@attrib,"$"),"56789$")][@xml:id="id10"]/alpha[starts-with(@attrib,"th")][@xml:lang="no"][not(preceding-sibling::*)][not(preceding-sibling::alpha)][following-sibling::gamma[contains(@delete,"4567")]/upsilon[@xml:lang="no-nb"][@xml:id="id11"][not(following-sibling::*)]//epsilon[@attr][@xml:lang="en-GB"][not(following-sibling::*)]/sigma[@xml:id="id12"]/epsilon[@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@xml:id="id13"][following-sibling::omega[preceding-sibling::*[position() = 2]]/phi[@desciption][@xml:id="id14"][not(preceding-sibling::*)][not(following-sibling::*)]/pi[@content="false"][@xml:lang="en-US"][@xml:id="id15"][not(preceding-sibling::*)]]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <theta att="false" xml:id="id1"> <epsilon false="attribute value" xml:id="id2"> @@ -28335,6 +33210,11 @@ </test> <test> <xpath>//kappa[contains(@number,"e")][@xml:id="id1"]/upsilon[contains(concat(@title,"$"),"ue$")][@xml:lang="en"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:id="id2"]/nu[@delete="123456789"][@xml:lang="en-US"][@xml:id="id3"][following-sibling::*[position()=1]][not(child::node())][following-sibling::beta[@desciption][@xml:id="id4"]//alpha[@desciption][@xml:lang="en"][not(parent::*/*[position()=2])]//omicron[contains(concat(@name,"$"),"tent$")][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@xml:lang="nb"][@xml:id="id6"][not(preceding-sibling::*)][not(following-sibling::*)]/xi[@attr][@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::pi/upsilon[starts-with(@object,"_b")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::kappa[@abort][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[starts-with(concat(@class,"-"),"content-")][@xml:lang="en-US"][not(preceding-sibling::*)]//rho[@abort][not(following-sibling::*)]//kappa[@false][@xml:lang="en-GB"]/upsilon[@xml:id="id7"][not(following-sibling::*)]//eta[@attribute="this.nodeValue"]/theta[@xml:lang="en-GB"][@xml:id="id8"][not(child::node())][following-sibling::nu[preceding-sibling::*[position() = 1]]//xi[@string][@xml:lang="en-GB"][@xml:id="id9"]/eta[starts-with(@object,"1")][not(following-sibling::*)][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <kappa number="true" xml:id="id1"> <upsilon title="true" xml:lang="en"/> @@ -28378,6 +33258,11 @@ </test> <test> <xpath>//zeta[@false]/mu[contains(@abort,"56789")][@xml:lang="en-US"][not(child::node())][following-sibling::mu[not(following-sibling::*)]//epsilon[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[contains(concat(@string,"$"),"ue$")][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[@attr="_blank"][not(preceding-sibling::*)]//phi[not(child::node())][following-sibling::theta[@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::chi[@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]]/sigma[@xml:lang="nb"][not(child::node())][following-sibling::alpha[@desciption][@xml:id="id5"][preceding-sibling::*[position() = 1]]//xi[contains(concat(@desciption,"$"),"blank$")][@xml:id="id6"][following-sibling::chi[contains(@object,"er")][@xml:lang="en"][@xml:id="id7"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//*[@content][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[contains(@title,"a")][@xml:id="id9"][not(preceding-sibling::*)][not(preceding-sibling::pi)]//nu[@xml:lang="en-GB"][not(preceding-sibling::*)]//xi[@xml:lang="no"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::*[position()=2]][not(child::node())][following-sibling::kappa[@xml:id="id11"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::chi/alpha[@number][@xml:lang="en"][@xml:id="id12"][not(following-sibling::*)]//tau[not(preceding-sibling::*)][not(following-sibling::*)]/theta[@attr="_blank"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <zeta false="content"> <mu abort="123456789" xml:lang="en-US"/> @@ -28420,6 +33305,11 @@ </test> <test> <xpath>//lambda/chi[@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]//delta[not(preceding-sibling::delta or following-sibling::delta)][not(child::node())][following-sibling::omicron[contains(@data,"e")][@xml:lang="en-US"]/gamma/tau[@xml:lang="nb"][@xml:id="id2"]//eta[@number="this-is-att-value"][@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]/zeta[following-sibling::*[position()=2]][not(child::node())][following-sibling::theta[@xml:id="id4"][preceding-sibling::*[position() = 1]][following-sibling::delta[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <lambda> <chi xml:lang="en-US" xml:id="id1"> @@ -28443,6 +33333,11 @@ </test> <test> <xpath>//rho[@xml:id="id1"]/xi[contains(@object,"4")][@xml:lang="no-nb"][not(following-sibling::*)]//chi[@xml:id="id2"]/omega[@xml:lang="nb"][not(following-sibling::*)]//omega[not(child::node())][following-sibling::omicron[contains(concat(@title,"$"),"e$")][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//rho[contains(concat(@string,"$"),"ibute$")][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/iota[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)]/zeta[@xml:lang="no"][@xml:id="id5"]//kappa[@or="true"][@xml:lang="en-US"][not(preceding-sibling::*)]/*[starts-with(concat(@token,"-"),"another attribute value-")][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::gamma[@att="content"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[@xml:id="id6"][not(preceding-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>1</nth> + </result> <tree> <rho xml:id="id1"> <xi object="123456789" xml:lang="no-nb"> @@ -28473,6 +33368,11 @@ </test> <test> <xpath>//eta[@xml:lang="no"]//kappa[@xml:id="id1"][not(following-sibling::*)]/pi[@object][not(following-sibling::*)]//*[@and="true"][@xml:id="id2"]//omega[@title][following-sibling::*[position()=2]][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::lambda[@xml:lang="no"][@xml:id="id3"]//chi[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <eta xml:lang="no"> <kappa xml:id="id1"> @@ -28493,6 +33393,11 @@ </test> <test> <xpath>//*[@xml:id="id1"]//tau[starts-with(concat(@src,"-"),"this-")][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//pi[contains(@delete,"en")][@xml:lang="no-nb"][@xml:id="id3"]/theta[@title="attribute-value"][@xml:id="id4"][not(child::node())][following-sibling::iota[@desciption="another attribute value"][@xml:lang="en-GB"][@xml:id="id5"]//tau[@xml:lang="no"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(preceding-sibling::tau)][following-sibling::omega[@xml:lang="en-GB"]/tau[starts-with(@desciption,"attrib")][@xml:id="id7"]//beta[not(preceding-sibling::*)][not(child::node())][following-sibling::iota[preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][following-sibling::alpha[@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//xi[starts-with(concat(@delete,"-"),"true-")][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:id="id10"][preceding-sibling::*[position() = 1]][following-sibling::alpha[@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[contains(concat(@string,"$"),"nodeValue$")]/tau[@xml:lang="en-US"][@xml:id="id12"][not(following-sibling::*)]//mu[contains(@true,"t")][@xml:id="id13"][not(preceding-sibling::*)]/upsilon[starts-with(concat(@or,"-"),"123456789-")][following-sibling::zeta[@and][@xml:id="id14"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::zeta[@xml:id="id15"]/mu[@xml:lang="en-US"][not(preceding-sibling::*)]/alpha[@true][not(following-sibling::*)]//sigma[@xml:id="id16"][not(preceding-sibling::*)][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <any xml:id="id1"> <tau src="this-is-att-value" xml:lang="en" xml:id="id2"> @@ -28536,6 +33441,11 @@ </test> <test> <xpath>//chi[contains(concat(@number,"$"),"-value$")][@xml:lang="nb"]/rho[@name="100%"][@xml:id="id1"][not(preceding-sibling::rho)]//mu[@attrib][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::upsilon[@xml:id="id3"][preceding-sibling::*[position() = 1]]/pi[starts-with(concat(@false,"-"),"false-")][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[@name="100%"][@xml:lang="en-US"][not(following-sibling::*)]/pi[contains(concat(@attribute,"$"),"value$")][@xml:lang="en-GB"][following-sibling::sigma[contains(concat(@name,"$"),"lid 1px green$")][@xml:lang="en-GB"][@xml:id="id5"][not(following-sibling::*)]/lambda[starts-with(concat(@object,"-"),"123456789-")][@xml:id="id6"][not(preceding-sibling::*)][not(child::node())][following-sibling::phi[@xml:id="id7"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::upsilon[preceding-sibling::*[position() = 2]][following-sibling::lambda[@xml:lang="en-US"][preceding-sibling::*[position() = 3]][following-sibling::nu[contains(@attr,"_blan")][@xml:lang="en"][not(following-sibling::*)]/sigma[contains(concat(@true,"$"),"789$")][@xml:lang="no"][@xml:id="id8"][following-sibling::omega[starts-with(concat(@data,"-"),"attribute value-")][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::omicron[@token="another attribute value"][@xml:id="id9"][not(following-sibling::*)]/mu[@xml:id="id10"][not(preceding-sibling::*)]//beta[@object][@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::*[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//epsilon[starts-with(@and,"another attribute v")][@xml:id="id11"][position() = 1]]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>mu</localname> + <nth>0</nth> + </result> <tree> <chi number="attribute-value" xml:lang="nb"> <rho name="100%" xml:id="id1"> @@ -28572,6 +33482,11 @@ </test> <test> <xpath>//chi[@xml:id="id1"]//eta[@xml:lang="en-GB"][@xml:id="id2"][not(following-sibling::*)]/omega[@desciption]/pi/omicron[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[contains(@true,"ttribute ")][@xml:lang="en"][not(child::node())][following-sibling::psi[@xml:lang="no"][preceding-sibling::*[position() = 2]]//*[following-sibling::mu[contains(@data,"alse")][@xml:lang="no-nb"][@xml:id="id4"][not(child::node())][following-sibling::psi[starts-with(@att,"this.nodeVa")][preceding-sibling::*[position() = 2]]//delta[starts-with(@att,"this-is-att")][not(child::node())][following-sibling::mu[@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[@xml:lang="en-US"][@xml:id="id6"][not(preceding-sibling::*)]/xi[@desciption][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//tau[contains(concat(@attr,"$"),"ue$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::mu[@xml:lang="no-nb"][@xml:id="id8"]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omicron</localname> + <nth>0</nth> + </result> <tree> <chi xml:id="id1"> <eta xml:lang="en-GB" xml:id="id2"> @@ -28604,6 +33519,11 @@ </test> <test> <xpath>//chi[@xml:lang="nb"]//chi[not(child::node())][following-sibling::lambda[contains(concat(@desciption,"$"),"00%$")][@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::iota[starts-with(@desciption,"att")][@xml:lang="en-GB"][@xml:id="id3"]//rho[@abort="attribute value"][@xml:id="id4"][not(preceding-sibling::*)]/psi[following-sibling::*[position()=1]][following-sibling::upsilon[@data][@xml:id="id5"][preceding-sibling::*[position() = 1]]//sigma[contains(@false,"n")][@xml:id="id6"][following-sibling::theta[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/theta[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::eta[contains(@and,"nt")][@xml:id="id8"][preceding-sibling::*[position() = 1]][following-sibling::alpha[starts-with(concat(@src,"-"),"attribute-")][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::tau[contains(concat(@and,"$"),"blank$")][preceding-sibling::*[position() = 3]]/nu[@xml:lang="en"][@xml:id="id9"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::iota[@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::nu[@insert="attribute value"][@xml:id="id11"][preceding-sibling::*[position() = 2]]//psi[starts-with(@false,"c")][@xml:lang="no"][@xml:id="id12"]][position() = 1]]][position() = 1]]]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>1</nth> + </result> <tree> <chi xml:lang="nb"> <chi/> @@ -28636,6 +33556,11 @@ </test> <test> <xpath>//epsilon[contains(@desciption,"te-valu")][@xml:lang="no"][@xml:id="id1"]/alpha[@xml:lang="en-US"][not(child::node())][following-sibling::alpha[starts-with(concat(@insert,"-"),"content-")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@attribute="attribute-value"][@xml:id="id2"][following-sibling::*[position()=1]][not(child::node())][following-sibling::epsilon[starts-with(@insert,"another attribute va")][@xml:id="id3"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//sigma[@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/tau[following-sibling::upsilon[@delete="this.nodeValue"][@xml:lang="en-US"][@xml:id="id4"]//nu[not(preceding-sibling::nu)]//pi[starts-with(concat(@object,"-"),"attribute value-")][@xml:lang="en-GB"]//*[not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="nb"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <epsilon desciption="attribute-value" xml:lang="no" xml:id="id1"> <alpha xml:lang="en-US"/> @@ -28662,6 +33587,11 @@ </test> <test> <xpath>//beta[@xml:lang="no-nb"][@xml:id="id1"]//beta[starts-with(concat(@true,"-"),"this-")][@xml:lang="en-US"][@xml:id="id2"][following-sibling::zeta[@xml:id="id3"][preceding-sibling::*[position() = 1]]//eta[@xml:lang="no"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::tau[@attribute="true"][@xml:lang="en-GB"][@xml:id="id4"][preceding-sibling::*[position() = 1]]//alpha[@data][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::tau[@xml:id="id6"][following-sibling::*[starts-with(concat(@insert,"-"),"this.nodeValue-")][not(child::node())][following-sibling::eta[starts-with(@desciption,"true")][@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::chi[starts-with(@false,"fa")][@xml:lang="en-US"][@xml:id="id8"][not(following-sibling::*)]/eta[@xml:lang="no"][@xml:id="id9"][not(following-sibling::*)]//pi[@string][@xml:lang="en"][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@xml:lang="en-US"][@xml:id="id10"]/delta[@xml:lang="no-nb"]/phi[following-sibling::iota[starts-with(concat(@insert,"-"),"123456789-")][@xml:lang="en"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::pi[contains(@string,"lse")][@xml:lang="no"][not(child::node())][following-sibling::nu[contains(@string,"ribute-value")][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::upsilon[@true][@xml:id="id11"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]//zeta[starts-with(concat(@string,"-"),"this.nodeValue-")][not(preceding-sibling::*)]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>1</nth> + </result> <tree> <beta xml:lang="no-nb" xml:id="id1"> <beta true="this-is-att-value" xml:lang="en-US" xml:id="id2"/> @@ -28697,6 +33627,11 @@ </test> <test> <xpath>//tau[@xml:lang="nb"]//gamma[contains(concat(@string,"$"),"_blank$")][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/sigma[following-sibling::pi[following-sibling::*[position()=3]][not(child::node())][following-sibling::tau[@xml:id="id2"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=2]][following-sibling::lambda[@xml:id="id3"][following-sibling::rho[@name][@xml:lang="en"]/iota[@or="content"][@xml:lang="nb"][@xml:id="id4"][not(following-sibling::*)]//iota[@xml:id="id5"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::nu[@src][@xml:lang="no-nb"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>sigma</localname> + <nth>0</nth> + </result> <tree> <tau xml:lang="nb"> <gamma string="_blank" xml:id="id1"> @@ -28718,6 +33653,11 @@ </test> <test> <xpath>//nu[@desciption]//chi[@xml:id="id1"][not(preceding-sibling::*)][not(child::node())][following-sibling::omega[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/mu[@xml:lang="no-nb"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]/beta[starts-with(@att,"another attribute v")][not(child::node())][following-sibling::sigma[not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>chi</localname> + <nth>0</nth> + </result> <tree> <nu desciption="attribute value"> <chi xml:id="id1"/> @@ -28734,6 +33674,11 @@ </test> <test> <xpath>//iota/eta[@class="attribute-value"][@xml:lang="nb"][@xml:id="id1"]/alpha[@class="true"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[contains(@desciption,"%")][@xml:id="id3"][not(preceding-sibling::*)]/rho[@title][@xml:lang="nb"][not(child::node())][following-sibling::chi[@and="false"][@xml:id="id4"][not(child::node())][following-sibling::rho[@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/*[@content][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:lang="nb"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/tau[starts-with(@class,"c")][not(child::node())][following-sibling::tau[@name="this-is-att-value"][not(child::node())][following-sibling::delta[@xml:lang="nb"][@xml:id="id6"][following-sibling::alpha[@xml:lang="nb"][@xml:id="id7"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]//omega[@xml:id="id8"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[contains(@false,"ue")][@xml:lang="en-US"][@xml:id="id9"]/lambda[@insert][@xml:id="id10"]/*[@desciption="true"][@xml:lang="en-US"][@xml:id="id11"][not(following-sibling::*)]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <iota> <eta class="attribute-value" xml:lang="nb" xml:id="id1"> @@ -28768,6 +33713,11 @@ </test> <test> <xpath>//gamma/rho[following-sibling::*[position()=1]][not(child::node())][following-sibling::psi/mu[@xml:lang="en"][@xml:id="id1"][not(preceding-sibling::*)]/omicron[@xml:id="id2"][not(following-sibling::*)]//pi[@class][@xml:lang="en"][not(following-sibling::pi)][following-sibling::eta[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=2]][following-sibling::lambda[not(child::node())][following-sibling::chi[@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][not(following-sibling::*)][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>rho</localname> + <nth>0</nth> + </result> <tree> <gamma> <rho/> @@ -28788,6 +33738,11 @@ </test> <test> <xpath>//theta//beta[@xml:lang="en"][not(child::node())][following-sibling::iota[@number][not(preceding-sibling::iota)][following-sibling::chi[@src][@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]/rho[not(preceding-sibling::*)][following-sibling::delta[@xml:lang="no"][@xml:id="id2"][preceding-sibling::*[position() = 1]][following-sibling::mu[contains(concat(@data,"$"),"ank$")][@xml:lang="en"][@xml:id="id3"][not(child::node())][following-sibling::pi[@xml:lang="en"][following-sibling::theta[@abort="_blank"][@xml:lang="en-US"][@xml:id="id4"][preceding-sibling::*[position() = 4]][not(following-sibling::*)]/omicron[starts-with(@title,"fals")][not(preceding-sibling::*)][following-sibling::alpha[starts-with(@title,"attribute-v")][not(following-sibling::*)]/sigma[@attribute][@xml:id="id5"][following-sibling::pi[@xml:lang="en-GB"][not(child::node())][following-sibling::kappa[@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(child::node())][following-sibling::kappa[not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 4]][following-sibling::*[position()=1]][following-sibling::*[@xml:id="id6"][preceding-sibling::*[position() = 5]]/lambda[contains(concat(@false,"$"),"alue$")][@xml:lang="nb"][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::delta[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/alpha[@xml:id="id8"][not(parent::*/*[position()=2])]//lambda[@xml:lang="no-nb"][@xml:id="id9"][not(child::node())][following-sibling::tau[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/phi[position() = 1]]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>beta</localname> + <nth>0</nth> + </result> <tree> <theta> <beta xml:lang="en"/> @@ -28826,6 +33781,11 @@ </test> <test> <xpath>//mu[starts-with(@data,"attribut")]/epsilon[@xml:lang="nb"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::eta[contains(@attr,"ank")][not(child::node())][following-sibling::gamma[starts-with(concat(@string,"-"),"attribute-")][@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/eta[@delete][@xml:lang="en"][@xml:id="id3"][following-sibling::*[@content][@xml:lang="nb"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=3]][following-sibling::beta[@desciption][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::epsilon[contains(concat(@token,"$"),"een$")][@xml:lang="en"][preceding-sibling::*[position() = 3]][following-sibling::alpha[@att][@xml:lang="no-nb"][@xml:id="id5"][not(following-sibling::*)][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>epsilon</localname> + <nth>0</nth> + </result> <tree> <mu data="attribute value"> <epsilon xml:lang="nb" xml:id="id1"/> @@ -28844,6 +33804,11 @@ </test> <test> <xpath>//kappa[@delete][@xml:lang="en-GB"]//epsilon[@xml:lang="no"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/eta[@xml:lang="en-GB"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::*[@false][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/nu[@desciption="false"][not(preceding-sibling::*)]/pi[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::beta//theta[starts-with(concat(@content,"-"),"attribute-")][@xml:lang="no"][@xml:id="id5"][not(child::node())][following-sibling::sigma[starts-with(concat(@desciption,"-"),"this-")][@xml:lang="nb"][@xml:id="id6"][not(following-sibling::*)]/nu[@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)][not(preceding-sibling::nu)]//gamma[starts-with(concat(@attrib,"-"),"this.nodeValue-")][@xml:id="id8"]//theta[contains(@title,"ue")][@xml:id="id9"][following-sibling::*[position()=1]][following-sibling::kappa[preceding-sibling::*[position() = 1]][not(following-sibling::*)]//sigma[@xml:lang="no-nb"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::omicron[starts-with(@token,"soli")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::rho[@xml:lang="no"][preceding-sibling::*[position() = 2]]/mu[contains(@src,"e")][@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]]]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <kappa delete="100%" xml:lang="en-GB"> <epsilon xml:lang="no" xml:id="id1"> @@ -28880,6 +33845,11 @@ </test> <test> <xpath>//nu[@xml:lang="nb"]/eta[@xml:id="id1"]/*[@object][@xml:lang="en-US"][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[contains(concat(@abort,"$"),"bute value$")][@xml:lang="nb"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omicron[@xml:lang="no"][@xml:id="id2"][following-sibling::*[position()=1]][following-sibling::epsilon[contains(@object,"t")][preceding-sibling::*[position() = 2]]//upsilon[@xml:lang="en-US"][@xml:id="id3"]//mu[@xml:lang="nb"][following-sibling::epsilon[preceding-sibling::*[position() = 1]][not(following-sibling::*)]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <nu xml:lang="nb"> <eta xml:id="id1"> @@ -28901,6 +33871,11 @@ </test> <test> <xpath>//phi[contains(concat(@string,"$"),"e$")][@xml:lang="en"][@xml:id="id1"]//iota[@xml:lang="en-US"]//upsilon[contains(concat(@string,"$"),"bute value$")][@xml:lang="en-US"][@xml:id="id2"]//nu[@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::omicron[contains(concat(@insert,"$"),"content$")][@xml:lang="en"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//chi[@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <phi string="false" xml:lang="en" xml:id="id1"> <iota xml:lang="en-US"> @@ -28919,6 +33894,11 @@ </test> <test> <xpath>//xi[@delete]//theta[@xml:id="id1"][following-sibling::beta[@xml:lang="en-GB"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/upsilon[@content][following-sibling::omega[@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::*[position()=1]][not(child::node())][following-sibling::pi[@token][@xml:id="id4"][not(following-sibling::*)]/gamma[@xml:lang="en"][not(preceding-sibling::*)]/gamma[@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[@xml:lang="en"]/rho[@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::beta[contains(@src,"-is")][@xml:id="id6"][preceding-sibling::*[position() = 1]]//*[starts-with(concat(@src,"-"),"another attribute value-")][@xml:id="id7"][not(following-sibling::*)]//rho[not(following-sibling::*)]/mu[contains(@attribute,"tr")][@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]/theta[starts-with(concat(@title,"-"),"_blank-")][@xml:id="id9"][not(child::node())][following-sibling::rho[@xml:id="id10"][preceding-sibling::*[position() = 1]]//xi[starts-with(concat(@and,"-"),"true-")][not(preceding-sibling::*)][following-sibling::omicron[@content][not(child::node())][following-sibling::theta[@xml:lang="nb"][@xml:id="id11"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//upsilon[@class="attribute"][following-sibling::zeta//eta[@name="true"][@xml:lang="en-GB"][@xml:id="id12"][following-sibling::beta[starts-with(@abort,"attribu")][@xml:id="id13"][not(child::node())][following-sibling::gamma[starts-with(concat(@title,"-"),"solid 1px green-")][@xml:lang="no-nb"][@xml:id="id14"][preceding-sibling::*[position() = 2]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>theta</localname> + <nth>0</nth> + </result> <tree> <xi delete="attribute-value"> <theta xml:id="id1"/> @@ -28962,6 +33942,11 @@ </test> <test> <xpath>//lambda[starts-with(concat(@content,"-"),"this.nodeValue-")]//psi[@xml:lang="no"]/kappa[following-sibling::*[position()=3]][not(child::node())][following-sibling::omega[@xml:lang="en-GB"][@xml:id="id1"][preceding-sibling::*[position() = 1]][following-sibling::pi[@attrib="another attribute value"][@xml:id="id2"][following-sibling::iota[@xml:lang="nb"][@xml:id="id3"][not(following-sibling::*)]//mu[contains(concat(@content,"$"),"reen$")][@xml:lang="en-US"][@xml:id="id4"][following-sibling::gamma[@false]/rho[@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 1]][following-sibling::kappa[@xml:id="id6"][following-sibling::eta[@content="another attribute value"][@xml:lang="nb"][@xml:id="id7"][not(following-sibling::*)]/upsilon[@token="attribute value"][@xml:lang="nb"][not(child::node())][following-sibling::lambda[@true][@xml:id="id8"][not(following-sibling::*)]//theta[starts-with(@or,"_blan")]//psi[@xml:lang="en-US"][not(following-sibling::*)]//upsilon[@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::upsilon[starts-with(@object,"1234567")][@xml:lang="en-US"][@xml:id="id9"][not(following-sibling::*)]//mu[@xml:id="id10"][not(following-sibling::*)]/omega[@xml:id="id11"]]][position() = 1]]]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <lambda content="this.nodeValue"> <psi xml:lang="no"> @@ -28999,6 +33984,11 @@ </test> <test> <xpath>//upsilon[@xml:lang="en-US"][@xml:id="id1"]//nu[not(child::node())][following-sibling::psi[@xml:id="id2"][not(following-sibling::*)]/nu[@abort="_blank"][not(preceding-sibling::*)][following-sibling::iota[@delete][@xml:id="id3"][following-sibling::*[position()=2]][not(child::node())][following-sibling::phi[@xml:lang="nb"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::xi[@false][@xml:lang="no"]//upsilon[contains(concat(@src,"$"),"attribute-value$")][@xml:lang="en-US"][not(preceding-sibling::*)]//eta[@true][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:lang="en-GB"][not(preceding-sibling::*)][not(following-sibling::*)]//alpha[@false][@xml:id="id4"]//*[@string][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(concat(@insert,"$"),"rue$")][@xml:lang="nb"][not(child::node())][following-sibling::rho//nu[@xml:lang="nb"][not(preceding-sibling::*)]//delta[starts-with(concat(@attrib,"-"),"true-")][@xml:id="id5"][following-sibling::*[position()=1]][following-sibling::phi[@xml:lang="en-US"][@xml:id="id6"]//nu[starts-with(concat(@src,"-"),"attribute-")][@xml:lang="en-GB"][following-sibling::*[position()=1]][not(child::node())][following-sibling::gamma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[@xml:lang="en"][not(child::node())][following-sibling::xi[@xml:lang="en-GB"][@xml:id="id7"][not(following-sibling::*)]/omicron[contains(concat(@attribute,"$"),"ribute-value$")][@xml:lang="no-nb"][not(preceding-sibling::*)][not(following-sibling::*)]]]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>nu</localname> + <nth>0</nth> + </result> <tree> <upsilon xml:lang="en-US" xml:id="id1"> <nu/> @@ -29040,6 +34030,11 @@ </test> <test> <xpath>//tau[@insert][@xml:id="id1"]/delta[@xml:lang="no"][not(preceding-sibling::*)][not(child::node())][following-sibling::tau[starts-with(@token,"_bla")][@xml:id="id2"][not(following-sibling::*)]//kappa[@xml:lang="no"][not(preceding-sibling::*)]//gamma[following-sibling::*[position()=2]][not(preceding-sibling::gamma)][not(child::node())][following-sibling::chi[@delete][@xml:id="id3"][preceding-sibling::*[position() = 1]][following-sibling::chi[@delete][@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/pi[@xml:lang="en-US"][@xml:id="id5"][not(following-sibling::*)]//xi[@data][not(preceding-sibling::*)]/lambda[@att][@xml:lang="no"][@xml:id="id6"][not(following-sibling::*)]/theta[@object][@xml:lang="en-GB"]//sigma[starts-with(concat(@string,"-"),"another attribute value-")][not(following-sibling::*)]/upsilon[@xml:id="id7"][not(following-sibling::*)][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <tau insert="this-is-att-value" xml:id="id1"> <delta xml:lang="no"/> @@ -29069,6 +34064,11 @@ </test> <test> <xpath>//iota[@xml:id="id1"]//nu[contains(@abort,"v")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)]/delta[@xml:lang="no-nb"]//epsilon[@src="123456789"][@xml:lang="en-GB"][@xml:id="id3"]//iota[@xml:lang="en-US"][@xml:id="id4"]/pi[starts-with(@abort,"fa")][@xml:lang="no-nb"]/upsilon</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <iota xml:id="id1"> <nu abort="attribute-value" xml:lang="no-nb" xml:id="id2"> @@ -29089,6 +34089,11 @@ </test> <test> <xpath>//sigma[@xml:lang="en-US"]/epsilon[@src][@xml:lang="en-GB"][@xml:id="id1"][not(preceding-sibling::*)][not(following-sibling::*)]/psi[@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//upsilon[@desciption][@xml:id="id3"][not(preceding-sibling::*)]//gamma[@xml:lang="no"][following-sibling::pi[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::beta[@xml:lang="no-nb"][@xml:id="id4"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=3]][not(child::node())][following-sibling::sigma[contains(concat(@name,"$"),"3456789$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 3]][following-sibling::mu[starts-with(@attribute,"attribute v")][@xml:lang="en"][@xml:id="id5"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::theta[@xml:id="id6"][not(following-sibling::*)]/alpha[@number][@xml:id="id7"][following-sibling::*[position()=1]][following-sibling::rho[@xml:lang="no"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/psi[@xml:id="id8"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@xml:lang="en"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@xml:id="id9"][not(following-sibling::*)]/phi[@xml:lang="nb"]/phi[@xml:lang="en"][not(following-sibling::*)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <sigma xml:lang="en-US"> <epsilon src="false" xml:lang="en-GB" xml:id="id1"> @@ -29123,6 +34128,11 @@ </test> <test> <xpath>//beta[starts-with(concat(@class,"-"),"100%-")][@xml:lang="en-GB"][@xml:id="id1"]/alpha[@xml:id="id2"][not(preceding-sibling::*)]/gamma[contains(@attrib,"t")][following-sibling::*[position()=1]][following-sibling::xi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]//*[@xml:id="id3"]/nu[@xml:id="id4"][following-sibling::*[position()=5]][following-sibling::rho[@content][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@xml:lang="nb"][following-sibling::*[position()=3]][not(child::node())][following-sibling::iota[starts-with(@desciption,"fal")][@xml:id="id6"][preceding-sibling::*[position() = 3]][following-sibling::tau[@attribute][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::kappa[starts-with(@or,"anothe")][@xml:lang="no"][preceding-sibling::*[position() = 5]]//chi[contains(@attr,"0")][@xml:lang="en-US"]/eta[starts-with(concat(@attr,"-"),"this.nodeValue-")][not(preceding-sibling::*)][not(following-sibling::*)]/zeta[not(following-sibling::*)]/gamma[@xml:lang="no-nb"][@xml:id="id7"][following-sibling::upsilon[preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/iota[starts-with(@insert,"attr")][@xml:lang="nb"][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@xml:lang="no"][@xml:id="id10"][following-sibling::psi[@xml:lang="no"][@xml:id="id11"][preceding-sibling::*[position() = 1]]//nu[@abort][@xml:id="id12"][not(preceding-sibling::*)][not(child::node())][following-sibling::rho[@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::pi[@src][@xml:lang="nb"][position() = 1]][position() = 1]]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <beta class="100%" xml:lang="en-GB" xml:id="id1"> <alpha xml:id="id2"> @@ -29164,6 +34174,11 @@ </test> <test> <xpath>//zeta[@attribute][@xml:lang="en-GB"][@xml:id="id1"]/lambda[@token][@xml:lang="no-nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::*[@xml:lang="no-nb"][not(child::node())][following-sibling::delta[contains(concat(@class,"$"),"56789$")][@xml:lang="en-GB"]//zeta[@xml:lang="en-US"][@xml:id="id2"][following-sibling::eta[not(child::node())][following-sibling::lambda[starts-with(concat(@data,"-"),"solid 1px green-")][@xml:lang="no-nb"][preceding-sibling::*[position() = 2]][following-sibling::omicron[starts-with(concat(@desciption,"-"),"123456789-")][following-sibling::omicron[@false][@xml:id="id3"][not(child::node())][following-sibling::omega[@xml:id="id4"][preceding-sibling::*[position() = 5]][following-sibling::zeta[@xml:lang="en-GB"][@xml:id="id5"][not(child::node())][following-sibling::zeta[@xml:lang="no-nb"]/omega[@xml:lang="no-nb"][not(child::node())][following-sibling::chi[not(following-sibling::*)]]][position() = 1]]][position() = 1]]]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>lambda</localname> + <nth>0</nth> + </result> <tree> <zeta attribute="100%" xml:lang="en-GB" xml:id="id1"> <lambda token="attribute value" xml:lang="no-nb"/> @@ -29188,6 +34203,11 @@ </test> <test> <xpath>//theta[@xml:lang="nb"][@xml:id="id1"]/zeta[@xml:lang="no-nb"][@xml:id="id2"]/beta[@object][not(following-sibling::beta)]//phi[@desciption][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//kappa[@xml:lang="en-US"][@xml:id="id4"][not(preceding-sibling::*)][not(child::node())][following-sibling::delta[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::mu[@xml:lang="en"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]/upsilon[@xml:lang="no-nb"][@xml:id="id6"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::sigma[contains(concat(@token,"$"),"olid 1px green$")][@xml:id="id7"]//omega[@content="this.nodeValue"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[starts-with(@insert,"fa")][@xml:lang="no"][following-sibling::pi[contains(@src,"nk")][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <theta xml:lang="nb" xml:id="id1"> <zeta xml:lang="no-nb" xml:id="id2"> @@ -29214,6 +34234,11 @@ </test> <test> <xpath>//omega//kappa[not(preceding-sibling::*)][not(child::node())][following-sibling::iota[@xml:id="id1"][not(child::node())][following-sibling::upsilon[@xml:lang="en-GB"][not(following-sibling::*)]/zeta[@xml:lang="en-GB"][@xml:id="id2"][not(child::node())][following-sibling::phi[starts-with(@name,"12345")][@xml:lang="no-nb"][@xml:id="id3"][not(following-sibling::*)]//xi[@xml:lang="en-GB"][@xml:id="id4"][not(child::node())][following-sibling::lambda[@xml:id="id5"]//kappa[contains(concat(@abort,"$"),"e$")][@xml:lang="no-nb"][not(preceding-sibling::kappa)][following-sibling::xi[@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/delta[@xml:id="id7"][following-sibling::lambda[@attrib][@xml:id="id8"][preceding-sibling::*[position() = 1]]//psi[@xml:id="id9"]//tau[starts-with(@delete,"1234")][@xml:lang="en"][@xml:id="id10"][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="no-nb"][@xml:id="id11"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//kappa[@src][not(preceding-sibling::*)]//rho[@xml:id="id12"][not(preceding-sibling::*)]]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <omega> <kappa/> @@ -29247,6 +34272,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="nb"]//zeta[@object="content"][@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::tau[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/rho[@xml:id="id2"][not(preceding-sibling::*)]/omicron[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::lambda[not(following-sibling::*)]/eta[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="no"][@xml:id="id4"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::rho[@xml:lang="en-US"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>zeta</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="nb"> <zeta object="content" xml:id="id1"/> @@ -29266,6 +34296,11 @@ </test> <test> <xpath>//*[@xml:id="id1"]//xi[starts-with(concat(@insert,"-"),"content-")][@xml:lang="en"][not(preceding-sibling::*)]/iota[contains(concat(@true,"$"),"blank$")][@xml:id="id2"][not(child::node())][following-sibling::mu[@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::mu)]//sigma[@xml:lang="en-US"][@xml:id="id4"][not(following-sibling::*)]/epsilon[@xml:lang="no-nb"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::pi[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <any xml:id="id1"> <xi insert="content" xml:lang="en"> @@ -29284,6 +34319,11 @@ </test> <test> <xpath>//kappa[@xml:lang="en-US"]//lambda[contains(@att,"k")][@xml:lang="en-US"][not(preceding-sibling::*)]//gamma[not(preceding-sibling::*)][not(child::node())][following-sibling::theta[contains(@class,"ue")][@xml:lang="en-US"][@xml:id="id1"][not(following-sibling::*)]//iota[contains(@data,"00%")][@xml:id="id2"][not(preceding-sibling::*)][not(following-sibling::*)]//omega[contains(@src,"nk")][@xml:id="id3"]/beta[@attribute="solid 1px green"][not(following-sibling::*)]//phi[@desciption][@xml:id="id4"][not(preceding-sibling::*)][not(following-sibling::*)]//psi[@xml:lang="nb"][not(preceding-sibling::*)][not(child::node())][following-sibling::sigma[contains(concat(@false,"$"),"te-value$")][@xml:lang="en-US"][following-sibling::theta[@att][not(following-sibling::*)]//iota[contains(concat(@false,"$"),"e$")][@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>gamma</localname> + <nth>0</nth> + </result> <tree> <kappa xml:lang="en-US"> <lambda att="_blank" xml:lang="en-US"> @@ -29311,6 +34351,11 @@ </test> <test> <xpath>//xi[contains(concat(@att,"$"),"rue$")][@xml:lang="en-US"][@xml:id="id1"]//omega[@xml:id="id2"][not(preceding-sibling::*)][following-sibling::lambda[@and][preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][not(child::node())][following-sibling::sigma[@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::phi[starts-with(concat(@attr,"-"),"attribute-")][@xml:id="id4"][following-sibling::*[position()=3]][not(child::node())][following-sibling::nu[@xml:lang="en"][following-sibling::*[position()=2]][following-sibling::zeta[@desciption="attribute value"][@xml:id="id5"][not(child::node())][following-sibling::zeta[@token][@xml:lang="no-nb"][@xml:id="id6"][not(following-sibling::*)]//mu[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][following-sibling::tau[@xml:lang="en-GB"][@xml:id="id8"][following-sibling::*[position()=1]][following-sibling::omega[@xml:lang="nb"][@xml:id="id9"][preceding-sibling::*[position() = 2]]//xi[contains(@or,"true")][@xml:id="id10"][following-sibling::*[position()=1]][following-sibling::upsilon[@att][@xml:lang="no"][@xml:id="id11"][not(following-sibling::*)][position() = 1]][position() = 1]][position() = 1]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <xi att="true" xml:lang="en-US" xml:id="id1"> <omega xml:id="id2"/> @@ -29334,6 +34379,11 @@ </test> <test> <xpath>//omega[@xml:id="id1"]//pi[contains(concat(@true,"$"),"ribute value$")][@xml:id="id2"][following-sibling::*[position()=2]][following-sibling::nu[@xml:lang="en-US"][@xml:id="id3"][not(child::node())][following-sibling::omicron[starts-with(@true,"attribute")][@xml:lang="en-GB"][not(following-sibling::*)]//psi[contains(@title,"e")][@xml:lang="en"][@xml:id="id4"][not(child::node())][following-sibling::lambda[@attribute][@xml:id="id5"][preceding-sibling::*[position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>pi</localname> + <nth>0</nth> + </result> <tree> <omega xml:id="id1"> <pi true="attribute value" xml:id="id2"/> @@ -29349,6 +34399,11 @@ </test> <test> <xpath>//kappa[@xml:id="id1"]//beta[@attribute][@xml:lang="en"][@xml:id="id2"][not(preceding-sibling::*)]//mu[starts-with(concat(@desciption,"-"),"true-")][not(preceding-sibling::*)][not(following-sibling::*)]/alpha[starts-with(concat(@insert,"-"),"true-")][@xml:lang="no"][@xml:id="id3"][following-sibling::upsilon[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]/zeta[@data="_blank"][@xml:lang="no-nb"][@xml:id="id5"]/psi[contains(concat(@attribute,"$"),"bute$")][@xml:lang="en-US"][@xml:id="id6"][following-sibling::omega[not(following-sibling::*)]//*[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::iota/zeta[@number="true"][@xml:lang="no"][@xml:id="id8"][not(following-sibling::*)]/xi[@xml:lang="no-nb"][@xml:id="id9"][not(child::node())][following-sibling::eta[@token][@xml:lang="en-US"][@xml:id="id10"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][position() = 1]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <kappa xml:id="id1"> <beta attribute="attribute value" xml:lang="en" xml:id="id2"> @@ -29377,6 +34432,11 @@ </test> <test> <xpath>//nu[@xml:id="id1"]//tau[@class][@xml:lang="en"][not(preceding-sibling::*)]//alpha[following-sibling::alpha[contains(concat(@true,"$"),"tribute value$")][@xml:id="id2"][not(child::node())][following-sibling::alpha[@insert][preceding-sibling::*[position() = 2]][following-sibling::mu[not(following-sibling::*)]/*[starts-with(concat(@title,"-"),"true-")][@xml:lang="en"][not(following-sibling::*)]/theta[starts-with(concat(@object,"-"),"attribute-")][not(preceding-sibling::*)]/psi[not(child::node())][following-sibling::xi[@false][@xml:lang="en"][@xml:id="id3"][preceding-sibling::*[position() = 1]]//zeta[@or][@xml:lang="en-US"]//tau[@and="true"][not(following-sibling::*)]/gamma[starts-with(@token,"f")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::sigma[contains(@false,"9")][following-sibling::kappa[@xml:lang="nb"][not(following-sibling::*)]/eta[@xml:lang="no"][@xml:id="id4"]/delta[@xml:lang="no"][@xml:id="id5"][not(preceding-sibling::*)]//tau[contains(@insert,"bute value")][@xml:lang="en-GB"][not(following-sibling::*)]/eta[@content][@xml:lang="en"][@xml:id="id6"]][position() = 1]][position() = 1]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>alpha</localname> + <nth>0</nth> + </result> <tree> <nu xml:id="id1"> <tau class="attribute-value" xml:lang="en"> @@ -29415,6 +34475,11 @@ </test> <test> <xpath>//kappa/kappa[not(preceding-sibling::*)]//iota[contains(@src,"od")][@xml:id="id1"][not(preceding-sibling::*)]//omicron[@false][@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)]/omega[@src="attribute value"][@xml:id="id3"][not(preceding-sibling::*)][not(following-sibling::*)]//beta[@content="this-is-att-value"][@xml:lang="en"][@xml:id="id4"][not(preceding-sibling::*)]/beta[contains(concat(@attrib,"$"),"e$")][@xml:lang="nb"][not(following-sibling::*)]//nu[not(following-sibling::*)]/alpha[@xml:lang="nb"][@xml:id="id5"][not(following-sibling::*)]/*[@att][@xml:id="id6"][not(preceding-sibling::*)]//delta[@xml:lang="en-GB"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]//xi[@object][@xml:lang="en-US"][not(preceding-sibling::*)][not(child::node())][following-sibling::psi[@name="solid 1px green"][@xml:lang="nb"]//chi[@xml:id="id8"][not(following-sibling::*)]//delta[@xml:lang="en"][@xml:id="id9"][following-sibling::gamma[contains(concat(@att,"$"),"attribute$")][@xml:lang="no-nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//alpha[contains(concat(@insert,"$"),"nk$")][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <kappa> <kappa> @@ -29453,6 +34518,11 @@ </test> <test> <xpath>//epsilon[@xml:lang="no"][@xml:id="id1"]/*[contains(concat(@attrib,"$"),"rue$")][not(following-sibling::*)]//psi//xi[@xml:lang="no"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=1]][following-sibling::zeta[@insert="attribute"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//eta[@xml:id="id4"][not(preceding-sibling::*)][following-sibling::pi[@xml:lang="en"]/*[starts-with(@attrib,"this.nodeValue")][@xml:lang="en-GB"][@xml:id="id5"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <epsilon xml:lang="no" xml:id="id1"> <any attrib="true"> @@ -29473,6 +34543,11 @@ </test> <test> <xpath>//omicron[contains(concat(@content,"$"),"tribute value$")][@xml:id="id1"]/lambda[@xml:id="id2"][not(preceding-sibling::*)]/mu[@xml:lang="nb"][not(following-sibling::*)]//theta[@xml:lang="nb"][not(preceding-sibling::*)][not(following-sibling::*)]//kappa[@delete][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::kappa[@xml:id="id4"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <omicron content="another attribute value" xml:id="id1"> <lambda xml:id="id2"> @@ -29490,6 +34565,11 @@ </test> <test> <xpath>//zeta[@desciption][@xml:lang="no-nb"][@xml:id="id1"]/tau[@xml:lang="en-US"][@xml:id="id2"][not(preceding-sibling::*)][not(child::node())][following-sibling::eta[@xml:lang="no"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::tau[contains(@data,"lank")]//upsilon[@xml:id="id4"][not(following-sibling::*)]/omega[@xml:lang="en"][@xml:id="id5"][not(preceding-sibling::*)][following-sibling::alpha[@xml:lang="en-US"][@xml:id="id6"][following-sibling::*[position()=2]][following-sibling::phi[@xml:id="id7"][preceding-sibling::*[position() = 2]][following-sibling::*[position()=1]][following-sibling::omega[contains(concat(@title,"$"),"3456789$")][@xml:lang="no"][@xml:id="id8"][preceding-sibling::*[position() = 3]][not(following-sibling::*)]/alpha[@xml:id="id9"][not(following-sibling::*)]/psi[@delete="this-is-att-value"][@xml:lang="no"][not(preceding-sibling::*)]//chi[@attrib="123456789"][not(child::node())][following-sibling::epsilon[@xml:lang="no-nb"][@xml:id="id10"][preceding-sibling::*[position() = 1]]//omicron[contains(@attr,"e")][not(preceding-sibling::*)][not(following-sibling::*)]//chi[contains(@token,"89")]/psi[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::delta[@xml:lang="en-GB"][@xml:id="id11"]//alpha[@attr]/epsilon[@attr][@xml:id="id12"][not(following-sibling::*)]//omega[starts-with(concat(@content,"-"),"123456789-")][@xml:id="id13"][following-sibling::*[position()=2]][following-sibling::gamma[@xml:lang="no"][not(child::node())][following-sibling::iota[@xml:lang="no-nb"][not(following-sibling::*)]/xi[@att="_blank"][@xml:lang="en-GB"][@xml:id="id14"][not(preceding-sibling::*)]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>tau</localname> + <nth>0</nth> + </result> <tree> <zeta desciption="solid 1px green" xml:lang="no-nb" xml:id="id1"> <tau xml:lang="en-US" xml:id="id2"/> @@ -29533,6 +34613,11 @@ </test> <test> <xpath>//mu[@abort]/eta[@xml:id="id1"][not(preceding-sibling::*)][following-sibling::*[position()=2]][following-sibling::omega[@data][following-sibling::*[position()=1]][not(child::node())][following-sibling::*[@xml:id="id2"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//tau[@class="attribute-value"][@xml:lang="en-US"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::pi[@delete="123456789"][@xml:lang="nb"][@xml:id="id4"][preceding-sibling::*[position() = 1]]/tau[@xml:lang="en-US"][@xml:id="id5"]/delta[@xml:lang="nb"][@xml:id="id6"]/beta[@xml:lang="no"][@xml:id="id7"][not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[preceding-sibling::*[position() = 1]]/xi[@xml:id="id8"][not(preceding-sibling::*)]//xi[contains(concat(@abort,"$"),"solid 1px green$")][@xml:lang="no"][@xml:id="id9"][following-sibling::*[position()=4]][not(preceding-sibling::xi)][not(child::node())][following-sibling::psi[@insert][following-sibling::*[position()=3]][not(child::node())][following-sibling::nu[@string][not(child::node())][following-sibling::gamma[starts-with(concat(@number,"-"),"_blank-")][@xml:lang="en-US"][@xml:id="id10"][not(child::node())][following-sibling::phi[preceding-sibling::*[position() = 4]][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>eta</localname> + <nth>0</nth> + </result> <tree> <mu abort="_blank"> <eta xml:id="id1"/> @@ -29563,6 +34648,11 @@ </test> <test> <xpath>//omega/xi[@attrib][@xml:lang="nb"][@xml:id="id1"][not(following-sibling::*)]/mu[not(preceding-sibling::*)][not(following-sibling::*)]//pi[starts-with(@attr,"_b")][@xml:id="id2"][not(following-sibling::*)]/upsilon[starts-with(concat(@attr,"-"),"attribute-")][@xml:lang="en-US"][not(preceding-sibling::*)][following-sibling::tau[@false="content"][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//phi[@xml:lang="en"][@xml:id="id4"][following-sibling::*[position()=1]][following-sibling::mu[@xml:id="id5"][preceding-sibling::*[position() = 1]]//sigma[@xml:lang="no"][@xml:id="id6"]//pi[@token][@xml:id="id7"][following-sibling::iota[starts-with(concat(@attrib,"-"),"false-")][@xml:lang="en"][@xml:id="id8"][following-sibling::zeta/kappa[@name][@xml:lang="nb"][not(child::node())][following-sibling::mu[@title][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)][not(following-sibling::mu)]]]][position() = 1]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <omega> <xi attrib="solid 1px green" xml:lang="nb" xml:id="id1"> @@ -29592,6 +34682,11 @@ </test> <test> <xpath>//alpha[@xml:lang="en-US"][@xml:id="id1"]/delta[contains(@abort,"lue")][@xml:lang="no-nb"][following-sibling::*[position()=4]][not(child::node())][following-sibling::sigma[@abort][@xml:lang="en-GB"][not(child::node())][following-sibling::epsilon[following-sibling::*[position()=2]][following-sibling::eta[@xml:lang="en-GB"][following-sibling::*[position()=1]][following-sibling::rho[@xml:id="id2"]//eta[@xml:lang="nb"][@xml:id="id3"][not(preceding-sibling::*)][not(child::node())][following-sibling::beta[@xml:lang="nb"][preceding-sibling::*[position() = 1]]/tau[contains(concat(@desciption,"$"),"e$")][@xml:lang="no-nb"][@xml:id="id4"][following-sibling::*[position()=1]][not(child::node())][following-sibling::sigma[preceding-sibling::*[position() = 1]][not(following-sibling::*)]/chi[@abort][@xml:lang="en-US"]/*[following-sibling::chi[@content][@xml:id="id5"][preceding-sibling::*[position() = 1]][following-sibling::theta[@xml:id="id6"][preceding-sibling::*[position() = 2]][not(following-sibling::*)][not(preceding-sibling::theta or following-sibling::theta)]/omicron[@name][@xml:lang="en"][@xml:id="id7"][not(preceding-sibling::*)][not(following-sibling::*)]/nu[contains(@delete,"ribute value")][@xml:lang="en"]/sigma[@xml:lang="en-GB"]/alpha[not(preceding-sibling::*)][not(child::node())][following-sibling::alpha[following-sibling::*[position()=1]][following-sibling::beta[@xml:lang="en"][preceding-sibling::*[position() = 2]]//kappa[@attr][@xml:lang="en-GB"][@xml:id="id8"][not(preceding-sibling::*)][following-sibling::xi[starts-with(concat(@false,"-"),"true-")][@xml:lang="no-nb"][not(following-sibling::*)]/*[contains(concat(@class,"$"),"lse$")][@xml:id="id9"][not(following-sibling::*)][not(preceding-sibling::any)][position() = 1]]][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>delta</localname> + <nth>0</nth> + </result> <tree> <alpha xml:lang="en-US" xml:id="id1"> <delta abort="this-is-att-value" xml:lang="no-nb"/> @@ -29633,6 +34728,11 @@ </test> <test> <xpath>//sigma/theta[contains(concat(@data,"$"),"is.nodeValue$")][@xml:lang="nb"]//omega[@xml:lang="no"][@xml:id="id1"][following-sibling::eta[@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::kappa[@xml:lang="en-US"][@xml:id="id3"][not(following-sibling::*)]/beta[not(child::node())][following-sibling::epsilon[@xml:id="id4"][following-sibling::delta[@false][@xml:lang="no"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//epsilon[@xml:lang="no-nb"][not(following-sibling::*)][not(parent::*/*[position()=2])]//phi[contains(@name,"lue")][not(following-sibling::*)]/alpha[@xml:lang="en-GB"][not(child::node())][following-sibling::beta[@xml:lang="no"][@xml:id="id5"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::sigma[starts-with(@abort,"attrib")][@xml:lang="en"][@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::rho[preceding-sibling::*[position() = 3]][not(following-sibling::*)]/phi[starts-with(@attribute,"100%")][@xml:lang="en-US"][@xml:id="id7"][not(child::node())][following-sibling::pi[starts-with(@title,"tr")][@xml:lang="nb"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//lambda[@content][not(following-sibling::*)]/gamma[@attrib="this-is-att-value"][@xml:lang="en-US"][@xml:id="id8"][following-sibling::kappa[@xml:lang="en-GB"][@xml:id="id9"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//beta[starts-with(@and,"this.nodeV")][@xml:id="id10"][not(following-sibling::*)]]][position() = 1]][position() = 1]][position() = 1]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>omega</localname> + <nth>0</nth> + </result> <tree> <sigma> <theta data="this.nodeValue" xml:lang="nb"> @@ -29670,6 +34770,11 @@ </test> <test> <xpath>//delta[@xml:lang="nb"]//iota[starts-with(concat(@object,"-"),"attribute value-")][@xml:lang="en"]/xi[@xml:id="id1"][not(child::node())][following-sibling::sigma[@false][@xml:lang="en-GB"][preceding-sibling::*[position() = 1]]/pi[not(preceding-sibling::*)]//kappa[contains(@name,"100")][@xml:lang="en"][@xml:id="id2"][following-sibling::*[position()=2]][not(child::node())][following-sibling::chi[@xml:lang="no"][@xml:id="id3"][following-sibling::*[position()=1]][following-sibling::eta[@xml:id="id4"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//alpha[@class="123456789"][not(preceding-sibling::*)][not(child::node())][following-sibling::xi[@xml:lang="en-GB"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::gamma[@xml:id="id5"][following-sibling::*[position()=1]][not(child::node())][following-sibling::rho[contains(concat(@string,"$"),"alse$")][@xml:id="id6"][preceding-sibling::*[position() = 3]]/lambda[contains(concat(@or,"$"),"k$")][not(preceding-sibling::*)][following-sibling::xi[@xml:lang="no-nb"]/psi[@xml:id="id7"][not(preceding-sibling::*)][following-sibling::*[position()=6]][not(preceding-sibling::psi)][not(child::node())][following-sibling::chi[preceding-sibling::*[position() = 1]][following-sibling::*[position()=5]][following-sibling::nu[contains(@token,"e")][@xml:lang="nb"][@xml:id="id8"][preceding-sibling::*[position() = 2]][following-sibling::theta[@xml:lang="nb"][@xml:id="id9"][following-sibling::*[position()=3]][following-sibling::mu[@xml:lang="no"][@xml:id="id10"][preceding-sibling::*[position() = 4]][not(child::node())][following-sibling::delta[contains(@src,"ribute")][@xml:lang="nb"][@xml:id="id11"][following-sibling::eta[@xml:lang="en-US"]/upsilon[@xml:id="id12"]//mu[not(preceding-sibling::*)][not(following-sibling::*)]]]]]]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>xi</localname> + <nth>0</nth> + </result> <tree> <delta xml:lang="nb"> <iota object="attribute value" xml:lang="en"> @@ -29709,6 +34814,11 @@ </test> <test> <xpath>//omega[@xml:id="id1"]/iota[starts-with(concat(@token,"-"),"attribute-")][@xml:lang="nb"][@xml:id="id2"][following-sibling::mu[@att][@xml:id="id3"][preceding-sibling::*[position() = 1]][not(following-sibling::*)]//upsilon[@number="123456789"][not(preceding-sibling::*)][not(following-sibling::*)]//rho[not(child::node())][following-sibling::xi[starts-with(concat(@title,"-"),"true-")][@xml:id="id4"][following-sibling::*[position()=4]][not(child::node())][following-sibling::gamma[@false="true"][@xml:lang="nb"][@xml:id="id5"][following-sibling::chi[@xml:lang="en-US"][@xml:id="id6"][preceding-sibling::*[position() = 3]][not(child::node())][following-sibling::theta[@title][preceding-sibling::*[position() = 4]][following-sibling::alpha[starts-with(@token,"10")][@xml:lang="nb"][@xml:id="id7"]/delta/rho[@src="true"]//gamma[@xml:id="id8"][not(preceding-sibling::*)]/beta[@xml:lang="en-GB"]/alpha[@att][@xml:id="id9"]/upsilon[contains(@and,"tru")][not(preceding-sibling::*)]//chi[@xml:id="id10"][not(preceding-sibling::*)][not(following-sibling::*)]//epsilon[@data="_blank"][not(preceding-sibling::*)][following-sibling::*[position()=1]][not(child::node())][following-sibling::xi[@xml:id="id11"][not(following-sibling::*)][not(preceding-sibling::xi)]//chi[@false="this-is-att-value"][@xml:id="id12"][position() = 1]][position() = 1]][position() = 1]]][position() = 1]]]]</xpath> + <result> + <namespace/> + <localname>iota</localname> + <nth>0</nth> + </result> <tree> <omega xml:id="id1"> <iota token="attribute-value" xml:lang="nb" xml:id="id2"/> @@ -29748,6 +34858,11 @@ </test> <test> <xpath>//omicron[@src="attribute value"][@xml:lang="en-US"]//kappa[@xml:lang="en-US"][@xml:id="id1"][following-sibling::*[position()=3]][not(child::node())][following-sibling::beta[@xml:lang="en-US"][@xml:id="id2"][preceding-sibling::*[position() = 1]][not(child::node())][following-sibling::omega[starts-with(@false,"attribute val")][@xml:lang="no"][@xml:id="id3"][preceding-sibling::*[position() = 2]][not(child::node())][following-sibling::beta/mu[@xml:lang="no-nb"][@xml:id="id4"][not(preceding-sibling::*)]//chi[starts-with(@string,"so")][not(child::node())][following-sibling::phi[@xml:lang="en-US"]/*[@xml:id="id5"][not(preceding-sibling::*)]/nu[@xml:id="id6"][following-sibling::*[position()=1]][following-sibling::lambda[@xml:lang="en-GB"]/xi[@xml:lang="en-GB"][not(preceding-sibling::*)][following-sibling::epsilon[@xml:id="id7"][following-sibling::*[position()=1]][not(child::node())][following-sibling::omega[contains(@attribute,"00%")][@xml:id="id8"][preceding-sibling::*[position() = 2]][not(following-sibling::*)]//nu[starts-with(@name,"a")][not(preceding-sibling::*)][not(following-sibling::*)]/mu[@false][@xml:id="id9"][not(preceding-sibling::*)][not(following-sibling::*)]][position() = 1]]]]]][position() = 1]]</xpath> + <result> + <namespace/> + <localname>kappa</localname> + <nth>0</nth> + </result> <tree> <omicron src="attribute value" xml:lang="en-US"> <kappa xml:lang="en-US" xml:id="id1"/> @@ -29779,6 +34894,11 @@ </test> <test> <xpath>//pi[@xml:id="id1"]/upsilon[contains(concat(@insert,"$"),"23456789$")][@xml:lang="no-nb"][@xml:id="id2"][not(preceding-sibling::*)][following-sibling::*[position()=6]][following-sibling::lambda[contains(concat(@abort,"$"),"9$")][following-sibling::tau[@insert][following-sibling::omicron[@xml:lang="en-US"][following-sibling::lambda[@number="100%"][@xml:lang="en-US"][@xml:id="id3"][preceding-sibling::*[position() = 4]][not(following-sibling::lambda)][not(child::node())][following-sibling::chi[@xml:id="id4"][preceding-sibling::*[position() = 5]][following-sibling::*[position()=1]][not(child::node())][following-sibling::psi[@xml:id="id5"][not(following-sibling::*)]//mu[not(child::node())][following-sibling::epsilon[starts-with(concat(@attr,"-"),"attribute-")]][position() = 1]]][position() = 1]]][position() = 1]]]</xpath> + <result> + <namespace/> + <localname>upsilon</localname> + <nth>0</nth> + </result> <tree> <pi xml:id="id1"> <upsilon insert="123456789" xml:lang="no-nb" xml:id="id2"/> diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html index 2865052c65d..14a6a73e07a 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html +++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html @@ -17,8 +17,6 @@ <!-- Content metadata --> <script src=/encrypted-media/content/content-metadata.js></script> - <!-- Message handler for Clear Key --> - <script src=/encrypted-media/util/clearkey-messagehandler.js></script> <!-- The script for this specific test --> <script src=/encrypted-media/scripts/setmediakeys.js></script> diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-not-callable-after-createsession.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-not-callable-after-createsession.html index 29dc214921d..22e8b38615c 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/clearkey-not-callable-after-createsession.html +++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-not-callable-after-createsession.html @@ -14,9 +14,6 @@ <script src=/encrypted-media/util/utf8.js></script> <script src=/encrypted-media/util/fetch.js></script> - <!-- Message handler for Clear Key --> - <script src=/encrypted-media/util/clearkey-messagehandler.js></script> - <!-- The script for this specific test --> <script src=/encrypted-media/scripts/not-callable-after-createsession.js></script> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-events.html b/tests/wpt/web-platform-tests/encrypted-media/drm-events.html index 880376d60da..ece798ac87c 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-events.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-events.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Events with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html b/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html index 6dec511470b..d907090efe0 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Expiration with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html index 8ef745c4fa7..cd14fe38054 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, multiple keys for audio/video</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html index de7ff395d03..0d98f7411f2 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-destroy-persistent-license.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-destroy-persistent-license.html index 59350fb159e..b8a1bfd41e1 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-destroy-persistent-license.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-destroy-persistent-license.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, persistent-license session with DRM, mp4, destroy the license</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license-events.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license-events.html index 3df5fffd2a9..4b5956c4086 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license-events.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license-events.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, persistent-license session with DRM, mp4, event sequence</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license.html index 066e0040f58..a119d3826b0 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-license.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, persistent-license session with DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html index b0c82621a35..29c44f89591 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, persistent-usage-record session with DRM, mp4, event sequence</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html index da5048f29a5..55736e8c447 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: persistent-usage-record, playback and retrieve record in new window, DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html index a8621ba2552..e929251978c 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, clear then encrypted</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html index ed5ff23632e..10450f0a6ad 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, encrypted then clear</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey.html index b29139ed2ce..ba5a586abfc 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful playback, temporary session with DRM, mp4, multiple keys</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html index 391ebf90724..ebb0e66bc34 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html index 20dda66adff..fab98edbbda 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-src.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html index 4f81da08dd8..63de51be68f 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-after-update.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html index c97c571b666..59ed1e498de 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-immediately.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html index c16809b8567..45dc70b39fc 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-setMediaKeys-onencrypted.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html index 1aafba40fbd..cf062125f0d 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, two videos</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html index bf970db674c..c9b78e615f1 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-waitingforkey.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary.html index 592f2a8a151..f28a6fe2f0f 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html index 2656f8feb55..b18a36f0e47 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html @@ -2,7 +2,6 @@ <html> <head> <meta charset=utf-8> - <meta name="timeout" content="long"> <title>Encrypted Media Extensions: requestMediaKeySystemAccess tests, DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html index d215036fae7..71a1f70afcb 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: setMediaKeys again after playback with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html index d1723b5ce9c..749962c62d5 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: setMediaKeys again after resetting src attribute on video element with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html index 581d22f4af0..135c9893bf7 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: setMediaKeys multiple at same time with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html index 7d3fe096383..b7f2fec65f0 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: setMediaKeys multiple times with different mediakeys with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html index efc6d19780d..5cbbe52da9a 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: setMediaKeys multiple times with the same mediakeys with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html index bd78cb930de..dddbe3059c2 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: setMediaKeys to multiple video elements with DRM</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html index 1a74a6236a6..447ca60f745 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html @@ -17,9 +17,6 @@ <!-- Content metadata --> <script src=/encrypted-media/content/content-metadata.js></script> - <!-- Message handler for DRM servers --> - <script src=/encrypted-media/util/drm-messagehandler.js></script> - <!-- The script for this specific test --> <script src=/encrypted-media/scripts/setmediakeys.js></script> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html index 508afcacb15..772806ae87a 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions - Waiting for a key for DRM, mp4</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html b/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html index 22d9a1359ec..2fcdc839f22 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html @@ -14,9 +14,6 @@ <script src=/encrypted-media/util/utf8.js></script> <script src=/encrypted-media/util/fetch.js></script> - <!-- Message handler for DRM server --> - <script src=/encrypted-media/util/drm-messagehandler.js></script> - <!-- The script for this specific test --> <script src=/encrypted-media/scripts/not-callable-after-createsession.js></script> diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html b/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html index a4b54dac3b8..dd114659003 100644 --- a/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html +++ b/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html @@ -2,6 +2,7 @@ <html> <head> <meta charset=utf-8> + <meta name="timeout" content="long"> <title>Encrypted Media Extensions: Test that persistent license cannot be ingested into temporary session</title> <link rel="help" href="https://w3c.github.io/encrypted-media/"> diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js b/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js index 7b0eee489a7..2df59a5f157 100644 --- a/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js +++ b/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js @@ -6,7 +6,7 @@ if (this.document === undefined) { function checkContentType(contentType, body) { if (self.FormData && body instanceof self.FormData) { - assert_true(contentType.startsWith("multipart/form-data;boundary="), "Request should have header content-type starting with multipart/form-data;boundary=, but got " + contentType); + assert_true(contentType.startsWith("multipart/form-data; boundary="), "Request should have header content-type starting with multipart/form-data; boundary=, but got " + contentType); return; } @@ -44,8 +44,8 @@ function requestHeaders(desc, url, method, body, expectedOrigin, expectedContent var url = RESOURCES_DIR + "inspect-headers.py" -requestHeaders("Fetch with GET", url, "GET", null, location.origin, null); -requestHeaders("Fetch with HEAD", url, "HEAD", null, location.origin, null); +requestHeaders("Fetch with GET", url, "GET", null, null, null); +requestHeaders("Fetch with HEAD", url, "HEAD", null, null, null); requestHeaders("Fetch with PUT without body", url, "POST", null, location.origin, "0"); requestHeaders("Fetch with PUT with body", url, "PUT", "Request's body", location.origin, "14"); requestHeaders("Fetch with POST without body", url, "POST", null, location.origin, "0"); @@ -63,4 +63,24 @@ requestHeaders("Fetch with POST with Blob body with mime type", url, "POST", new requestHeaders("Fetch with Chicken", url, "Chicken", null, location.origin, null); requestHeaders("Fetch with Chicken with body", url, "Chicken", "Request's body", location.origin, "14"); +function requestOriginHeader(method, mode, needsOrigin) { + promise_test(function(test){ + return fetch(url + "?headers=origin", {method:method, mode:mode}).then(function(resp) { + assert_equals(resp.status, 200, "HTTP status is 200"); + assert_equals(resp.type , "basic", "Response's type is basic"); + if(needsOrigin) + assert_equals(resp.headers.get("x-request-origin") , location.origin, "Request should have an Origin header with origin: " + location.origin); + else + assert_equals(resp.headers.get("x-request-origin"), null, "Request should not have an Origin header") + }); + }, "Fetch with " + method + " and mode \"" + mode + "\" " + (needsOrigin ? "needs" : "does not need") + " an Origin header"); +} + +requestOriginHeader("GET", "cors", false); +requestOriginHeader("POST", "same-origin", true); +requestOriginHeader("POST", "no-cors", true); +requestOriginHeader("PUT", "same-origin", true); +requestOriginHeader("TacO", "same-origin", true); +requestOriginHeader("TacO", "cors", true); + done(); diff --git a/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html b/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html index 98d71acad9f..082db0bfea1 100644 --- a/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html +++ b/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html @@ -57,7 +57,7 @@ assert_equals(headers.get(name), String(headerDict[name]), "name: " + name + " has value: " + headerDict[name]); } - }, "Create headers with OpenEndedDictionary"); + }, "Create headers with record"); test(function() { var headers = new Headers(headerDict); @@ -69,6 +69,14 @@ }, "Create headers with existing headers"); test(function() { + var headers = new Headers({test:"test"}); + var headers2 = new Headers() + headers2[Symbol.iterator] = headers[Symbol.iterator] + var headers3 = new Headers(headers2) + assert_equals(headers3.get("test"), "test") + }, "Create headers with existing headers with custom iterator"); + + test(function() { var headers = new Headers(); for (name in headerDict) { headers.append(name, headerDict[name]); diff --git a/tests/wpt/web-platform-tests/fetch/api/headers/headers-idl.html b/tests/wpt/web-platform-tests/fetch/api/headers/headers-idl.html index 2aaa1ceeaee..fe24fa34c6a 100644 --- a/tests/wpt/web-platform-tests/fetch/api/headers/headers-idl.html +++ b/tests/wpt/web-platform-tests/fetch/api/headers/headers-idl.html @@ -12,7 +12,7 @@ </head> <body> <script id="headers-idl" type="text/plain"> - typedef (Headers or sequence<sequence<ByteString>> or OpenEndedDictionary<ByteString>) HeadersInit; + typedef (sequence<sequence<ByteString>> or record<ByteString>) HeadersInit; [Constructor(optional HeadersInit init), Exposed=(Window,Worker)] @@ -27,7 +27,7 @@ </script> <script> var idlsArray = new IdlArray(); - var idl = document.getElementById("headers-idl").innerHTML + var idl = document.getElementById("headers-idl").textContent idlsArray.add_idls(idl); idlsArray.add_objects({ Headers: ['new Headers()'] }); idlsArray.test(); diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-error.html b/tests/wpt/web-platform-tests/fetch/api/request/request-error.html index c87429e7637..0ed312a6ba2 100644 --- a/tests/wpt/web-platform-tests/fetch/api/request/request-error.html +++ b/tests/wpt/web-platform-tests/fetch/api/request/request-error.html @@ -105,6 +105,20 @@ assert_throws(new TypeError(), function() { new Request("", options); }); },"Bad " + parameter +" init parameter value"); }); + + function testOnlyIfCachedMode(fetchMode, ok) { + test(function() { + var options = {"cache": "only-if-cached", "mode": fetchMode}; + if (ok) + new Request("test", options); + else + assert_throws(new TypeError(), function() { new Request("test", options); }); + }, "Request with cache mode: only-if-cached and fetch mode: " + fetchMode); + } + testOnlyIfCachedMode("same-origin", true); + testOnlyIfCachedMode("cors", false); + testOnlyIfCachedMode("no-cors", false); + </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html b/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html index 4f1590c7560..3c5588f2aaf 100644 --- a/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html +++ b/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html @@ -74,8 +74,8 @@ </script> <script> var idlsArray = new IdlArray(); - var idl = document.getElementById("body-idl").innerHTML - idl += document.getElementById("request-idl").innerHTML + var idl = document.getElementById("body-idl").textContent + idl += document.getElementById("request-idl").textContent idlsArray.add_idls(idl); idlsArray.add_untested_idls("interface Headers {};"); diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html b/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html index dc7239424db..24d127f295e 100644 --- a/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html +++ b/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html @@ -12,6 +12,25 @@ </head> <body> <script> + function blobToFormDataResponse(name, blob) { + var formData = new FormData(); + formData.append(name, blob); + return new Response(formData); + } + + function readBlobAsArrayBuffer(blob) { + return new Promise(function(resolve, reject) { + var reader = new FileReader(); + reader.onload = function(evt) { + resolve(reader.result); + }; + reader.onerror = function(evt) { + reject("Blob's reader failed"); + }; + reader.readAsArrayBuffer(blob); + }); + } + function responsePromise(body, responseInit) { return new Promise(function(resolve, reject) { resolve(new Response(body, responseInit)); @@ -205,6 +224,73 @@ checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyArrayBuffer, "from fetch to arrayBuffer"); checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyFormDataError, "from fetch without correct type to formData (error case)"); + promise_test(function(test) { + var response = new Response(new Blob([ + "--boundary\r\n", + "Content-Disposition: form-data; name=string\r\n", + "\r\nvalue", new Uint8Array([0xC2, 0xA0]), "1\r\n", + "--boundary\r\n", + "Content-Disposition: form-data; name=string-with-default-charset\r\n", + "Content-Type: text/plain; charset=utf-8\r\n", + "\r\nvalue", new Uint8Array([0xC2, 0xA0]), "2\r\n", + "--boundary\r\n", + "Content-Disposition: form-data; name=string-with-non-default-charset\r\n", + "Content-Type: text/plain; charset=iso-8859-1\r\n", + "\r\nvalue", new Uint8Array([0xC2, 0xA0]), "3\r\n", + "--boundary\r\n", + "Content-Disposition: form-data; name=string-with-non-default-type\r\n", + "Content-Type: application/octet-stream\r\n", + "\r\nvalue", new Uint8Array([0xC2, 0xA0]), "4\r\n", + "--boundary\r\n", + "Content-Disposition: form-data; name=file; filename=file1\r\n", + "Content-Type: application/octet-stream; x-param=x-value\r\n", + "\r\n", new Uint8Array([5, 0x0, 0xFF]), "\r\n", + "--boundary\r\n", + "Content-Disposition: form-data; name=\"file-without-type\"; filename=\"file2\"\r\n", + "\r\n", new Uint8Array([6, 0x0, 0x7F, 0xFF]), "\r\n", + "--boundary--\r\n" + ]), { "headers": [["Content-Type", 'multipart/form-data; boundary="boundary"']] }); + return response.formData().then(function(bodyAsFormData) { + // Non-file parts must always be decoded using utf-8 encoding. + assert_equals(bodyAsFormData.get("string"), "value\u00A01", "Retrieve and verify response's 1st entry value"); + assert_equals(bodyAsFormData.get("string-with-default-charset"), "value\u00A02", "Retrieve and verify response's 2nd entry value"); + assert_equals(bodyAsFormData.get("string-with-non-default-charset"), "value\u00A03", "Retrieve and verify response's 3rd entry value"); + assert_equals(bodyAsFormData.get("string-with-non-default-type"), "value\u00A04", "Retrieve and verify response's 4th entry value"); + // The name of a File must be taken from the filename parameter in + // the Content-Disposition header field. + assert_equals(bodyAsFormData.get("file").name, "file1", "Retrieve and verify response's 5th entry name property"); + assert_equals(bodyAsFormData.get("file-without-type").name, "file2", "Retrieve and verify response's 6th entry name property"); + // The type of a File must be taken from the Content-Type header field + // which defaults to "text/plain". + assert_equals(bodyAsFormData.get("file").type, "application/octet-stream; x-param=x-value", "Retrieve and verify response's 5th entry type property"); + assert_equals(bodyAsFormData.get("file-without-type").type, "text/plain", "Retrieve and verify response's 6th entry type property"); + + return Promise.resolve().then(function() { + return blobToFormDataResponse("file", bodyAsFormData.get("file")).text().then(function(bodyAsText) { + // Verify that filename, name and type are preserved. + assert_regexp_match(bodyAsText, /\r\nContent-Disposition: *form-data;([^\r\n]*;)* *filename=("?)file1\2[;\r]/i, "Retrieve and verify response's 5th entry filename parameter"); + assert_regexp_match(bodyAsText, /\r\nContent-Disposition: *form-data;([^\r\n]*;)* *name=("?)file\2[;\r]/i, "Retrieve and verify response's 5th entry name parameter"); + assert_regexp_match(bodyAsText, /\r\nContent-Type: *application\/octet-stream; x-param=x-value\r\n/i, "Retrieve and verify response's 5th entry type field"); + // Verify that the content is preserved. + return readBlobAsArrayBuffer(bodyAsFormData.get("file")).then(function(arrayBuffer) { + assert_array_equals(new Uint8Array(arrayBuffer), new Uint8Array([5, 0x0, 0xFF]), "Retrieve and verify response's 5th entry content"); + }); + }); + }).then(function() { + return blobToFormDataResponse("file-without-type", bodyAsFormData.get("file-without-type")).text().then(function(bodyAsText) { + // Verify that filename, name and type are preserved. + assert_regexp_match(bodyAsText, /\r\nContent-Disposition: *form-data;([^\r\n]*;)* *filename=("?)file2\2[;\r]/i, "Retrieve and verify response's 6th entry filename parameter"); + assert_regexp_match(bodyAsText, /\r\nContent-Disposition: *form-data;([^\r\n]*;)* *name=("?)file-without-type\2[;\r]/i, "Retrieve and verify response's 6th entry name parameter"); + assert_regexp_match(bodyAsText, /\r\nContent-Type: *text\/plain\r\n/i, "Retrieve and verify response's 6th entry type field"); + // Verify that the content is preserved. + return readBlobAsArrayBuffer(bodyAsFormData.get("file-without-type")).then(function(arrayBuffer) { + assert_array_equals(new Uint8Array(arrayBuffer), new Uint8Array([6, 0x0, 0x7F, 0xFF]), "Retrieve and verify response's 6th entry content"); + }); + }); + }); + }); + }, "Consume response's body: from multipart form data blob to formData"); + </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-idl.html b/tests/wpt/web-platform-tests/fetch/api/response/response-idl.html index e849856cee3..19da25a758b 100644 --- a/tests/wpt/web-platform-tests/fetch/api/response/response-idl.html +++ b/tests/wpt/web-platform-tests/fetch/api/response/response-idl.html @@ -56,8 +56,8 @@ </script> <script> var idlsArray = new IdlArray(); - var idl = document.getElementById("body-idl").innerHTML - idl += document.getElementById("response-idl").innerHTML + var idl = document.getElementById("body-idl").textContent + idl += document.getElementById("response-idl").textContent idlsArray.add_idls(idl); idlsArray.add_untested_idls("interface Headers {};"); diff --git a/tests/wpt/web-platform-tests/fetch/nosniff/image.html b/tests/wpt/web-platform-tests/fetch/nosniff/image.html index e5869d94e60..e478789609c 100644 --- a/tests/wpt/web-platform-tests/fetch/nosniff/image.html +++ b/tests/wpt/web-platform-tests/fetch/nosniff/image.html @@ -2,18 +2,8 @@ <script src=/resources/testharnessreport.js></script> <div id=log></div> <script> - var fails = ["", "?type=", "?type=x", "?type=x/x"], - passes = ["?type=image/gif", "?type=image/png", "?type=image/png;blah"] - - fails.forEach(function(urlpart) { - async_test(function(t) { - var img = document.createElement("img") - img.onerror = t.step_func_done(function(){}) - img.onload = t.unreached_func("Unexpected load event") - img.src = "resources/image.py" + urlpart - document.body.appendChild(img) - }, "URL query: " + urlpart) - }) + // Note: images get always sniffed, nosniff doesn't do anything + var passes = ["", "?type=", "?type=x", "?type=x/x", "?type=image/gif", "?type=image/png", "?type=image/png;blah"] passes.forEach(function(urlpart) { async_test(function(t) { diff --git a/tests/wpt/web-platform-tests/fullscreen/OWNERS b/tests/wpt/web-platform-tests/fullscreen/OWNERS index dd7cb4169b1..f640fe70bd3 100644 --- a/tests/wpt/web-platform-tests/fullscreen/OWNERS +++ b/tests/wpt/web-platform-tests/fullscreen/OWNERS @@ -1,2 +1,4 @@ +@aliams @foolip +@jernoble @upsuper diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-active-document.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-active-document.html new file mode 100644 index 00000000000..18b0bb6493b --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-active-document.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>Document#exitFullscreen() when the document is not the active document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<iframe allowfullscreen></iframe> +<script> +var t = async_test(); + +onload = t.step_func(() => { + var iframe = document.querySelector("iframe"); + var documentBeforeNav = iframe.contentDocument; + + iframe.onload = t.step_func(() => { + var p = documentBeforeNav.exitFullscreen(); + assert_true(p instanceof Promise, 'exitFullscreen() returns promise'); + // The promise should already be rejected, so its reject callback should be + // invoked before a second promise's callback. + p.catch(t.step_func_done()); + Promise.resolve().then(t.unreached_func('new promise resolved before exitFullscreen() promise rejected')); + }); + + // Navigate the iframe + window[0].location.href = '/common/blank.html'; +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html index 3b0d283978a..621b3304ffe 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Document.exitFullscreen()</title> +<title>Document#exitFullscreen()</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> @@ -9,7 +9,7 @@ async_test(function(t) { trusted_request(document.querySelector("div")); - document.addEventListener("fullscreenchange", t.step_func(function() + document.addEventListener("fullscreenchange", t.step_func(function(event) { if (document.fullscreenElement) { document.exitFullscreen(); diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html new file mode 100644 index 00000000000..f91eb7e2a76 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>Document#exitFullscreen() timing</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<script> +async_test(t => { + const div = document.querySelector('div'); + trusted_request(div); + + document.onfullscreenchange = t.step_func(() => { + // We are now in fullscreen. Exit again. + assert_equals(document.fullscreenElement, div); + document.exitFullscreen(); + + // If fullscreenchange is an animation frame event, then animation frame + // callbacks should be run after it is fired, before the timer callback. + // The resize event should fire before the fullscreenchange event. + const events = []; + const callback = t.step_func(event => { + events.push(event.type); + if (event.type == 'fullscreenchange') { + setTimeout(t.unreached_func('timer callback')); + requestAnimationFrame(t.step_func_done(() => { + assert_array_equals(events, ['resize', 'fullscreenchange'], 'event order'); + })); + } + }); + document.onfullscreenchange = window.onresize = callback; + }); +}, 'Timing of fullscreenchange and resize events'); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-twice-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-twice-manual.html new file mode 100644 index 00000000000..c80aeb41695 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-twice-manual.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<title>Document#exitFullscreen() called twice</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<script> +async_test(t => { + const div = document.querySelector("div"); + + document.onfullscreenchange = t.step_func(() => { + // We are now in fullscreen. + assert_equals(document.fullscreenElement, div); + + document.onfullscreenchange = t.step_func(() => { + assert_equals(document.fullscreenElement, null); + // Done, but ensure that there's only one fullscreenchange event. + document.onfullscreenchange = t.unreached_func("second fullscreenchange event"); + setTimeout(t.step_func_done(), 0); + }); + + // Exit fullscreen twice. + document.exitFullscreen(); + assert_equals(document.fullscreenElement, div, "fullscreenElement after first exitFullscreen()"); + document.exitFullscreen(); + assert_equals(document.fullscreenElement, div, "fullscreenElement after second exitFullscreen()"); + }); + document.onfullscreenerror = t.unreached_func("fullscreenerror event"); + + trusted_request(div); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html index 473bdbb0f61..8f0af4187ae 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Document.fullscreenElement</title> +<title>Document#fullscreenElement</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-active-document.html b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-active-document.html new file mode 100644 index 00000000000..40171b510b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-active-document.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<title>Document#fullscreenEnabled when the document is not the active document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<iframe allowfullscreen></iframe> +<script> +var t = async_test(); + +onload = t.step_func(() => { + var iframe = document.querySelector("iframe"); + var documentBeforeNav = iframe.contentDocument; + + iframe.onload = t.step_func_done(() => { + assert_false(documentBeforeNav.fullscreenEnabled); + }); + + // Navigate the iframe + window[0].location.href = '/common/blank.html'; +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled.html b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled.html index f6382e64083..ce9556b57b9 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Document.fullscreenEnabled</title> +<title>Document#fullscreenEnabled</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <div id="log"></div> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html index d77872ffb58..1d05ce05bd9 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Document.onfullscreenchange</title> +<title>Document#onfullscreenchange</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenerror.html b/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenerror.html index 9bbcda9bba1..499e77d0b99 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenerror.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenerror.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Document.onfullscreenerror</title> +<title>Document#onfullscreenerror</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <div id="log"></div> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html index 82672cbfd60..0f79cb6b7e9 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <title>Element ready check for sibling of fullscreen element</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> <div id="log"></div> <div id="a"></div> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html index 598fcfecf95..08febbd4f96 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html @@ -8,21 +8,26 @@ <script> // Verify that an iframe can itself go fullscreen, and that this doesn't // influence the iframe ancestor test of the element ready check. -async_test(function(t) -{ - var iframe = document.querySelector("iframe"); - document.onfullscreenchange = t.step_func(function() - { - assert_equals(document.fullscreenElement, iframe, "fullscreen element"); - var div = document.createElement("div"); - // This adds the div to the iframe element itself, not to the iframe's - // contentDocument. It's done here because the HTML parser treats the - // content of iframe as a text node. - iframe.appendChild(div); - trusted_request(div, iframe.contentDocument.body); - document.onfullscreenchange = t.unreached_func("second fullscreenchange event"); - document.onfullscreenerror = t.step_func_done(); +async_test(t => { + var iframe = document.querySelector("iframe"); + + document.onfullscreenchange = t.step_func(() => { + assert_equals(document.fullscreenElement, iframe, "fullscreen element"); + + // This adds the div to the iframe element itself, not to the iframe's + // contentDocument. It's done here because the HTML parser treats the + // content of iframe as a text node. + var div = document.createElement("div"); + iframe.appendChild(div); + + document.onfullscreenchange = t.step_func_done(() => { + assert_equals(document.fullscreenElement, div); }); - trusted_request(iframe); + document.onfullscreenerror = t.unreached_func("fullscreenerror event"); + + trusted_request(div, iframe.contentDocument.body); + }); + + trusted_request(iframe); }); </script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html index 0c1dd29a1e6..ab1c261ccc8 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html @@ -6,12 +6,15 @@ <div id="log"></div> <iframe><!-- script inserts child here --></iframe> <script> -async_test(function(t) -{ - var div = document.createElement("div"); - document.querySelector("iframe").appendChild(div); - document.onfullscreenchange = t.unreached_func("fullscreenchange event"); - document.onfullscreenerror = t.step_func_done(); - trusted_request(div, document.body); +async_test(t => { + const div = document.createElement("div"); + document.querySelector("iframe").appendChild(div); + + document.onfullscreenchange = t.step_func_done(() => { + assert_equals(document.fullscreenElement, div); + }); + document.onfullscreenerror = t.unreached_func("fullscreenerror event"); + + trusted_request(div, document.body); }); </script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html new file mode 100644 index 00000000000..4483ccae2dc --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() and Document#exitFullscreen() in iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<iframe allowfullscreen></iframe> +<script> +async_test(t => { + const iframe = document.querySelector('iframe'); + const iframeDoc = iframe.contentDocument; + const iframeBody = iframeDoc.body; + + let count = 0; + document.onfullscreenchange = iframeDoc.onfullscreenchange = t.step_func(event => { + count++; + assert_between_inclusive(count, 1, 4, 'number of fullscreenchange events'); + const expected = { + target: count == 1 || count == 4 ? document : iframeDoc, + outerFullscreenElement: count <= 2 ? iframe : null, + innerFullscreenElement: count <= 2 ? iframeBody : null, + }; + assert_equals(event.target, expected.target, 'event target'); + assert_equals(document.fullscreenElement, expected.outerFullscreenElement, 'outer fullscreenElement'); + assert_equals(iframeDoc.fullscreenElement, expected.innerFullscreenElement, 'inner fullscreenElement'); + if (count == 2) { + iframeDoc.exitFullscreen(); + } else if (count == 4) { + // Done, but set timeout to fail on extra events. + setTimeout(t.step_func_done()); + } + }); + document.onfullscreenerror = t.unreached_func('fullscreenerror event'); + iframeDoc.onfullscreenerror = t.unreached_func('iframe fullscreenerror event'); + + trusted_request(iframeBody, document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html new file mode 100644 index 00000000000..697a27f3a35 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() followed by moving the element within the document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<div id="target"></div> +<div id="moveto"></div> +<script> +async_test(t => { + const target = document.getElementById("target"); + const moveTo = document.getElementById("moveto"); + + document.onfullscreenchange = t.step_func_done(() => { + assert_equals(document.fullscreenElement, target); + assert_equals(target.parentNode, moveTo); + }); + document.onfullscreenerror = t.unreached_func("fullscreenchange event"); + + trusted_click(t.step_func(() => { + target.requestFullscreen(); + moveTo.appendChild(target); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-to-iframe-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-to-iframe-manual.html new file mode 100644 index 00000000000..255623e0dc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-to-iframe-manual.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() followed by moving the element into an iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<div id="target"></div> +<iframe allowfullscreen></iframe> +<script> +async_test(t => { + const target = document.getElementById("target"); + const iframeDoc = document.querySelector("iframe").contentDocument; + + iframeDoc.onfullscreenchange = t.unreached_func("fullscreenchange event in iframe"); + iframeDoc.onfullscreenerror = t.unreached_func("fullscreenerror event in iframe"); + document.onfullscreenchange = t.unreached_func("fullscreenchange event"); + document.onfullscreenerror = t.step_func_done(() => { + assert_equals(document.fullscreenElement, null); + assert_equals(iframeDoc.fullscreenElement, null); + }); + + trusted_click(t.step_func(() => { + target.requestFullscreen(); + iframeDoc.body.appendChild(target); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html new file mode 100644 index 00000000000..e2149fd60d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() in iframe followed by removing the iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<iframe allowfullscreen></iframe> +<script> +async_test(t => { + const iframe = document.querySelector("iframe"); + const iframeDocument = iframe.contentDocument; + + document.onfullscreenchange = t.unreached_func("fullscreenchange event"); + document.onfullscreenerror = t.unreached_func("fullscreenerror event"); + iframeDocument.onfullscreenchange = t.unreached_func("iframe fullscreenchange event"); + iframeDocument.onfullscreenerror = t.unreached_func("iframe fullscreenerror event"); + + trusted_click(t.step_func(() => { + iframeDocument.body.requestFullscreen(); + iframe.remove(); + // No events will be fired, end test after 100ms. + setTimeout(t.step_func_done(() => { + assert_equals(document.fullscreenElement, null); + assert_equals(iframeDocument.fullscreenElement, null); + }), 100); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-remove-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-remove-manual.html new file mode 100644 index 00000000000..c754bf00fe4 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-remove-manual.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() followed by removing the element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<div id="target"></div> +<script> +async_test(t => { + const target = document.getElementById("target"); + + document.onfullscreenchange = t.unreached_func("fullscreenchange event"); + document.onfullscreenerror = t.step_func_done(() => { + assert_equals(document.fullscreenElement, null); + }); + + trusted_click(t.step_func(() => { + target.requestFullscreen(); + target.remove(); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html index 81bd6a05e34..43d1ea4b768 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Element.requestFullscreen()</title> +<title>Element#requestFullscreen()</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html index 88eff090abe..ed5e1c88140 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Element.requestFullscreen() for non-top element in fullscreen element stack</title> +<title>Element#requestFullscreen() for non-top element in fullscreen element stack</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-not-allowed.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-not-allowed.html new file mode 100644 index 00000000000..041a458ac70 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-not-allowed.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() when not allowed to request fullscreen</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +async_test(t => { + const div = document.querySelector("div"); + + document.addEventListener("fullscreenerror", t.step_func_done(event => { + assert_equals(event.target, document, "event.target"); + assert_false(event.bubbles, "event.bubbles"); + assert_false(event.cancelable, "event.cancelable"); + })); + + div.requestFullscreen(); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-same-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-same-manual.html new file mode 100644 index 00000000000..a475c18194b --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-same-manual.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() on the current fullscreen element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<div id="target"></div> +<script> +async_test(t => { + var target = document.getElementById("target"); + + document.onfullscreenchange = t.step_func(() => { + assert_equals(document.fullscreenElement, target); + + // The next requestFullscreen() should fire no events due to "If element is + // doc's fullscreen element, terminate these subsubsteps." + document.onfullscreenchange = t.unreached_func("fullscreenchange event"); + + trusted_click(t.step_func(() => { + target.requestFullscreen(); + + // Wait until after the next animation frame. + requestAnimationFrame(t.step_func_done()); + }), target); + }); + document.onfullscreenerror = t.unreached_func("fullscreenerror event"); + + trusted_request(target); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html index 5661bfef760..9244d74e123 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Element.requestFullscreen() for SVG rect element</title> +<title>Element#requestFullscreen() for SVG rect element</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html index 553785d29b9..f971ee4d8c2 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Element.requestFullscreen() for SVG svg element</title> +<title>Element#requestFullscreen() for SVG svg element</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html new file mode 100644 index 00000000000..f92b4f62928 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() timing</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<script> +async_test(t => { + trusted_request(document.querySelector('div')); + + // If fullscreenchange is an animation frame event, then animation frame + // callbacks should be run after it is fired, before the timer callback. + // The resize event should fire before the fullscreenchange event. + const events = []; + const callback = t.step_func(event => { + events.push(event.type); + if (event.type == 'fullscreenchange') { + setTimeout(t.unreached_func('timer callback')); + requestAnimationFrame(t.step_func_done(() => { + assert_array_equals(events, ['resize', 'fullscreenchange'], 'event order'); + })); + } + }); + document.onfullscreenchange = window.onresize = callback; +}, 'Timing of fullscreenchange and resize events'); + +async_test(t => { + document.createElement('a').requestFullscreen(); + + // If fullscreenerror is an animation frame event, then animation frame + // callbacks should be run after it is fired, before the timer callback. + document.onfullscreenerror = t.step_func(() => { + setTimeout(t.unreached_func('timer callback')); + requestAnimationFrame(t.step_func_done()); + }); +}, 'Timing of fullscreenerror event'); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html index 3618344409b..49829160246 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>Element.requestFullscreen() for top element in fullscreen element stack</title> +<title>Element#requestFullscreen() for top element in fullscreen element stack</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../trusted-click.js"></script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-twice-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-twice-manual.html new file mode 100644 index 00000000000..4e843c8e348 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-twice-manual.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() twice</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<script> +async_test(t => { + const div = document.querySelector("div"); + + document.onfullscreenchange = t.step_func(() => { + assert_equals(document.fullscreenElement, div); + // Done, but ensure that there's only one fullscreenchange event. + document.onfullscreenchange = t.unreached_func("second fullscreenchange event"); + setTimeout(t.step_func_done(), 0); + }); + document.onfullscreenerror = t.unreached_func("fullscreenerror event"); + + trusted_click(t.step_func(() => { + // Request fullscreen twice. + div.requestFullscreen(); + assert_equals(document.fullscreenElement, null, "fullscreenElement after first requestFullscreen()"); + div.requestFullscreen(); + assert_equals(document.fullscreenElement, null, "fullscreenElement after second requestFullscreen()"); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-two-elements-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-two-elements-manual.html new file mode 100644 index 00000000000..1ca4355e32c --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-two-elements-manual.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() on two elements in the same document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<div id="a"></div> +<div id="b"></div> +<script> +async_test(t => { + // Request fullscreen on both elements, but in reverse tree order. + const a = document.getElementById('a'); + const b = document.getElementById('b'); + + // Expect two fullscreenchange events, with document.fullscreenElement + // changing in the same order as the requests. + const order = []; + document.onfullscreenchange = t.step_func(() => { + assert_in_array(document.fullscreenElement, [a, b]); + order.push(document.fullscreenElement.id); + if (order.length == 2) { + assert_array_equals(order, ['b', 'a'], + 'fullscreenElement IDs in fullscreenchange events'); + t.done(); + } + }); + document.onfullscreenerror = t.unreached_func('fullscreenerror event'); + + trusted_click(t.step_func(() => { + b.requestFullscreen(); + a.requestFullscreen(); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-two-iframes-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-two-iframes-manual.html new file mode 100644 index 00000000000..60a880efd3b --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-two-iframes-manual.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<title>Element#requestFullscreen() on two elements in different iframes</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../trusted-click.js"></script> +<div id="log"></div> +<iframe id="a" allowfullscreen></iframe> +<iframe id="b" allowfullscreen></iframe> +<script> +async_test(t => { + // Request fullscreen on the body elements of both iframes, but in reverse + // tree order. + const a = document.getElementById('a'); + const b = document.getElementById('b'); + + // Expect two fullscreenchange events, with document.fullscreenElement + // changing in the same order as the requests. (Events should also fire on the + // iframes' documents, but this is not covered by this test.) + const order = []; + document.onfullscreenchange = t.step_func(() => { + assert_in_array(document.fullscreenElement, [a, b]); + order.push(document.fullscreenElement.id); + if (order.length == 2) { + assert_array_equals(order, ['b', 'a'], + 'fullscreenElement IDs in fullscreenchange events'); + t.done(); + } + }); + document.onfullscreenerror = t.unreached_func('fullscreenerror event'); + + trusted_click(t.step_func(() => { + b.contentDocument.body.requestFullscreen(); + a.contentDocument.body.requestFullscreen(); + }), document.body); +}); +</script> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/historical.html b/tests/wpt/web-platform-tests/fullscreen/api/historical.html new file mode 100644 index 00000000000..8b3e3c03e9c --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/historical.html @@ -0,0 +1,38 @@ +<!doctype html> +<title>Historical Fullscreen features</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +[ + "onwebkitfullscreenchange", + "onwebkitfullscreenerror", + "webkitCurrentFullScreenElement", + "webkitFullscreenElement", + "webkitFullscreenEnabled", + "webkitIsFullScreen", + "webkitRequestFullScreen", + "webkitRequestFullscreen", + "webkitDisplayingFullscreen", + "webkitEnterFullScreen", + "webkitEnterFullscreen", + "webkitExitFullScreen", + "webkitExitFullscreen", + "webkitSupportsFullscreen", +].forEach(function(member) { + ["webkit", "moz", "ms"].forEach(function(prefix) { + var alias = member.replace("webkit", prefix); + var clarifyTestName = (alias.indexOf('FullScreen') != -1 ? ' (uppercase S)' : ''); + + test(function() { + assert_false(alias in document.createElement('video')); + }, '<video> member must not be supported: ' + alias + clarifyTestName); + + test(function() { + assert_false(alias in document); + }, 'Document member must not be supported: ' + alias + clarifyTestName); + + // Some of the combinations tested here have never been supported, but + // it is convenient to just test all names on both <video> and document. + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/gyroscope/OWNERS b/tests/wpt/web-platform-tests/gyroscope/OWNERS new file mode 100644 index 00000000000..cc7c3879319 --- /dev/null +++ b/tests/wpt/web-platform-tests/gyroscope/OWNERS @@ -0,0 +1,5 @@ +@zqzhang +@dontcallmedom +@tobie +@riju +@Honry diff --git a/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html b/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html new file mode 100644 index 00000000000..53d3b81cce6 --- /dev/null +++ b/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Gyroscope Sensor IDL tests</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/gyroscope/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> +<style> + pre { + display: none; + } +</style> +<div id="log"></div> + +<pre id="idl"> +interface Event { +}; + +interface EventTarget { +}; + +interface EventHandler { +}; + +interface Error { +}; + +dictionary EventInit { +}; +</pre> + +<pre id="generic-idl"> +[SecureContext] +interface Sensor : EventTarget { + readonly attribute SensorState state; + readonly attribute SensorReading? reading; + void start(); + void stop(); + attribute EventHandler onchange; + attribute EventHandler onactivate; + attribute EventHandler onerror; +}; + +dictionary SensorOptions { + double? frequency; +}; + +enum SensorState { + "idle", + "activating", + "activated", + "errored" +}; + +[SecureContext] +interface SensorReading { + readonly attribute DOMHighResTimeStamp timeStamp; +}; + +[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)] +interface SensorErrorEvent : Event { + readonly attribute Error error; +}; + +dictionary SensorErrorEventInit : EventInit { + required Error error; +}; + +</pre> + +<pre id="gyroscope-idl"> +[Constructor(optional SensorOptions sensorOptions)] +interface Gyroscope : Sensor { + readonly attribute GyroscopeReading? reading; +}; + +[Constructor(GyroscopeReadingInit GyroscopeReadingInit)] +interface GyroscopeReading : SensorReading { + readonly attribute unrestricted double x; + readonly attribute unrestricted double y; + readonly attribute unrestricted double z; +}; + +dictionary GyroscopeReadingInit { + unrestricted double x = 0; + unrestricted double y = 0; + unrestricted double z = 0; +}; +</pre> + +<script> +(function() { + "use strict"; + var idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById('idl').textContent); + idl_array.add_untested_idls(document.getElementById('generic-idl').textContent); + idl_array.add_idls(document.getElementById('gyroscope-idl').textContent); + + idl_array.add_objects({ + Gyroscope: ['new Gyroscope();'], + GyroscopeReading: ['new GyroscopeReading({x: 0.5, y: 0.5, z: 0.5});'] + }); + + idl_array.test(); +})(); +</script> diff --git a/tests/wpt/web-platform-tests/html-media-capture/capture_fallback_file_upload.html b/tests/wpt/web-platform-tests/html-media-capture/capture_fallback_file_upload-manual.html index 2d25aa14f84..2d25aa14f84 100644 --- a/tests/wpt/web-platform-tests/html-media-capture/capture_fallback_file_upload.html +++ b/tests/wpt/web-platform-tests/html-media-capture/capture_fallback_file_upload-manual.html diff --git a/tests/wpt/web-platform-tests/html/OWNERS b/tests/wpt/web-platform-tests/html/OWNERS index c98635fc684..76cdd41ab6a 100644 --- a/tests/wpt/web-platform-tests/html/OWNERS +++ b/tests/wpt/web-platform-tests/html/OWNERS @@ -3,7 +3,6 @@ @gsnedders @jdm @jgraham -@plehegar @sideshowbarker @zcorpan @zqzhang diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/a.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/a.html new file mode 100644 index 00000000000..55b73e11535 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/a.html @@ -0,0 +1 @@ +Welcome to A.
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/b.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/b.html new file mode 100644 index 00000000000..8f2fc900dda --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/b.html @@ -0,0 +1 @@ +Welcome to B.
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/c.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/c.html new file mode 100644 index 00000000000..db494e878e2 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/resources/c.html @@ -0,0 +1 @@ +Welcome to C.
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html new file mode 100644 index 00000000000..d7037343d7d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html @@ -0,0 +1,38 @@ +<title>Test same-URL navigation and its effects on history</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id=log></div> +<iframe src=resources/a.html></iframe> +<script> +async_test((t) => { + let state = "begin" + self[0].frameElement.onload = t.step_func(() => { + if(state === "b first") { + assert_equals(history.length, 2) + + state = "c first" + self[0].location = "resources/c.html" + } else if (state === "c first") { + assert_equals(history.length, 3) + + state = "a second" + history.back(2) + } else if (state === "a second") { + assert_equals(history.length, 3) + + state = "a third" + self[0].location.href = "resources/a.html" + } else if (state === "a third") { + assert_equals(history.length, 3) + t.done() + } + }) + onload = t.step_func(() => { + assert_equals(state, "begin") + assert_equals(history.length, 1) + + state = "b first" + self[0].location = "resources/b.html" + }) +}) +</script> diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html new file mode 100644 index 00000000000..19e23b5c2a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects-exceptions.html @@ -0,0 +1,329 @@ +<!-- Once most browsers pass this test it can replace cross-origin-objects.html. It is meant to be + identical (please verify), except for also checking that the exceptions are correct. --> +<!doctype html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<title>Cross-origin behavior of Window and Location</title> +<link rel="author" title="Bobby Holley (:bholley)" href="bobbyholley@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#security-window"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#security-location"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<div id=log></div> +<iframe id="B"></iframe> +<iframe id="C"></iframe> +<script> +/* + * Setup boilerplate. This gives us a same-origin window "B" and a cross-origin + * window "C". + */ +var host_info = get_host_info(); + +setup({explicit_done: true}); +path = location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/frame.html'; +var B = document.getElementById('B').contentWindow; +var C = document.getElementById('C').contentWindow; +B.frameElement.uriToLoad = path; +C.frameElement.uriToLoad = get_host_info().HTTP_REMOTE_ORIGIN + path; + +function reloadSubframes(cb) { + var iframes = document.getElementsByTagName('iframe'); + iframes.forEach = Array.prototype.forEach; + var count = 0; + function frameLoaded() { + this.onload = null; + if (++count == iframes.length) + cb(); + } + iframes.forEach(function(ifr) { ifr.onload = frameLoaded; ifr.setAttribute('src', ifr.uriToLoad); }); +} +function isObject(x) { return Object(x) === x; } + +/* + * Note: we eschew assert_equals in a lot of these tests, since the harness ends + * up throwing when it tries to format a message involving a cross-origin object. + */ + +var testList = []; +function addTest(fun, desc) { testList.push([fun, desc]); } + + +/* + * Basic sanity testing. + */ + +addTest(function() { + // Note: we do not check location.host as its default port semantics are hard to reflect statically + assert_equals(location.hostname, host_info.ORIGINAL_HOST, 'Need to run the top-level test from domain ' + host_info.ORIGINAL_HOST); + assert_equals(get_port(location), host_info.HTTP_PORT, 'Need to run the top-level test from port ' + host_info.HTTP_PORT); + assert_equals(B.parent, window, "window.parent works same-origin"); + assert_equals(C.parent, window, "window.parent works cross-origin"); + assert_equals(B.location.pathname, path, "location.href works same-origin"); + assert_throws("SecurityError", function() { C.location.pathname; }, "location.pathname throws cross-origin"); + assert_equals(B.frames, 'override', "Overrides visible in the same-origin case"); + assert_equals(C.frames, C, "Overrides invisible in the cross-origin case"); +}, "Basic sanity-checking"); + +/* + * Whitelist behavior. + * + * Also tests for [[GetOwnProperty]] and [[HasOwnProperty]] behavior. + */ + +var whitelistedWindowProps = ['location', 'postMessage', 'window', 'frames', 'self', 'top', 'parent', + 'opener', 'closed', 'close', 'blur', 'focus', 'length']; +addTest(function() { + for (var prop in window) { + if (whitelistedWindowProps.indexOf(prop) != -1) { + C[prop]; // Shouldn't throw. + Object.getOwnPropertyDescriptor(C, prop); // Shouldn't throw. + assert_true(Object.prototype.hasOwnProperty.call(C, prop), "hasOwnProperty for " + prop); + } else { + assert_throws("SecurityError", function() { C[prop]; }, "Should throw when accessing " + prop + " on Window"); + assert_throws("SecurityError", function() { Object.getOwnPropertyDescriptor(C, prop); }, + "Should throw when accessing property descriptor for " + prop + " on Window"); + assert_throws("SecurityError", function() { Object.prototype.hasOwnProperty.call(C, prop); }, + "Should throw when invoking hasOwnProperty for " + prop + " on Window"); + } + if (prop != 'location') + assert_throws("SecurityError", function() { C[prop] = undefined; }, "Should throw when writing to " + prop + " on Window"); + } + for (var prop in location) { + if (prop == 'replace') { + C.location[prop]; // Shouldn't throw. + Object.getOwnPropertyDescriptor(C.location, prop); // Shouldn't throw. + assert_true(Object.prototype.hasOwnProperty.call(C.location, prop), "hasOwnProperty for " + prop); + } + else { + assert_throws("SecurityError", function() { C[prop]; }, "Should throw when accessing " + prop + " on Location"); + assert_throws("SecurityError", function() { Object.getOwnPropertyDescriptor(C, prop); }, + "Should throw when accessing property descriptor for " + prop + " on Location"); + assert_throws("SecurityError", function() { Object.prototype.hasOwnProperty.call(C, prop); }, + "Should throw when invoking hasOwnProperty for " + prop + " on Location"); + } + if (prop != 'href') + assert_throws("SecurityError", function() { C[prop] = undefined; }, "Should throw when writing to " + prop + " on Location"); + } +}, "Only whitelisted properties are accessible cross-origin"); + +/* + * ES Internal Methods. + */ + +/* + * [[GetPrototypeOf]] + */ +addTest(function() { + assert_true(Object.getPrototypeOf(C) === null, "cross-origin Window proto is null"); + assert_true(Object.getPrototypeOf(C.location) === null, "cross-origin Location proto is null (__proto__)"); + var protoGetter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').get; + assert_true(protoGetter.call(C) === null, "cross-origin Window proto is null"); + assert_true(protoGetter.call(C.location) === null, "cross-origin Location proto is null (__proto__)"); + assert_throws("SecurityError", function() { C.__proto__; }, "__proto__ property not available cross-origin"); + assert_throws("SecurityError", function() { C.location.__proto__; }, "__proto__ property not available cross-origin"); + +}, "[[GetPrototypeOf]] should return null"); + +/* + * [[SetPrototypeOf]] + */ +addTest(function() { + assert_throws("SecurityError", function() { C.__proto__ = new Object(); }, "proto set on cross-origin Window"); + assert_throws("SecurityError", function() { C.location.__proto__ = new Object(); }, "proto set on cross-origin Location"); + var setters = [Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set]; + if (Object.setPrototypeOf) + setters.push(function(p) { Object.setPrototypeOf(this, p); }); + setters.forEach(function(protoSetter) { + assert_throws(new TypeError, function() { protoSetter.call(C, new Object()); }, "proto setter |call| on cross-origin Window"); + assert_throws(new TypeError, function() { protoSetter.call(C.location, new Object()); }, "proto setter |call| on cross-origin Location"); + }); +}, "[[SetPrototypeOf]] should throw"); + +/* + * [[IsExtensible]] + */ +addTest(function() { + assert_true(Object.isExtensible(C), "cross-origin Window should be extensible"); + assert_true(Object.isExtensible(C.location), "cross-origin Location should be extensible"); +}, "[[IsExtensible]] should return true for cross-origin objects"); + +/* + * [[PreventExtensions]] + */ +addTest(function() { + assert_throws(new TypeError, function() { Object.preventExtensions(C) }, + "preventExtensions on cross-origin Window should throw"); + assert_throws(new TypeError, function() { Object.preventExtensions(C.location) }, + "preventExtensions on cross-origin Location should throw"); +}, "[[PreventExtensions]] should throw for cross-origin objects"); + +/* + * [[GetOwnProperty]] + */ + +addTest(function() { + assert_true(isObject(Object.getOwnPropertyDescriptor(C, 'close')), "C.close is |own|"); + assert_true(isObject(Object.getOwnPropertyDescriptor(C, 'top')), "C.top is |own|"); + assert_true(isObject(Object.getOwnPropertyDescriptor(C.location, 'href')), "C.location.href is |own|"); + assert_true(isObject(Object.getOwnPropertyDescriptor(C.location, 'replace')), "C.location.replace is |own|"); +}, "[[GetOwnProperty]] - Properties on cross-origin objects should be reported |own|"); + +function checkPropertyDescriptor(desc, propName, expectWritable) { + assert_true(isObject(desc), "property descriptor for " + propName + " should exist"); + assert_equals(desc.enumerable, false, "property descriptor for " + propName + " should be non-enumerable"); + assert_equals(desc.configurable, true, "property descriptor for " + propName + " should be configurable"); + if ('value' in desc) + assert_equals(desc.writable, expectWritable, "property descriptor for " + propName + " should have writable: " + expectWritable); + else + assert_equals(typeof desc.set != 'undefined', expectWritable, + "property descriptor for " + propName + " should " + (expectWritable ? "" : "not ") + "have setter"); +} + +addTest(function() { + whitelistedWindowProps.forEach(function(prop) { + var desc = Object.getOwnPropertyDescriptor(C, prop); + checkPropertyDescriptor(desc, prop, prop == 'location'); + }); + checkPropertyDescriptor(Object.getOwnPropertyDescriptor(C.location, 'replace'), 'replace', false); + checkPropertyDescriptor(Object.getOwnPropertyDescriptor(C.location, 'href'), 'href', true); + assert_equals(typeof Object.getOwnPropertyDescriptor(C.location, 'href').get, 'undefined', "Cross-origin location should have no href getter"); +}, "[[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly"); + +/* + * [[Delete]] + */ +addTest(function() { + assert_throws("SecurityError", function() { delete C[0]; }, "Can't delete cross-origin indexed property"); + assert_throws("SecurityError", function() { delete C[100]; }, "Can't delete cross-origin indexed property"); + assert_throws("SecurityError", function() { delete C.location; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.parent; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.length; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.document; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.foopy; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.location.href; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.location.replace; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.location.port; }, "Can't delete cross-origin property"); + assert_throws("SecurityError", function() { delete C.location.foopy; }, "Can't delete cross-origin property"); +}, "[[Delete]] Should throw on cross-origin objects"); + +/* + * [[DefineOwnProperty]] + */ +function checkDefine(obj, prop) { + var valueDesc = { configurable: true, enumerable: false, writable: false, value: 2 }; + var accessorDesc = { configurable: true, enumerable: false, get: function() {} }; + assert_throws("SecurityError", function() { Object.defineProperty(obj, prop, valueDesc); }, "Can't define cross-origin value property " + prop); + assert_throws("SecurityError", function() { Object.defineProperty(obj, prop, accessorDesc); }, "Can't define cross-origin accessor property " + prop); +} +addTest(function() { + checkDefine(C, 'length'); + checkDefine(C, 'parent'); + checkDefine(C, 'location'); + checkDefine(C, 'document'); + checkDefine(C, 'foopy'); + checkDefine(C.location, 'href'); + checkDefine(C.location, 'replace'); + checkDefine(C.location, 'port'); + checkDefine(C.location, 'foopy'); +}, "[[DefineOwnProperty]] Should throw for cross-origin objects"); + +/* + * [[Enumerate]] + */ + +addTest(function() { + for (var prop in C) + assert_unreached("Shouldn't have been able to enumerate " + prop + " on cross-origin Window"); + for (var prop in C.location) + assert_unreached("Shouldn't have been able to enumerate " + prop + " on cross-origin Location"); +}, "[[Enumerate]] should return an empty iterator"); + +/* + * [[OwnPropertyKeys]] + */ + +addTest(function() { + assert_array_equals(whitelistedWindowProps.sort(), Object.getOwnPropertyNames(C).sort(), + "Object.getOwnPropertyNames() gives the right answer for cross-origin Window"); + assert_array_equals(Object.getOwnPropertyNames(C.location).sort(), ['href', 'replace'], + "Object.getOwnPropertyNames() gives the right answer for cross-origin Location"); +}, "[[OwnPropertyKeys]] should return all properties from cross-origin objects"); + +addTest(function() { + assert_true(B.eval('parent.C') === C, "A and B observe the same identity for C's Window"); + assert_true(B.eval('parent.C.location') === C.location, "A and B observe the same identity for C's Location"); +}, "A and B jointly observe the same identity for cross-origin Window and Location"); + +function checkFunction(f, proto) { + var name = f.name || '<missing name>'; + assert_equals(typeof f, 'function', name + " is a function"); + assert_equals(Object.getPrototypeOf(f), proto, f.name + " has the right prototype"); +} + +addTest(function() { + checkFunction(C.close, Function.prototype); + checkFunction(C.location.replace, Function.prototype); +}, "Cross-origin functions get local Function.prototype"); + +addTest(function() { + assert_true(isObject(Object.getOwnPropertyDescriptor(C, 'parent')), + "Need to be able to use Object.getOwnPropertyDescriptor do this test"); + checkFunction(Object.getOwnPropertyDescriptor(C, 'parent').get, Function.prototype); + checkFunction(Object.getOwnPropertyDescriptor(C.location, 'href').set, Function.prototype); +}, "Cross-origin Window accessors get local Function.prototype"); + +addTest(function() { + checkFunction(close, Function.prototype); + assert_true(close != B.close, 'same-origin Window functions get their own object'); + assert_true(close != C.close, 'cross-origin Window functions get their own object'); + var close_B = B.eval('parent.C.close'); + assert_true(close != close_B, 'close_B is unique when viewed by the parent'); + assert_true(close_B != C.close, 'different Window functions per-incumbent script settings object'); + checkFunction(close_B, B.Function.prototype); + + checkFunction(location.replace, Function.prototype); + assert_true(location.replace != C.location.replace, "cross-origin Location functions get their own object"); + var replace_B = B.eval('parent.C.location.replace'); + assert_true(replace_B != C.location.replace, 'different Location functions per-incumbent script settings object'); + checkFunction(replace_B, B.Function.prototype); +}, "Same-origin observers get different functions for cross-origin objects"); + +addTest(function() { + assert_true(isObject(Object.getOwnPropertyDescriptor(C, 'parent')), + "Need to be able to use Object.getOwnPropertyDescriptor do this test"); + var get_self_parent = Object.getOwnPropertyDescriptor(window, 'parent').get; + var get_parent_A = Object.getOwnPropertyDescriptor(C, 'parent').get; + var get_parent_B = B.eval('Object.getOwnPropertyDescriptor(parent.C, "parent").get'); + assert_true(get_self_parent != get_parent_A, 'different Window accessors per-incumbent script settings object'); + assert_true(get_parent_A != get_parent_B, 'different Window accessors per-incumbent script settings object'); + checkFunction(get_self_parent, Function.prototype); + checkFunction(get_parent_A, Function.prototype); + checkFunction(get_parent_B, B.Function.prototype); +}, "Same-origin observers get different accessors for cross-origin Window"); + +addTest(function() { + var set_self_href = Object.getOwnPropertyDescriptor(window.location, 'href').set; + var set_href_A = Object.getOwnPropertyDescriptor(C.location, 'href').set; + var set_href_B = B.eval('Object.getOwnPropertyDescriptor(parent.C.location, "href").set'); + assert_true(set_self_href != set_href_A, 'different Location accessors per-incumbent script settings object'); + assert_true(set_href_A != set_href_B, 'different Location accessors per-incumbent script settings object'); + checkFunction(set_self_href, Function.prototype); + checkFunction(set_href_A, Function.prototype); + checkFunction(set_href_B, B.Function.prototype); +}, "Same-origin observers get different accessors for cross-origin Location"); + +// We do a fresh load of the subframes for each test to minimize side-effects. +// It would be nice to reload ourselves as well, but we can't do that without +// disrupting the test harness. +function runNextTest() { + var entry = testList.shift(); + test(entry[0], entry[1]); + if (testList.length != 0) + reloadSubframes(runNextTest); + else + done(); +} +reloadSubframes(runNextTest); + +</script> diff --git a/tests/wpt/web-platform-tests/html/dom/elements-embedded.js b/tests/wpt/web-platform-tests/html/dom/elements-embedded.js index fb9fb91d472..1b6e4215aa6 100644 --- a/tests/wpt/web-platform-tests/html/dom/elements-embedded.js +++ b/tests/wpt/web-platform-tests/html/dom/elements-embedded.js @@ -10,6 +10,7 @@ var embeddedElements = { isMap: "boolean", width: {type: "unsigned long", customGetter: true}, height: {type: "unsigned long", customGetter: true}, + referrerPolicy: {type: "enum", keywords: ["", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"]}, // Obsolete name: "string", @@ -27,8 +28,11 @@ var embeddedElements = { name: "string", sandbox: "settable tokenlist", allowFullscreen: "boolean", + allowUserMedia: "boolean", + allowPaymentRequest: "boolean", width: "string", height: "string", + referrerPolicy: {type: "enum", keywords: ["", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"]}, // Obsolete align: "string", @@ -137,6 +141,7 @@ var embeddedElements = { ping: "string", rel: "string", relList: {type: "tokenlist", domAttrName: "rel"}, + referrerPolicy: {type: "enum", keywords: ["", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"]}, // HTMLHyperlinkElementUtils href: "url", diff --git a/tests/wpt/web-platform-tests/html/dom/elements-metadata.js b/tests/wpt/web-platform-tests/html/dom/elements-metadata.js index 05d61a74d72..73cbfc1a454 100644 --- a/tests/wpt/web-platform-tests/html/dom/elements-metadata.js +++ b/tests/wpt/web-platform-tests/html/dom/elements-metadata.js @@ -12,10 +12,14 @@ var metadataElements = { crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}, isNullable: true, defaultVal: null, invalidVal: "anonymous"}, rel: "string", relList: {type: "tokenlist", domAttrName: "rel"}, + // as: {}, XXX TODO: reflecting IDL attribute is an IDL enumeration media: "string", + nonce: "string", + integrity: "string", hreflang: "string", type: "string", sizes: "settable tokenlist", + referrerPolicy: {type: "enum", keywords: ["", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"]}, // Obsolete charset: "string", diff --git a/tests/wpt/web-platform-tests/html/dom/elements-misc.js b/tests/wpt/web-platform-tests/html/dom/elements-misc.js index 8990afecfb9..e0d5399b32f 100644 --- a/tests/wpt/web-platform-tests/html/dom/elements-misc.js +++ b/tests/wpt/web-platform-tests/html/dom/elements-misc.js @@ -14,6 +14,8 @@ var miscElements = { // TODO: async attribute (complicated). defer: "boolean", crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}, isNullable: true, defaultVal: null, invalidVal: "anonymous"}, + nonce: "string", + integrity: "string", }, noscript: {}, diff --git a/tests/wpt/web-platform-tests/html/dom/elements-text.js b/tests/wpt/web-platform-tests/html/dom/elements-text.js index 268eb269cb4..56157fabf19 100644 --- a/tests/wpt/web-platform-tests/html/dom/elements-text.js +++ b/tests/wpt/web-platform-tests/html/dom/elements-text.js @@ -9,6 +9,7 @@ var textElements = { relList: {type: "tokenlist", domAttrName: "rel"}, hreflang: "string", type: "string", + referrerPolicy: {type: "enum", keywords: ["", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"]}, // HTMLHyperlinkElementUtils href: "url", diff --git a/tests/wpt/web-platform-tests/html/dom/interfaces.html b/tests/wpt/web-platform-tests/html/dom/interfaces.html index d698f3bff26..b9ab7b0b439 100644 --- a/tests/wpt/web-platform-tests/html/dom/interfaces.html +++ b/tests/wpt/web-platform-tests/html/dom/interfaces.html @@ -1017,15 +1017,20 @@ interface HTMLBaseElement : HTMLElement { attribute DOMString target; }; +[HTMLConstructor] interface HTMLLinkElement : HTMLElement { - attribute DOMString href; - attribute DOMString? crossOrigin; - attribute DOMString rel; - [PutForwards=value] readonly attribute DOMTokenList relList; - attribute DOMString media; - attribute DOMString hreflang; - attribute DOMString type; - [PutForwards=value] readonly attribute DOMTokenList sizes; + [CEReactions] attribute USVString href; + [CEReactions] attribute DOMString? crossOrigin; + [CEReactions] attribute DOMString rel; + // [CEReactions] attribute RequestDestination as; // (default "") XXX TODO + [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList; + [CEReactions] attribute DOMString media; + [CEReactions] attribute DOMString nonce; + [CEReactions] attribute DOMString integrity; + [CEReactions] attribute DOMString hreflang; + [CEReactions] attribute DOMString type; + [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList sizes; + [CEReactions] attribute DOMString referrerPolicy; // also has obsolete members }; @@ -1098,16 +1103,21 @@ interface HTMLDivElement : HTMLElement { // also has obsolete members }; +[HTMLConstructor] interface HTMLAnchorElement : HTMLElement { - attribute DOMString target; - attribute DOMString download; + [CEReactions] attribute DOMString target; + [CEReactions] attribute DOMString download; [CEReactions] attribute USVString ping; - attribute DOMString rel; - [PutForwards=value] readonly attribute DOMTokenList relList; - attribute DOMString hreflang; - attribute DOMString type; + [CEReactions] attribute DOMString rel; + [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList; + [CEReactions] attribute DOMString hreflang; + [CEReactions] attribute DOMString type; + + [CEReactions] attribute DOMString text; - attribute DOMString text; + [CEReactions] attribute DOMString referrerPolicy; + + // also has obsolete members }; HTMLAnchorElement implements HTMLHyperlinkElementUtils; @@ -1138,37 +1148,41 @@ partial interface HTMLSourceElement { attribute DOMString media; }; -[NamedConstructor=Image(optional unsigned long width, optional unsigned long height)] +[HTMLConstructor, NamedConstructor=Image(optional unsigned long width, optional unsigned long height)] interface HTMLImageElement : HTMLElement { - attribute DOMString alt; - attribute DOMString src; - attribute DOMString srcset; - attribute DOMString sizes; - attribute DOMString? crossOrigin; - attribute DOMString useMap; - attribute boolean isMap; - attribute unsigned long width; - attribute unsigned long height; + [CEReactions] attribute DOMString alt; + [CEReactions] attribute USVString src; + [CEReactions] attribute USVString srcset; + [CEReactions] attribute DOMString sizes; + [CEReactions] attribute DOMString? crossOrigin; + [CEReactions] attribute DOMString useMap; + [CEReactions] attribute boolean isMap; + [CEReactions] attribute unsigned long width; + [CEReactions] attribute unsigned long height; readonly attribute unsigned long naturalWidth; readonly attribute unsigned long naturalHeight; readonly attribute boolean complete; - readonly attribute DOMString currentSrc; + readonly attribute USVString currentSrc; + [CEReactions] attribute DOMString referrerPolicy; // also has obsolete members }; +[HTMLConstructor] interface HTMLIFrameElement : HTMLElement { - attribute DOMString src; - attribute DOMString srcdoc; - attribute DOMString name; - [PutForwards=value] readonly attribute DOMTokenList sandbox; - attribute boolean allowFullscreen; - attribute DOMString width; - attribute DOMString height; + [CEReactions] attribute USVString src; + [CEReactions] attribute DOMString srcdoc; + [CEReactions] attribute DOMString name; + [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox; + [CEReactions] attribute boolean allowFullscreen; + [CEReactions] attribute boolean allowUserMedia; + [CEReactions] attribute boolean allowPaymentRequest; + [CEReactions] attribute DOMString width; + [CEReactions] attribute DOMString height; + [CEReactions] attribute DOMString referrerPolicy; readonly attribute Document? contentDocument; readonly attribute WindowProxy? contentWindow; - - // also has obsolete members + Document? getSVGDocument(); }; interface HTMLEmbedElement : HTMLElement { @@ -1416,16 +1430,19 @@ interface HTMLMapElement : HTMLElement { readonly attribute HTMLCollection areas; }; +[HTMLConstructor] interface HTMLAreaElement : HTMLElement { - attribute DOMString alt; - attribute DOMString coords; - attribute DOMString shape; - attribute DOMString target; - attribute DOMString download; + [CEReactions] attribute DOMString alt; + [CEReactions] attribute DOMString coords; + [CEReactions] attribute DOMString shape; + [CEReactions] attribute DOMString target; + [CEReactions] attribute DOMString download; [CEReactions] attribute USVString ping; - attribute DOMString rel; - [PutForwards=value] readonly attribute DOMTokenList relList; - // hreflang and type are not reflected + [CEReactions] attribute DOMString rel; + [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList; + [CEReactions] attribute DOMString referrerPolicy; + + // also has obsolete members }; HTMLAreaElement implements HTMLHyperlinkElementUtils; @@ -1835,8 +1852,8 @@ dictionary RelatedEventInit : EventInit { interface HTMLDialogElement : HTMLElement { attribute boolean open; attribute DOMString returnValue; - void show(optional (MouseEvent or Element) anchor); - void showModal(optional (MouseEvent or Element) anchor); + void show(); + void showModal(); void close(optional DOMString returnValue); }; @@ -2395,6 +2412,7 @@ typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler; [NoInterfaceObject] interface GlobalEventHandlers { attribute EventHandler onabort; + attribute EventHandler onauxclick; attribute EventHandler onblur; attribute EventHandler oncancel; attribute EventHandler oncanplay; @@ -2969,24 +2987,24 @@ partial interface HTMLHtmlElement { }; partial interface HTMLIFrameElement { - attribute DOMString align; - attribute DOMString scrolling; - attribute DOMString frameBorder; - attribute DOMString longDesc; + [CEReactions] attribute DOMString align; + [CEReactions] attribute DOMString scrolling; + [CEReactions] attribute DOMString frameBorder; + [CEReactions] attribute USVString longDesc; - [TreatNullAs=EmptyString] attribute DOMString marginHeight; - [TreatNullAs=EmptyString] attribute DOMString marginWidth; + [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginHeight; + [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginWidth; }; partial interface HTMLImageElement { - attribute DOMString name; - attribute DOMString lowsrc; - attribute DOMString align; - attribute unsigned long hspace; - attribute unsigned long vspace; - attribute DOMString longDesc; + [CEReactions] attribute DOMString name; + [CEReactions] attribute USVString lowsrc; + [CEReactions] attribute DOMString align; + [CEReactions] attribute unsigned long hspace; + [CEReactions] attribute unsigned long vspace; + [CEReactions] attribute USVString longDesc; - [TreatNullAs=EmptyString] attribute DOMString border; + [CEReactions, TreatNullAs=EmptyString] attribute DOMString border; }; partial interface HTMLInputElement { @@ -3003,9 +3021,9 @@ partial interface HTMLLIElement { }; partial interface HTMLLinkElement { - attribute DOMString charset; - attribute DOMString rev; - attribute DOMString target; + [CEReactions] attribute DOMString charset; + [CEReactions] attribute DOMString rev; + [CEReactions] attribute DOMString target; }; partial interface HTMLMenuElement { diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml new file mode 100644 index 00000000000..2a2c7f547cc --- /dev/null +++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Cross-domain canvas data must not populate the dataTransfer</title> +<script src="../../resources/crossorigin.sub.js"></script> +<style type="text/css"> +div { + width:105px; + min-height:105px; + text-align:center; + margin-top:20px; + padding:10px; + border:solid thin navy; +} +p:first-child { + padding-left:12px; +} +#image { visibility: hidden; } +</style> +</head> +<body> +<p> + <canvas width="100" height="100" draggable="true">Canvas</canvas> +</p> +<p>Drag the navy square above to the box below.</p> +<div></div> +<p><img id="image" alt="" width="100" height="100" /></p> + +<script><![CDATA[ +document.getElementsByTagName("img")[0].src = crossOriginUrl("www", "../../resources/100x100-navy.png"); + +window.onload = function() { + var canvas = document.getElementsByTagName('canvas')[0], div = document.getElementsByTagName('div')[0], failed = []; + var context = canvas.getContext('2d'); + var image = document.getElementById('image'); + context.drawImage(image, 0, 0); + div.ondragover = div.ondragenter = function(e) { + e.preventDefault(); + e.dataTransfer.dropEffect = 'copy'; + }; + div.ondrop = canvas.ondragstart = function(e) { + if( e.type == 'dragstart' ) { + e.dataTransfer.setData('Text', 'dummy text'); + e.dataTransfer.dropEffect = 'copy'; + } + for( var i = 0; i < e.dataTransfer.types.length; i++ ) { + if( e.dataTransfer.types[i].match(/image\//) ) { + failed[failed.length] = e.dataTransfer.types[i]; + } + } + if( e.type == 'drop' ) { + e.preventDefault(); + document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS'; + } + }; +}; +]]></script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.xhtml deleted file mode 100644 index d99c73e6e0e..00000000000 --- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.xhtml +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Cross-domain canvas data must not populate the dataTransfer</title> -<script src="../../resources/crossorigin.js"></script> -<style type="text/css"> -div { - width:105px; - min-height:105px; - text-align:center; - margin-top:20px; - padding:10px; - border:solid thin navy; -} -p:first-child { - padding-left:12px; -} -#image { visibility: hidden; } -</style> -</head> -<body> -<p> - <canvas width="100" height="100" draggable="true">Canvas</canvas> -</p> -<p>Drag the navy square above to the box below.</p> -<div></div> -<p><img id="image" alt="" width="100" height="100" /></p> - -<script><![CDATA[ -document.getElementsByTagName("img")[0].src = crossOriginUrl("www", "../../resources/100x100-navy.png"); - -window.onload = function() { - var canvas = document.getElementsByTagName('canvas')[0], div = document.getElementsByTagName('div')[0], failed = []; - var context = canvas.getContext('2d'); - var image = document.getElementById('image'); - context.drawImage(image, 0, 0); - div.ondragover = div.ondragenter = function(e) { - e.preventDefault(); - e.dataTransfer.dropEffect = 'copy'; - }; - div.ondrop = canvas.ondragstart = function(e) { - if( e.type == 'dragstart' ) { - e.dataTransfer.setData('Text', 'dummy text'); - e.dataTransfer.dropEffect = 'copy'; - } - for( var i = 0; i < e.dataTransfer.types.length; i++ ) { - if( e.dataTransfer.types[i].match(/image\//) ) { - failed[failed.length] = e.dataTransfer.types[i]; - } - } - if( e.type == 'drop' ) { - e.preventDefault(); - document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS'; - } - }; -}; -]]></script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.html deleted file mode 100644 index 7b48d3e16ec..00000000000 --- a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.html +++ /dev/null @@ -1,25 +0,0 @@ -<!DOCTYPE html> -<title>drag & drop - cross-domain cross-document data drop</title> -<script src="../resources/crossorigin.js"></script> -<style> - body > div { - height: 200px; - width: 200px; - background-color: orange; - } -</style> - -<script> -window.onload = function() { - var orange = document.getElementsByTagName('div')[0]; - orange.ondragstart = function(e) { - e.dataTransfer.effectAllowed = 'copy'; - e.dataTransfer.setData('text', 'dummy text'); - }; -}; -</script> - -<div draggable="true"></div> -<p><iframe height="300" width="500"></iframe></p> -<script>document.getElementsByTagName("iframe")[0].src = crossOriginUrl("www", "001-1.html"); -<noscript><p>Enable JavaScript and reload</p></noscript> diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html new file mode 100644 index 00000000000..b64038e915b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>drag & drop - cross-domain cross-document data drop</title> +<script src="../resources/crossorigin.sub.js"></script> +<style> + body > div { + height: 200px; + width: 200px; + background-color: orange; + } +</style> + +<script> +window.onload = function() { + var orange = document.getElementsByTagName('div')[0]; + orange.ondragstart = function(e) { + e.dataTransfer.effectAllowed = 'copy'; + e.dataTransfer.setData('text', 'dummy text'); + }; +}; +</script> + +<div draggable="true"></div> +<p><iframe height="300" width="500"></iframe></p> +<script>document.getElementsByTagName("iframe")[0].src = crossOriginUrl("www", "001-1.html"); +<noscript><p>Enable JavaScript and reload</p></noscript> diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml new file mode 100644 index 00000000000..1c777a8f767 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Cross-domain image data must not populate the dataTransfer</title> +<script src="../../resources/crossorigin.sub.js"></script> +<style type="text/css"> +div { + width:105px; + min-height:105px; + text-align:center; + margin-top:20px; + padding:10px; + border:solid thin navy; +} +</style> +</head> +<body> +<p><img id="image" draggable="true" alt="" width="100" height="100" /></p> +<p>Drag the navy square above to the box below.</p> +<div></div> +<script><![CDATA[ + +document.getElementsByTagName("img")[0].src = crossOriginUrl("www", "../../resources/100x100-navy.png"); + +window.onload = function() { + var image = document.getElementsByTagName('img')[0], div = document.getElementsByTagName('div')[0], failed = []; + div.ondragover = div.ondragenter = function(e) { + e.preventDefault(); + e.dataTransfer.dropEffect = 'copy'; + }; + div.ondrop = image.ondragstart = function(e) { + if( e.type == 'dragstart' ) { + e.dataTransfer.setData('Text', 'dummy text'); + e.dataTransfer.dropEffect = 'copy'; + } + for( var i = 0; i < e.dataTransfer.types.length; i++ ) { + if( e.dataTransfer.types[i].match(/image\//) ) { + failed[failed.length] = e.dataTransfer.types[i]; + } + } + if( e.type == 'drop' ) { + e.preventDefault(); + document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS'; + } + }; +}; +]]></script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.xhtml deleted file mode 100644 index 9eb5c7be32a..00000000000 --- a/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.xhtml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Cross-domain image data must not populate the dataTransfer</title> -<script src="../../resources/crossorigin.js"></script> -<style type="text/css"> -div { - width:105px; - min-height:105px; - text-align:center; - margin-top:20px; - padding:10px; - border:solid thin navy; -} -</style> -</head> -<body> -<p><img id="image" draggable="true" alt="" width="100" height="100" /></p> -<p>Drag the navy square above to the box below.</p> -<div></div> -<script><![CDATA[ - -document.getElementsByTagName("img")[0].src = crossOriginUrl("www", "../../resources/100x100-navy.png"); - -window.onload = function() { - var image = document.getElementsByTagName('img')[0], div = document.getElementsByTagName('div')[0], failed = []; - div.ondragover = div.ondragenter = function(e) { - e.preventDefault(); - e.dataTransfer.dropEffect = 'copy'; - }; - div.ondrop = image.ondragstart = function(e) { - if( e.type == 'dragstart' ) { - e.dataTransfer.setData('Text', 'dummy text'); - e.dataTransfer.dropEffect = 'copy'; - } - for( var i = 0; i < e.dataTransfer.types.length; i++ ) { - if( e.dataTransfer.types[i].match(/image\//) ) { - failed[failed.length] = e.dataTransfer.types[i]; - } - } - if( e.type == 'drop' ) { - e.preventDefault(); - document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS'; - } - }; -}; -]]></script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html b/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html index dab9c575147..d8171abc715 100644 --- a/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html +++ b/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html @@ -3,6 +3,7 @@ <title>Focus fixup rule one (no <dialog>s involved)</title> <link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> <link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule-one"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/forms.html#attr-fieldset-disabled"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -10,13 +11,16 @@ <button id="button1">Button 1</button> <button id="button2">Button 2</button> <button id="button3">Button 3</button> + <fieldset id="fieldset1"><button id="button4">Button 4</button></fieldset> + <fieldset id="fieldset2" disabled><legend><button id="button5">Button 5</button></legend></fieldset> <div id="div" tabindex="0">Div</div> + <div id="editable" contenteditable=true>editor</div> </div> <script> "use strict"; -async_test(t => { +test(() => { const button = document.querySelector("#button1"); button.focus(); @@ -56,6 +60,30 @@ test(() => { }, "Removing the active element from the DOM"); test(() => { + const fieldset = document.querySelector("#fieldset1"); + const button = document.querySelector("#button4"); + button.focus(); + assert_equals(document.activeElement, button, "Sanity check: the button must start focused"); + + fieldset.disabled = true; + + assert_not_equals(document.activeElement, button, "After disabling ancestor fieldset, the button must no longer be focused"); + assert_equals(document.activeElement, document.body, "After disabling ancestor fieldset, the body must be focused"); +}, "Disabling <fieldset> affects its descendants"); + +test(() => { + const fieldset = document.querySelector("#fieldset2"); + const button = document.querySelector("#button5"); + button.focus(); + assert_equals(document.activeElement, button, "Sanity check: the button must start focused"); + + fieldset.insertBefore(document.createElement("legend"), fieldset.firstChild); + + assert_not_equals(document.activeElement, button, "After changing a legend element, the button must no longer be focused"); + assert_equals(document.activeElement, document.body, "After changing a legend element, the body must be focused"); +}, "Changing the first legend element in disabled <fieldset>"); + +test(() => { const div = document.querySelector("#div"); div.focus(); @@ -68,4 +96,14 @@ test(() => { }, "Removing the tabindex attribute from a div"); +test(() => { + const div = document.querySelector("#editable"); + div.focus(); + assert_equals(document.activeElement, div, "Sanity check: the div must start focused"); + + div.contentEditable = false; + + assert_not_equals(document.activeElement, div, "After disabling contentEditable, the div must no longer be focused"); + assert_equals(document.activeElement, document.body, "After disabling contentEditable, the body must be focused"); +}, "Disabling contenteditable"); </script> diff --git a/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start.html b/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start-manual.html index 51b4289b247..51b4289b247 100644 --- a/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start.html +++ b/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start-manual.html diff --git a/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop.html b/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop-manual.html index 57a4e73e4c6..57a4e73e4c6 100644 --- a/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop.html +++ b/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop-manual.html diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html new file mode 100644 index 00000000000..09454a13b20 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Meta refresh is blocked by the allow-scripts sandbox flag at its creation time, not when refresh comes due</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-refresh"> + +<div id="log"></div> + +<script> +"use strict"; + +const sourceIFrame = document.createElement("iframe"); +sourceIFrame.setAttribute("sandbox", "allow-same-origin"); + +const destIFrame = document.createElement("iframe"); + +let sourceLoadCount = 0; +let destLoadCount = 0; + +sourceIFrame.onload = () => { + ++sourceLoadCount; + + if (sourceLoadCount === 2) { + assert_unreached("The iframe from which the meta came from must not refresh"); + } + + maybeStartTest(); +}; + +destIFrame.onload = () => { + ++destLoadCount; + + if (destLoadCount === 2) { + assert_unreached("The iframe into which the meta was moved must not refresh"); + } + + maybeStartTest(); +}; + +function maybeStartTest() { + if (sourceLoadCount === 1 && destLoadCount === 1) { + // Test that no refreshes occur within 3 seconds + step_timeout(done, 3000); + + const meta = sourceIFrame.contentDocument.querySelector("meta"); + destIFrame.contentDocument.body.appendChild(meta); + } +} + +sourceIFrame.src = "support/refresh.sub.html?input=" + encodeURIComponent("1; url=foo"); +destIFrame.src = "support/ufoo"; + +document.body.appendChild(sourceIFrame); +document.body.appendChild(destIFrame); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html new file mode 100644 index 00000000000..f5c4e991829 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Meta refresh of the original iframe is not blocked if moved into a sandboxed iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-refresh"> + +<div id="log"></div> + +<script> +"use strict"; + +const sourceIFrame = document.createElement("iframe"); + +const destIFrame = document.createElement("iframe"); +destIFrame.setAttribute("sandbox", "allow-same-origin"); + +let sourceLoadCount = 0; +let destLoadCount = 0; + +sourceIFrame.onload = () => { + ++sourceLoadCount; + + if (sourceLoadCount === 2) { + assert_equals(sourceIFrame.contentDocument.body.textContent.trim(), "foo"); + done(); + } + + maybeStartTest(); +}; + +destIFrame.onload = () => { + ++destLoadCount; + + if (destLoadCount === 2) { + assert_unreached("The iframe into which the meta was moved must not refresh"); + } + + maybeStartTest(); +}; + +function maybeStartTest() { + if (sourceLoadCount === 1 && destLoadCount === 1) { + const meta = sourceIFrame.contentDocument.querySelector("meta"); + destIFrame.contentDocument.body.appendChild(meta); + } +} + +sourceIFrame.src = "support/refresh.sub.html?input=" + encodeURIComponent("1; url=foo"); +destIFrame.src = "support/ufoo"; + +document.body.appendChild(sourceIFrame); +document.body.appendChild(destIFrame); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html new file mode 100644 index 00000000000..e0896269f30 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/dynamic-append.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Meta refresh applies even when dynamically appended</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#pragma-directives"> + +<div id="log"></div> + +<script> +"use strict"; + +const iframe = document.createElement("iframe"); +let loadCount = 0; + +iframe.onload = () => { + ++loadCount; + const iDocument = iframe.contentDocument; + + if (loadCount === 1) { + iDocument.body.innerHTML = `<meta http-equiv="refresh" content="1; url=foo">`; + } else if (loadCount === 2) { + assert_equals(iDocument.body.textContent.trim(), "foo"); + done(); + } +}; + +iframe.src = "support/ufoo"; +document.body.appendChild(iframe); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html new file mode 100644 index 00000000000..241a8e0fe6e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>When moving between documents, must refresh the original document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-refresh"> + +<div id="log"></div> + +<script> +"use strict"; + +const sourceIFrame = document.createElement("iframe"); +const destIFrame = document.createElement("iframe"); +let sourceLoadCount = 0; +let destLoadCount = 0; + +sourceIFrame.onload = () => { + ++sourceLoadCount; + + if (sourceLoadCount === 2) { + assert_equals(sourceIFrame.contentDocument.body.textContent.trim(), "foo"); + done(); + } + + maybeStartTest(); +}; + +destIFrame.onload = () => { + ++destLoadCount; + + if (destLoadCount === 2) { + assert_unreached("The iframe into which the meta was moved must not refresh"); + } + + maybeStartTest(); +}; + +function maybeStartTest() { + if (sourceLoadCount === 1 && destLoadCount === 1) { + const meta = sourceIFrame.contentDocument.querySelector("meta"); + destIFrame.contentDocument.body.appendChild(meta); + } +} + +sourceIFrame.src = "support/refresh.sub.html?input=" + encodeURIComponent("1; url=foo"); +destIFrame.src = "support/ufoo"; + +document.body.appendChild(sourceIFrame); +document.body.appendChild(destIFrame); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html new file mode 100644 index 00000000000..f711ae024f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Meta refresh only applies while in the document tree, not in a shadow tree</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#pragma-directives"> + +<div id="log"></div> +<script> +"use strict"; + +const iframe = document.createElement("iframe"); +iframe.src = "support/ufoo"; + +let loadCount = 0; + +iframe.onload = () => { + ++loadCount; + const iDocument = iframe.contentDocument; + + if (loadCount === 1) { + const div = iDocument.createElement("div"); + assert_true('attachShadow' in div, 'attachShadow support'); + const shadowRoot = div.attachShadow({ mode: "open" }); + shadowRoot.innerHTML = `<meta http-equiv="refresh" content="1; url=foo">`; + iDocument.body.appendChild(div); + + // Want to make sure no refreshes happen + step_timeout(done, 3000); + } else { + assert_unreached("Got more than 1 load event"); + } +}; + +document.body.appendChild(iframe); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/resetting-a-form/reset-event.html b/tests/wpt/web-platform-tests/html/semantics/forms/resetting-a-form/reset-event.html new file mode 100644 index 00000000000..f7d98f72165 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/resetting-a-form/reset-event.html @@ -0,0 +1,18 @@ +<!doctype html> +<title>Test aspects of the reset event</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + async_test((t) => { + var form = document.createElement("form") + form.onreset = t.step_func_done((e) => { + assert_true(e.bubbles) + assert_true(e.cancelable) + assert_true(e.isTrusted) + assert_equals(e.target, form) + }) + form.reset() + assert_unreached() + }) +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement.html index 0c394cbedd7..9e6e52d7b71 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement.html @@ -38,9 +38,9 @@ test(function () { }, "The form attribute must return the fieldset's form owner"); test(function () { - assert_true(children_outer instanceof HTMLFormControlsCollection, - "The elements attribute should be an HTMLFormControlsCollection object"); -}, "The elements must return an HTMLFormControlsCollection object"); + assert_equals(children_outer.constructor, HTMLCollection, + "The elements attribute should be an HTMLCollection object"); +}, "The elements must return an HTMLCollection object"); test(function () { var fs_inner = document.getElementById("fs_inner"); diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html index 6681b350692..ea51d7b5d0a 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html @@ -10,7 +10,7 @@ <input type=radio name=group1 id=radio2> <input type=radio name=groüp2 id=radio3> -<input type=radio name=groÜp2 id=radio4> +<input type=radio name=groüp2 id=radio4> <input type=radio id=radio5> <input type=radio id=radio6 disabled> @@ -23,7 +23,6 @@ <input type=radio name=group4 id=radio10> <input type=radio name=group4 id=radio11 checked> - <script> var radio1 = document.getElementById('radio1'), radio2 = document.getElementById('radio2'), @@ -64,7 +63,7 @@ radio4.checked = true; assert_false(radio3.checked); assert_true(radio4.checked); - }, "radio inputs with name attributes groüp2 and groÜp2 belong to the same radio button group"); + }, "radio inputs with non-ASCII name attributes belong to the same radio button group"); test(function(){ assert_true(radio8.checked); diff --git a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-time-element/001.html b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-time-element/001.html index 1caceb5b3a7..e1cd0480ac4 100644 --- a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-time-element/001.html +++ b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-time-element/001.html @@ -47,20 +47,21 @@ test(function () { //dateTime test(function () { assert_equals( makeTime('2000-02-01T03:04:05Z','2001-02-01T03:04:05Z').dateTime, '2000-02-01T03:04:05Z' ); -}, 'the datetime attribute should be reflected by the dateTime IDL property'); +}, 'the datetime attribute should be reflected by the .dateTime property'); test(function () { assert_equals( typeof makeTime().dateTime, 'string', 'typeof test' ); assert_equals( makeTime().dateTime, '', 'value test' ); }, 'the dateTime IDL property should default to an empty string'); test(function () { assert_equals( makeTime(false,false,'2000-02-01T03:04:05Z').dateTime, '2000-02-01T03:04:05Z' ); -}, 'the dateTime IDL property should be read/write'); +}, 'the dateTime property should be read/write'); test(function () { assert_equals( makeTime('go fish').dateTime, 'go fish' ); }, 'the datetime attribute should be reflected by the .dateTime property even if it is invalid'); -test(function() { +test(function () { assert_equals( makeTime(false,'2000-02-01T03:04:05Z').dateTime, '' ); }, 'the datetime attribute should not reflect the textContent'); + </script> </body> diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html new file mode 100644 index 00000000000..68976a6963f --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<title>window.requestIdleCallback exists</title> +<link rel="author" title="Ross McIlroy" href="mailto:rmcilroy@chromium.org" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + assert_equals(typeof window.requestIdleCallback, "function"); +}, "window.requestIdleCallback is defined", {assert: "The window.requestIdleCallback function is used to request callbacks during browser-defined idle time."}); + +test(function() { + assert_equals(typeof window.cancelIdleCallback, "function"); +}, "window.cancelIdleCallback is defined", {assert: "The window.cancelIdleCallback function is used to cancel callbacks scheduled via requestIdleCallback."}); + +test(function() { + assert_equals(typeof window.requestIdleCallback(function() {}), "number"); +}, "window.requestIdleCallback() returns a number", {assert: "The requestIdleCallback method MUST return a long"}); + +test(function() { + assert_equals(typeof window.cancelIdleCallback(1), "undefined"); +}, "window.cancelIdleCallback() returns undefined", {assert: "The cancelIdleCallback method MUST return void"}); + +async_test(function() { + // Check whether requestIdleCallback schedules a callback which gets executed + // and the deadline argument is passed correctly. + requestIdleCallback(this.step_func_done(function(deadline) { + assert_equals(arguments.length, 1, "Only one argument should be passed to callback."); + assert_class_string(deadline, "IdleDeadline"); + assert_equals(typeof deadline.timeRemaining, "function", "IdleDeadline.timeRemaining MUST be a function which returns the time remaining in milliseconds"); + assert_equals(typeof deadline.timeRemaining(), "number", "IdleDeadline.timeRemaining MUST return a double of the time remaining in milliseconds"); + assert_true(deadline.timeRemaining() <= 50, "IdleDeadline.timeRemaining() MUST be less than or equal to 50ms in the future."); + assert_equals(typeof deadline.didTimeout, "boolean", "IdleDeadline.didTimeout MUST be a boolean"); + assert_false(deadline.didTimeout, "IdleDeadline.didTimeout MUST be false if requestIdleCallback wasn't scheduled due to a timeout"); + })); +}, 'requestIdleCallback schedules callbacks'); + +async_test(function() { + // Check whether requestIdleCallback schedules a callback which gets executed + // and the deadline argument is passed correctly. + var handle = requestIdleCallback(this.step_func(function(deadline) { + assert_unreached("callback should not be called if canceled with cancelIdleCallback"); + })); + cancelIdleCallback(handle); + setTimeout(this.step_func(function() { + this.done(); + }), 200); +}, 'cancelIdleCallback cancels callbacks'); + +</script> +<h1>Basic requestIdleCallback Tests</h1> +<div id="log"></div> diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-idle-periods.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-idle-periods.html new file mode 100644 index 00000000000..ed8bd885b6b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-idle-periods.html @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<title>window.requestIdleCallback callback behavior during idle periods.</title> +<link rel="author" title="Ross McIlroy" href="mailto:rmcilroy@chromium.org" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +async_test(function() { + // Check that two separate calls to requestIdleCallbacks can run in the same + // idle period. + var callback_1_deadline; + var callback_1_has_run = false; + var callback_1 = function(deadline) { + callback_1_has_run = true; + var remaining = deadline.timeRemaining(); + if (remaining >= 5) { + // Should be enough time to run the next callback in the current idle + // period. + callback_1_deadline = performance.now() + remaining; + } + }; + var callback_2 = this.step_func(function(deadline) { + assert_true(callback_1_has_run, "Should run callbacks in order of posting if they don't have a timeout."); + if (callback_1_deadline != undefined) { + assert_true(performance.now() < callback_1_deadline, "Should be able to run both callbacks in the same idle period."); + this.done(); + } else { + // Might not have had enough idle time, so try again. + callback_1_has_run = false; + setTimeout(function() { + requestIdleCallback(callback_1); + requestIdleCallback(callback_2); + }, 0); + } + }); + requestIdleCallback(callback_1); + requestIdleCallback(callback_2); +}, 'requestIdleCallback can run multiple different requestIdleCallback callbacks in the same idle period.'); + +async_test(function() { + // Check that if an idle callback calls requestIdleCallback, the new callback + // doesn't get the same deadline (i.e., runs in a new idle period). + var previous_deadline = undefined; + var idle_callbacks_remaining = 10; + var rIC = this.step_func(function(deadline) { + var now = performance.now(); + var remaining = deadline.timeRemaining(); + var new_deadline = now + remaining; + if (previous_deadline != undefined) { + assert_true(new_deadline > previous_deadline, "A requestIdleCallback scheduled during an idle period should be called back with a deadline greater than that in the current idle period."); + } + + // Schedule a new requestIdleCallback. + if (--idle_callbacks_remaining > 0) { + previous_deadline = new_deadline; + requestIdleCallback(rIC); + } else { + this.done(); + } + }); + + // Spin an empty rAF loop to cause an idle period each frame. + var idle_task_posted = false; + requestAnimationFrame(function rAFLoop() { + if (!idle_task_posted) { + requestIdleCallback(rIC); + idle_task_posted = true; + } + requestAnimationFrame(rAFLoop); + }); +}, 'Check that if an idle callback calls requestIdleCallback the new callback doesn\'t run in the current idle period.'); +</script> +<h1>Test of requestIdleCallback idle period behavior</h1> +<p>This test validates that window.requestIdleCallback deals with callbacks during idle periods correctly.</p> +<div id="log"></div> diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html new file mode 100644 index 00000000000..54339dcc01b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<title>window.requestIdleCallback deals with timeouts correctly</title> +<link rel="author" title="Ross McIlroy" href="mailto:rmcilroy@chromium.org" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +async_test(function() { + // Check whether requestIdleCallback with a timeout works when the event loop + // is busy. + var busy_raf_loop_iterations_remaining = 10; // Should take 20 * 40 = 400ms + var idle_callback_scheduled; + var idle_callback = this.step_func_done(function(deadline) { + assert_false(deadline.didTimeout, "IdleDeadline.didTimeout MUST be false if requestIdleCallback wasn't scheduled due to a timeout"); + assert_equals(busy_raf_loop_iterations_remaining, 0, "Busy rAF loop should be finished by the time we get scheduled"); + }); + + var busy_raf_loop_iterations_remaining = 10; // Should take 20 * 40 = 400ms + requestAnimationFrame(this.step_func(function busyRAFLoop() { + var start_time = performance.now(); + if (!idle_callback_scheduled) { + idle_callback_scheduled = start_time; + requestIdleCallback(idle_callback); + } + + // Use up the whole frame budget. + while (performance.now() - start_time < 40) { + } + if (busy_raf_loop_iterations_remaining > 0) { + busy_raf_loop_iterations_remaining--; + requestAnimationFrame(busyRAFLoop); + } + })); +}, 'requestIdleCallback not scheduled when event loop is busy.'); + +async_test(function() { + // Check whether requestIdleCallback with a timeout works when the event loop + // is busy. + var busy_raf_loop_iterations_remaining = 10; // Should take 20 * 40 = 400ms + var timeout = 200; + var idle_callback_scheduled; + var idle_callback = this.step_func_done(function(deadline) { + var time_delta = performance.now() - idle_callback_scheduled; + assert_true(time_delta >= timeout, "Should only have been run after timeout"); + assert_true(deadline.timeRemaining() == 0, "IdleDeadline.timeRemaining MUST be equal to zero if requestIdleCallback was scheduled due to a timeout"); + assert_true(deadline.didTimeout, "IdleDeadline.didTimeout MUST be true if requestIdleCallback was scheduled due to a timeout"); + assert_true(busy_raf_loop_iterations_remaining > 0, "Busy rAF loop should still be going"); + }); + + requestAnimationFrame(this.step_func(function busyRAFLoop() { + var start_time = performance.now(); + if (!idle_callback_scheduled) { + idle_callback_scheduled = start_time; + requestIdleCallback(idle_callback, { timeout: timeout }); + } + + // Use up the whole frame budget. + while (performance.now() - start_time < 40) { + } + if (busy_raf_loop_iterations_remaining > 0) { + busy_raf_loop_iterations_remaining--; + requestAnimationFrame(busyRAFLoop); + } + })); +}, 'requestIdleCallback scheduled with timeout when event loop is busy.'); + +</script> +<h1>Test of requestIdleCallback timeout behavior</h1> +<div id="log"></div> diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-onauxclick.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-onauxclick.html new file mode 100644 index 00000000000..d741507da01 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-onauxclick.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<title>onauxclick</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#handler-onauxclick"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="auxclickme1" onauxclick="window.auxClick1Happened = true;"></div> +<div id="auxclickme2" onauxclick="window.auxClick2Happened = true;"></div> + +<script> +"use strict"; +window.auxClick1Happened = false; +window.auxClick2Happened = false; + +test(() => { + for (const location of [window, HTMLElement.prototype, SVGElement.prototype, Document.prototype]) { + assert_true(location.hasOwnProperty("onauxclick"), + `${location.constructor.name} has an own property named "onauxclick"`); + } +}, "onauxclick is on the appropriate locations for GlobalEventHandlers"); + +test(() => { + const htmlElement = document.createElement("span"); + const svgElement = document.createElementNS("http://www.w3.org/2000/svg", "g"); + + for (const location of [window, htmlElement, svgElement, document]) { + assert_equals(location.onauxclick, null, + `The default value of the property is null for a ${location.constructor.name} instance`); + } +}, "The default value of onauxclick is always null"); + +test(() => { + const element = document.querySelector("#auxclickme1"); + const compiledHandler = element.onauxclick; + + assert_equals(typeof compiledHandler, "function", "The onauxclick property must be a function"); + compiledHandler(); + assert_true(window.auxClick1Happened, "Calling the handler must run the code"); +}, "The onauxclick content attribute must be compiled into the onauxclick property"); + +test(() => { + const element = document.querySelector("#auxclickme2"); + element.dispatchEvent(new Event("auxclick")); + + assert_true(window.auxClick2Happened, "Dispatching the event must run the code"); +}, "The onauxclick content attribute must execute when an event is dispatched"); + +test(() => { + const element = document.createElement("meta"); + element.onauxclick = e => { + assert_equals(e.currentTarget, element, "The event must be fired at the <meta> element"); + }; + + element.dispatchEvent(new Event("auxclick")); +}, "dispatching an auxclick event must trigger element.onauxclick"); + +</script> diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html new file mode 100644 index 00000000000..c367e6cb2f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in <script src=...> with hash</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, document.querySelector('script[src="support/syntax-error.js#"]').src, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script src="support/syntax-error.js#"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html new file mode 100644 index 00000000000..dc6ec059a5a --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in <script src=...> with hash</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, document.querySelector('script[src="support/undefined-variable.js#"]').src, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script src="support/undefined-variable.js#"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html index 1dbfa2b46af..21c5ea48ad4 100644 --- a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html +++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html @@ -23,9 +23,9 @@ function consumeImageBitmap(image, t) createImageBitmap(myCanvas).then(t.step_func_done(function(imageBitmap) { // Per spec, when transferFromImageBitmap happens, the transferred - // ImageBitmap (|image| here) should be the intrinsic size of + // ImageBitmap (|image| here) must determine the intrinsic size of // myCanvas, and hence myCanvas.width/height is ignored. Therefore, - // this created |imageBitmap| should have the same size as the |image|. + // |imageBitmap| should have the same size as the |image|. assert_equals(imageBitmap.width, width); assert_equals(imageBitmap.height, height); diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html index 88d12d144c2..4354b9ac418 100644 --- a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html +++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html @@ -43,7 +43,7 @@ promise_test(function() { var ctx = srcCanvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; ctx.fillRect(0, 0, width, height); - createImageBitmap(srcCanvas).then(function(image) { + return createImageBitmap(srcCanvas).then(function(image) { consumeImageBitmap(image, 'false', 0, 127, 0, 255); }); }, "Test that an ImageBitmapRenderingContext with alpha disabled makes the canvas opaque"); @@ -55,7 +55,7 @@ promise_test(function() { var ctx = srcCanvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; ctx.fillRect(0, 0, width, height); - createImageBitmap(srcCanvas).then(function(image) { + return createImageBitmap(srcCanvas).then(function(image) { consumeImageBitmap(image, 'true', 0, 255, 0, 127); }); }, "Test that an ImageBitmapRenderingContext with alpha enabled preserves the alpha"); @@ -67,7 +67,7 @@ promise_test(function() { var ctx = srcCanvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; ctx.fillRect(0, 0, width, height); - createImageBitmap(srcCanvas).then(function(image) { + return createImageBitmap(srcCanvas).then(function(image) { consumeImageBitmap(image, '', 0, 255, 0, 127); }); }, "Test that the 'alpha' context creation attribute is true by default"); diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html index 2c547ee63b5..c0ae84148af 100644 --- a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html +++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html @@ -28,7 +28,7 @@ promise_test(function() { var ctx = srcCanvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; ctx.fillRect(0, 0, width, height); - createImageBitmap(srcCanvas).then(testException); + return createImageBitmap(srcCanvas).then(testException); }, "Test transferFromImageBitmap(image) with a detached image should throw InvalidStateError"); </script> diff --git a/tests/wpt/web-platform-tests/innerText/getter-tests.js b/tests/wpt/web-platform-tests/innerText/getter-tests.js index 44be5267e55..1e190c094a9 100644 --- a/tests/wpt/web-platform-tests/innerText/getter-tests.js +++ b/tests/wpt/web-platform-tests/innerText/getter-tests.js @@ -308,14 +308,13 @@ testText("<math>abc", undefined, "innerText not supported on MathML elements"); /**** Ruby ****/ -testText("<div><ruby>abc<rp>(</rp><rt>def</rt><rp>)</rp></ruby>", "abc(def)", "<rp> rendered"); -testText("<div><rp>abc</rp>", "abc", "Lone <rp> rendered"); -testText("<div><rp style='visibility:hidden'>abc</rp>", "", "visibility:hidden <rp> not rendered"); -testText("<div><rp> abc </rp>", " abc ", "Lone <rp> rendered without whitespace trimming"); -testText("<div><rp style='display:block'>abc</rp>def", "abc\ndef", "display:block <rp> induces line breaks"); -testText("<div><rp style='display:block'> abc </rp>def", " abc \ndef", "display:block <rp> induces line breaks but doesn't trim whitespace"); -// XXX this is not desirable but the spec currently requires it. -testText("<div><select class='poke-rp'></select>", "abc", "<rp> in a replaced element still renders"); +testText("<div><ruby>abc<rt>def</rt></ruby>", "abcdef", "<rt> and no <rp>"); +testText("<div><ruby>abc<rp>(</rp><rt>def</rt><rp>)</rp></ruby>", "abcdef", "<rp>"); +testText("<div><rp>abc</rp>", "", "Lone <rp>"); +testText("<div><rp style='visibility:hidden'>abc</rp>", "", "visibility:hidden <rp>"); +testText("<div><rp style='display:block'>abc</rp>def", "abc\ndef", "display:block <rp>"); +testText("<div><rp style='display:block'> abc </rp>def", "abc\ndef", "display:block <rp> with whitespace"); +testText("<div><select class='poke-rp'></select>", "", "<rp> in a <select>"); /**** Shadow DOM ****/ diff --git a/tests/wpt/web-platform-tests/input-events/idlharness.html b/tests/wpt/web-platform-tests/input-events/idlharness.html new file mode 100644 index 00000000000..54ca46eb92f --- /dev/null +++ b/tests/wpt/web-platform-tests/input-events/idlharness.html @@ -0,0 +1,38 @@ +<title>Input Event IDL tests</title> +<link rel="help" href="https://w3c.github.io/input-events/#h-interface-inputevent"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> + +<pre id="untested_idl"> +interface InputEvent { +}; +</pre> + +<pre id='idl'> +partial interface InputEvent { + readonly attribute DOMString inputType; + readonly attribute DataTransfer? dataTransfer; + sequence<StaticRange> getTargetRanges(); +}; + +partial dictionary InputEventInit { + DOMString inputType = ""; + DataTransfer? dataTransfer = null; + sequence<StaticRange> targetRanges = []; +}; +</pre> + +<script> +(function(){ + "use strict"; + const idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById("untested_idl").textContent); + idl_array.add_idls(document.getElementById("idl").textContent); + idl_array.add_objects({ + InputEvent: ['new InputEvent("foo")'], + }); + idl_array.test(); +})(); +</script> diff --git a/tests/wpt/web-platform-tests/magnetometer/OWNERS b/tests/wpt/web-platform-tests/magnetometer/OWNERS new file mode 100644 index 00000000000..cc7c3879319 --- /dev/null +++ b/tests/wpt/web-platform-tests/magnetometer/OWNERS @@ -0,0 +1,5 @@ +@zqzhang +@dontcallmedom +@tobie +@riju +@Honry diff --git a/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html b/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html new file mode 100644 index 00000000000..00fdafee664 --- /dev/null +++ b/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Magnetometer Sensor IDL tests</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://www.w3.org/TR/magnetometer/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> +<style> + pre { + display: none; + } +</style> +<div id="log"></div> + +<pre id="idl"> +interface Event { +}; + +interface EventTarget { +}; + +interface EventHandler { +}; + +interface Error { +}; + +dictionary EventInit { +}; +</pre> + +<pre id="generic-idl"> +[SecureContext] +interface Sensor : EventTarget { + readonly attribute SensorState state; + readonly attribute SensorReading? reading; + void start(); + void stop(); + attribute EventHandler onchange; + attribute EventHandler onactivate; + attribute EventHandler onerror; +}; + +dictionary SensorOptions { + double? frequency; +}; + +enum SensorState { + "idle", + "activating", + "activated", + "errored" +}; + +[SecureContext] +interface SensorReading { + readonly attribute DOMHighResTimeStamp timeStamp; +}; + +[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)] +interface SensorErrorEvent : Event { + readonly attribute Error error; +}; + +dictionary SensorErrorEventInit : EventInit { + required Error error; +}; + +</pre> + +<pre id="magnetometer-idl"> +[Constructor(optional SensorOptions sensorOptions)] +interface Magnetometer : Sensor { + readonly attribute MagnetometerReading? reading; +}; + +[Constructor(MagnetometerReadingInit magnetometerReadingInit)] +interface MagnetometerReading : SensorReading { + readonly attribute double x; + readonly attribute double y; + readonly attribute double z; +}; + +dictionary MagnetometerReadingInit { + double x = 0; + double y = 0; + double z = 0; +}; +</pre> + +<script> +(function() { + "use strict"; + var idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById('idl').textContent); + idl_array.add_untested_idls(document.getElementById('generic-idl').textContent); + idl_array.add_idls(document.getElementById('magnetometer-idl').textContent); + + idl_array.add_objects({ + Magnetometer: ['new Magnetometer();'], + MagnetometerReading: ['new MagnetometerReading({x: 0.5, y: 0.5, z: 0.5});'] + }); + + idl_array.test(); +})(); +</script> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html index 0500148d636..9fca6f49632 100644 --- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html @@ -3,9 +3,6 @@ <head> <meta charset="utf-8"/> <title>MathML lengths (reference)</title> -<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1"/> -<link rel="match" href="lengths-1-ref.html"/> -<meta name="assert" content="Verify that the syntax for MathML lengths is supported."> </head> <body> <p>Test passes if there is a green square and no red.</p> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_data_uri.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_data_uri.html new file mode 100644 index 00000000000..19193b26262 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_data_uri.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Original file for data:uri... to test opening an data:uri path within an iframe.</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + </head> + <body> + <h1>Description</h1> + <p id="p">This test passed.</p> + <script> + var observer = new PerformanceObserver( + function (entryList) { + document.getElementById("p").innerHTML = "This test failed because navigation intance is observed."; + observer.disconnect(); + }); + observer.observe({entryTypes: ["navigation"]}); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html new file mode 100644 index 00000000000..7bdd5d50f21 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>Navigation Timing 2 IDL tests</title> +<link rel="author" title="Google" href="http://www.google.com/" /> +<link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> +</head> +<body> + +<pre id='untested_idl' style='display:none'> + +interface PerformanceResourceTiming : PerformanceEntry { + readonly attribute DOMString initiatorType; + readonly attribute DOMHighResTimeStamp workerStart; + readonly attribute DOMHighResTimeStamp redirectStart; + readonly attribute DOMHighResTimeStamp redirectEnd; + readonly attribute DOMHighResTimeStamp fetchStart; + readonly attribute DOMHighResTimeStamp domainLookupStart; + readonly attribute DOMHighResTimeStamp domainLookupEnd; + readonly attribute DOMHighResTimeStamp connectStart; + readonly attribute DOMHighResTimeStamp connectEnd; + readonly attribute DOMHighResTimeStamp secureConnectionStart; + readonly attribute DOMHighResTimeStamp requestStart; + readonly attribute DOMHighResTimeStamp responseStart; + readonly attribute DOMHighResTimeStamp responseEnd; + [MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long transferSize; + [MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long encodedBodySize; + [MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long decodedBodySize; +}; +</pre> + +<pre id='idl'> +enum NavigationType { + "navigate", + "reload", + "back_forward", + "prerender" +}; + +interface PerformanceNavigationTiming : PerformanceResourceTiming { + readonly attribute DOMHighResTimeStamp unloadEventStart; + readonly attribute DOMHighResTimeStamp unloadEventEnd; + readonly attribute DOMHighResTimeStamp domInteractive; + readonly attribute DOMHighResTimeStamp domContentLoadedEventStart; + readonly attribute DOMHighResTimeStamp domContentLoadedEventEnd; + readonly attribute DOMHighResTimeStamp domComplete; + readonly attribute DOMHighResTimeStamp loadEventStart; + readonly attribute DOMHighResTimeStamp loadEventEnd; + readonly attribute NavigationType type; + readonly attribute unsigned short redirectCount; +}; +</pre> + +<script> +function test_idl() { + var idl_array = new IdlArray(); + + idl_array.add_untested_idls(document.getElementById("untested_idl").textContent); + idl_array.add_idls(document.getElementById("idl").textContent); + + idl_array.test(); +} +test_idl(); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html new file mode 100644 index 00000000000..3d0a83b9ab0 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h1>Description</h1> + <p>This test validates that PerformanceObserver can observe nav timing 2 instance and that the expected attributes in nav timing 2 instance exist (but does not validate that the values are correct).</p> + + <script> + var navTiming2Attributes = [ + 'connectEnd', + 'connectStart', + 'decodedBodySize', + 'domComplete', + 'domContentLoadedEventEnd', + 'domContentLoadedEventStart', + 'domInteractive', + 'domainLookupEnd', + 'domainLookupStart', + 'duration', + 'encodedBodySize', + 'entryType', + 'fetchStart', + 'initiatorType', + 'loadEventEnd', + 'loadEventStart', + 'name', + 'redirectCount', + 'redirectEnd', + 'redirectStart', + 'requestStart', + 'responseEnd', + 'responseStart', + 'secureConnectionStart', + 'transferSize', + 'type', + 'unloadEventEnd', + 'unloadEventStart', + 'workerStart' + ]; + async_test(function (t) { + var observer = new PerformanceObserver( + t.step_func(function (entryList) { + var entries = entryList.getEntries(); + assert_equals(entries.length, 1, + "There should be only one navigation timing instance."); + for (var i = 0; i < navTiming2Attributes.length; i++) { + assert_true(navTiming2Attributes[i] in entries[0], + "Expected attribute: " + navTiming2Attributes[i] + "."); + } + observer.disconnect(); + t.done(); + }) + ); + observer.observe({entryTypes: ["navigation"]}); + + }, "Performance navigation timing entries are observable."); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html new file mode 100644 index 00000000000..cd335233696 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h1>Description</h1> + <p>This test validates that the values of nav timing 2 instance's timing-related attributes are in certain order and the others are of expected values.</p> + + <script> + var navTiming2EventOrder1 = [ + 'startTime', + 'redirectStart', + //'unloadEventStart', + 'redirectEnd', + //'unloadEventEnd', + 'fetchStart', + 'domainLookupStart', + 'domainLookupEnd', + 'connectStart', + //'secureConnectionStart', + 'connectEnd', + 'requestStart', + 'responseStart', + 'responseEnd', + 'domInteractive', + 'domContentLoadedEventStart', + 'domContentLoadedEventEnd', + 'domComplete', + 'loadEventStart', + 'loadEventEnd' + ]; + + var navTiming2EventOrder2 = [ + 'redirectStart', + 'unloadEventStart', + 'redirectEnd', + 'unloadEventEnd', + 'fetchStart' + ]; + + var navTiming2EventOrder3 = [ + 'connectStart', + 'secureConnectionStart', + 'connectEnd' + ]; + + function verifyTimingEventOrder(eventOrder, timingEntry) { + for (var i = 0; i < eventOrder.length - 1; i++) { + assert_true(timingEntry[eventOrder[i]] <= timingEntry[eventOrder[i + 1]], + "Expected " + eventOrder[i] + " to be no greater than " + eventOrder[i + 1] + "."); + } + } + + async_test(function (t) { + var observer = new PerformanceObserver( + t.step_func(function (entryList) { + var entries = entryList.getEntries(); + assert_equals(entries[0].entryType, "navigation", + "Expected entryType to be: navigation."); + assert_equals(entries[0].name, "document", + "Expected name to be: document."); + assert_equals(entries[0].startTime, 0, + "Expected startTime to be: 0."); + assert_equals(entries[0].duration, entries[0].loadEventEnd, + "Expected duration to be equal to loadEventEnd."); + assert_equals(entries[0].initiatorType, "navigation", + "Expected initiatorType to be: navigation."); + // This test may fail when response is from cach. Disable or clean cach before + // running this test. + assert_true(entries[0].transferSize > entries[0].encodedBodySize, + "Expected transferSize to be greater than encodedBodySize in uncached navigation."); + assert_equals(entries[0].encodedBodySize, 4140); + assert_equals(entries[0].decodedBodySize, 4140); + verifyTimingEventOrder(entries[0], navTiming2EventOrder1); + // When unloadEvent happens + if (entries[0]["unloadEventStart"] != 0) { + verifyTimingEventOrder(entries[0], navTiming2EventOrder2); + } + // When a secure transport is used + if (entries[0]["secureConnectionStart"] != 0) { + verifyTimingEventOrder(entries[0], navTiming2EventOrder3); + } + observer.disconnect(); + t.done(); + }) + ); + observer.observe({entryTypes: ["navigation"]}); + + }, "Performance navigation timing instance's value is reasonable."); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_document_open.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_document_open.html new file mode 100644 index 00000000000..bc06ed5840a --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_document_open.html @@ -0,0 +1,100 @@ + <!DOCTYPE html> + <html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var navTiming2Attributes = [ + 'connectEnd', + 'connectStart', + 'decodedBodySize', + 'domComplete', + 'domContentLoadedEventEnd', + 'domContentLoadedEventStart', + 'domInteractive', + 'domainLookupEnd', + 'domainLookupStart', + 'duration', + 'encodedBodySize', + 'entryType', + 'fetchStart', + 'initiatorType', + 'loadEventEnd', + 'loadEventStart', + 'name', + 'redirectCount', + 'redirectEnd', + 'redirectStart', + 'requestStart', + 'responseEnd', + 'responseStart', + 'secureConnectionStart', + 'transferSize', + 'type', + 'unloadEventEnd', + 'unloadEventStart', + 'workerStart' + ]; + + var originalTiming = {}; + var didOpen = false; + + function onload_test() + { + if (!didOpen) { + setTimeout(testTimingWithDocumentOpen, 0); + didOpen = true; + } + } + + function testTimingWithDocumentOpen() + { + var subcontentWindow = document.getElementById("frameContext").contentWindow; + + var timing = subcontentWindow.performance.getEntriesByType("navigation")[0]; + for (i in navTiming2Attributes) { + originalTiming[navTiming2Attributes[i]] = timing[navTiming2Attributes[i]]; + } + + var subdocument = subcontentWindow.document; + subdocument.open(); + subdocument.write('<!DOCTYPE HTML>'); + subdocument.write('<html>'); + subdocument.write('<head>'); + subdocument.write('<meta charset="utf-8" />'); + subdocument.write('<title><Green Test Page</title>'); + subdocument.write('</head>'); + subdocument.write('<body style="background-color:#00FF00;">'); + subdocument.write('</body>'); + subdocument.write('</html>'); + subdocument.close(); + + setTimeout(function() { + var timing = subcontentWindow.performance.getEntriesByType("navigation")[0]; + for (var i in navTiming2Attributes) { + assert_equals(originalTiming[navTiming2Attributes[i]], timing[navTiming2Attributes[i]], + navTiming2Attributes[i] + " is the same after document open."); + } + done(); + }, 0); + } + </script> + </head> + <body> + <h1>Description</h1> + <p>This test validates window.performance.getEntriesByType("navigation") remains constant when a + document is replaced using document.open.</p> + + <p>This page should be loaded with a yellow frame below. It then replaces the + document in that frame with a green document.</p> + + <p>The test passes if all of the checks to performance.getEntriesByType("navigation") are correct and + the frame below ends with a green background.</p> + + <iframe id="frameContext" onload="onload_test();" src="resources/blank_page_yellow.html" style="width: 250px; height: 250px;"></iframe> + </body> + </html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_instance_accessors.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_instance_accessors.html new file mode 100644 index 00000000000..cf478b955b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_instance_accessors.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h1>Description</h1> + <p>This test validates that nav timing 2 instance can be accessed by three different accessors once available: window.performance.getEntries()/getEntriesByType("navigation")/getEntriesByName("document")</p> + + <script> + var navTiming2Attributes = [ + 'connectEnd', + 'connectStart', + 'decodedBodySize', + 'domComplete', + 'domContentLoadedEventEnd', + 'domContentLoadedEventStart', + 'domInteractive', + 'domainLookupEnd', + 'domainLookupStart', + 'duration', + 'encodedBodySize', + 'entryType', + 'fetchStart', + 'initiatorType', + 'loadEventEnd', + 'loadEventStart', + 'name', + 'redirectCount', + 'redirectEnd', + 'redirectStart', + 'requestStart', + 'responseEnd', + 'responseStart', + 'secureConnectionStart', + 'transferSize', + 'type', + 'unloadEventEnd', + 'unloadEventStart', + 'workerStart' + ]; + + async_test(function (t) { + var observer = new PerformanceObserver( + t.step_func(function (entryList) { + var instance1 = performance.getEntries()[0]; + var instance2 = performance.getEntriesByType("navigation")[0]; + var instance3 = performance.getEntriesByName("document")[0]; + + assert_equals(performance.getEntriesByType("navigation").length, 1, "Expected there is only one navigation timing instance."); + assert_equals(performance.getEntriesByName("document").length, 1, "Expected there is only one navigation timing instance."); + + for (var i = 0; i < navTiming2Attributes.length; i++) { + assert_equals(instance1[navTiming2Attributes[i]], instance2[navTiming2Attributes[i]]); + } + + for (var i = 0; i < navTiming2Attributes.length; i++) { + assert_equals(instance1[navTiming2Attributes[i]], instance3[navTiming2Attributes[i]]); + } + observer.disconnect(); + t.done(); + }) + ); + observer.observe({entryTypes: ["navigation"]}); + + }, "Performance navigation timing entries are accessible through three different accessors."); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigate_within_document.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigate_within_document.html new file mode 100644 index 00000000000..f39ca057695 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigate_within_document.html @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" > + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h1>Description</h1> + <p>This test validates that all of the window.performance.getEntriesByType("navigation") attributes remain unchanged after an in document navigation (URL fragment change).</p> + + <script> + var navTiming2Attributes = [ + 'connectEnd', + 'connectStart', + 'decodedBodySize', + 'domComplete', + 'domContentLoadedEventEnd', + 'domContentLoadedEventStart', + 'domInteractive', + 'domainLookupEnd', + 'domainLookupStart', + 'duration', + 'encodedBodySize', + 'entryType', + 'fetchStart', + 'initiatorType', + 'loadEventEnd', + 'loadEventStart', + 'name', + 'redirectCount', + 'redirectEnd', + 'redirectStart', + 'requestStart', + 'responseEnd', + 'responseStart', + 'secureConnectionStart', + 'transferSize', + 'type', + 'unloadEventEnd', + 'unloadEventStart', + 'workerStart' + ]; + + var initial_timing = {}; + + function check_timing_not_changed() + { + var timing = window.performance.getEntriesByType("navigation")[0]; + for (var i = 0; i < navTiming2Attributes.length; ++i) + { + var property = navTiming2Attributes[i]; + assert_equals(timing[property], initial_timing[property], + property + " is the same after in document navigation."); + } + done(); + } + + function save_timing_after_load() + { + var timing = window.performance.getEntriesByType("navigation")[0]; + for (var i = 0; i < navTiming2Attributes.length; ++i) + { + var property = navTiming2Attributes[i]; + initial_timing[property] = timing[property]; + } + window.location.href = "#1"; + setTimeout("check_timing_not_changed()", 0); + } + + function load_handler() + { + window.removeEventListener("load", load_handler); + setTimeout("save_timing_after_load()", 0); + } + + window.addEventListener("load", load_handler, false); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_backforward.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_backforward.html new file mode 100644 index 00000000000..c4b57581069 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_backforward.html @@ -0,0 +1,81 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + + function onload_test() + { + // do this with a timeout to see the visuals of the navigations. + setTimeout("nav_frame();", 100); + } + + var step = 1; + function nav_frame() + { + var navigation_frame = document.getElementById("frameContext").contentWindow; + switch (step) + { + case 1: + { + navigation_frame.location.href = '/navigation-timing/resources/blank_page_green_with_onunload.html'; + step++; + break; + } + case 2: + { + assert_equals(navigation_frame.performance.getEntriesByType("navigation")[0].type, + "navigate", + 'Expected navigation type to be navigate.'); + navigation_frame.history.back(); + step++; + break; + } + case 3: + { + assert_equals(navigation_frame.performance.getEntriesByType("navigation")[0].type, + "back_forward", + 'Expected navigation type to be back_forward.'); + step++; + navigation_frame.history.forward(); + break; + } + case 4: + { + assert_equals(navigation_frame.performance.getEntriesByType("navigation")[0].type, + "back_forward", + 'Expected navigation type to be back_forward.'); + done(); + step++; + break; + } + default: + break; + } + } + </script> + + </head> + <body> + <h1> + Description</h1> + <p> + This test validates the value of window.performance.getEntriesByType("navigation")[0].type with a forward + and back navigation.</p> + + <p>This page should be loaded with a yellow background frame below. It should turn green for a starting + navigation, back to yellow for a back navigation and then back to green again for a forward navigation.</p> + + <p>Along the navigation timeline the window.performance.getEntriesByType("navigation")[0].type is checked for back_forward.</p> + + <p>This test passes if all of the checks to the window.performance.getEntriesByType("navigation")[0].type are correct throughout the navigation + scenario and the frame below ends with a green background. Otherwise, this test fails.</p> + + <iframe id="frameContext" onload="onload_test();" src="resources/blank_page_yellow_with_onunload.html" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_navigate.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_navigate.html new file mode 100644 index 00000000000..efaef1ec0bb --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_navigate.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + async_test(function (t) { + var observer = new PerformanceObserver( + t.step_func(function (entryList) { + assert_equals(entryList.getEntries()[0].type, "navigate", "Expected navigation type to be navigate."); + observer.disconnect(); + t.done(); + }) + ); + observer.observe({entryTypes: ["navigation"]}); + + }, "Navigation type to be navigate."); + </script> + + </head> + <body> + <h1> + Description</h1> + <p> + This test validates the value of window.performance.getEntriesByType("navigation")[0].type to be navigate.</p> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_reload.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_reload.html new file mode 100644 index 00000000000..74b85c9dbb5 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_navigation_type_reload.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + + var reload_frame; + + function onload_test() + { + reload_frame = document.getElementById("frameContext"); + reload_frame.onload = function() { + setTimeout(do_test, 0); + } + setTimeout("reload_the_frame();", 100); + } + + function reload_the_frame() + { + reload_frame.contentWindow.location.reload(true); + } + + function do_test() + { + var newNavTiming = document.getElementById("frameContext").contentWindow.performance.getEntriesByType("navigation")[0]; + assert_equals(newNavTiming.type, "reload", "Expected navigation type to be reload."); + assert_true(newNavTiming.unloadEventStart > 0, "Expected unloadEventStart to be greater than 0."); + assert_true(newNavTiming.unloadEventEnd > 0, "Expected unloadEventEnd to be greater than 0."); + done(); + } + </script> + </head> + <body onload="onload_test();"> + <h1>Description</h1> + <p>This test validates the value of window.performance.getEntriesByType("navigation")[0].(type/unloadEventEnd/unloadEventStart) with a reloaded navigation.</p> + + <p>This page should be loaded with a green background frame below. The frame will be automatically reloaded + and then verified that + <ul> + <li>The window.performance.getEntriesByType("navigation").type = "reload" after reload</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventStart > 0 after reload</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventEnd > 0 after reload</li> + </ul> + </p> + + <iframe id="frameContext" src="resources/blank_page_green.html" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_open_blank_page.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_open_blank_page.html new file mode 100644 index 00000000000..dbd5751b94d --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_open_blank_page.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + + <script> + + function onload_test() + { + var iframe_performance = document.getElementById("frameContext").contentWindow.performance; + assert_equals(iframe_performance.getEntriesByType("navigation").length, 0, "Expected there is no navigation timing instance"); + done(); + } + </script> + + </head> + <body> + <h1>Description</h1> + <p>This test validates there does not exist a navigation timing instance when opening internal pages like about:blank.</p> + + <iframe id="frameContext" onload="onload_test();" src="about:blank" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_open_data_uri.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_open_data_uri.html new file mode 100644 index 00000000000..70ba38f6cb9 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_open_data_uri.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface"/> + </head> + <body> + <h1>Description</h1> + <p>This test validates there does not exist a navigation timing instance when opening a data uri. This data uri points to nav2_data_uri.html. This test passes when it displays so in the iframe below.</p> + + <iframe id="frameContext" src="data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgogICAgPGhlYWQ+CiAgICAgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgICAgIDx0aXRsZT5PcmlnaW5hbCBmaWxlIGZvciBkYXRhOnVyaS4uLiB0byB0ZXN0IG9wZW5pbmcgYW4gZGF0YTp1cmkgcGF0aCB3aXRoaW4gYW4gaWZyYW1lLjwvdGl0bGU+CiAgICAgICAgPGxpbmsgcmVsPSJhdXRob3IiIHRpdGxlPSJHb29nbGUiIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iIC8+CiAgICAgICAgPGxpbmsgcmVsPSJoZWxwIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9uYXZpZ2F0aW9uLXRpbWluZy0yLyNzZWMtUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nIi8+CiAgICA8L2hlYWQ+CiAgICA8Ym9keT4KICAgICAgICA8aDE+RGVzY3JpcHRpb248L2gxPgogICAgICAgIDxwIGlkPSJwIj5UaGlzIHRlc3QgcGFzc2VkLjwvcD4KICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IFBlcmZvcm1hbmNlT2JzZXJ2ZXIoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVudHJ5TGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicCIpLmlubmVySFRNTCA9ICJUaGlzIHRlc3QgZmFpbGVkIGNhdXNlIG5hdmlnYXRpb24gaW50YW5jZSBpcyBvYnNlcnZlZC4iOwogICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHtlbnRyeVR5cGVzOiBbIm5hdmlnYXRpb24iXX0pOwogICAgICAgIDwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+Cg==" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_none.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_none.html new file mode 100644 index 00000000000..97437e1a5ef --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_none.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h1>Description</h1> + <p>This test validates that the value of the window.performance.getEntriesByType("navigation")[0].redirectCount attribute, as well as the window.performance.getEntriesByType("navigation")[0].redirectStart and redirectEnd attributes on a non-redirected navigation.</p> + + <script> + + async_test(function (t) { + var observer = new PerformanceObserver( + t.step_func(function (entryList) { + var navTiming = performance.getEntriesByType("navigation")[0]; + assert_equals(navTiming.redirectCount, 0, "Expected redirectCount to be 0."); + assert_equals(navTiming.redirectStart, 0, "Expected redirectStart to be 0."); + assert_equals(navTiming.redirectEnd, 0, "Expected redirectEnd to be 0."); + observer.disconnect(); + t.done(); + }) + ); + observer.observe({entryTypes: ["navigation"]}); + + }, "Naivation without redirects."); + </script> + </body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_server.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_server.html new file mode 100644 index 00000000000..41b24dd7dca --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_server.html @@ -0,0 +1,46 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + + <script> + + function verifyTimingEventOrder(eventOrder, timingEntry) { + for (var i = 0; i < eventOrder.length - 1; i++) { + assert_true(timingEntry[eventOrder[i]] < timingEntry[eventOrder[i + 1]], + "Expected " + eventOrder[i] + " to be no greater than " + eventOrder[i + 1] + "."); + } + } + + function onload_test() + { + var frame_performance = document.getElementById("frameContext").contentWindow.performance; + assert_equals(frame_performance.getEntriesByType("navigation")[0].type, + "navigate", + "Expected navigation type to be navigate."); + assert_equals(frame_performance.getEntriesByType("navigation")[0].redirectCount, 1, "Expected redirectCount to be 1."); + + var timgingEvents = [ + 'startTime', + 'redirectStart', + 'redirectEnd', + ]; + verifyTimingEventOrder(timgingEvents, frame_performance.getEntriesByType("navigation")[0]); + done(); + } + </script> + + </head> + <body> + <h1>Description</h1> + <p>This test validates the values of the window.performance.redirectCount and the + window.performance.timing.redirectStart/End times for a same-origin server side redirect navigation.</p> + + <iframe id="frameContext" onload="onload_test();" src="/common/redirect.py?location=/navigation-timing/resources/blank_page_green.html" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_xserver.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_xserver.html new file mode 100644 index 00000000000..06c9b7f3b67 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_xserver.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/utils.js"></script> + <script> + + function onload_test() + { + var performanceNamespace = document.getElementById("frameContext").contentWindow.performance; + assert_equals(performanceNamespace.getEntriesByType("navigation")[0].type, + "navigate", + "Expected navigation type to be navigate."); + assert_equals(performanceNamespace.getEntriesByType("navigation")[0].redirectCount, 0, + "Expected redirectCount to be 0."); + assert_equals(performanceNamespace.getEntriesByType("navigation")[0].redirectStart, 0, + "Expected redirectStart to be 0."); + assert_equals(performanceNamespace.getEntriesByType("navigation")[0].redirectEnd, 0, + "Expected redirectEnd to be 0."); + + done(); + } + </script> + + </head> + <body> + <h1>Description</h1> + <p>This test validates the values of the window.performance.getEntriesByType("navigation")[0].redirectCount and the + window.performance.getEntriesByType("navigation")[0].redirectStart/End times for a cross-origin server side redirect navigation.</p> + + <iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe> + <script> + // combine the page origin and redirect origin into the IFRAME's src URL + var destUrl = make_absolute_url({subdomain: "www", + path: "/common/redirect.py", + query: "location=" + make_absolute_url( + {path: "/navigation-timing/resources/blank_page_green.html"}) + }); + var frameContext = document.getElementById("frameContext"); + frameContext.onload = onload_test; + frameContext.src = destUrl; + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_xserver_opt_in.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_xserver_opt_in.html new file mode 100644 index 00000000000..11dc5b7df0a --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_redirect_xserver_opt_in.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/utils.js"></script> + <script> + + function verifyTimingEventOrder(eventOrder, timingEntry) { + for (var i = 0; i < eventOrder.length - 1; i++) { + assert_true(timingEntry[eventOrder[i]] < timingEntry[eventOrder[i + 1]], + "Expected " + eventOrder[i] + " to be no greater than " + eventOrder[i + 1] + "."); + } + } + + function onload_test() + { + var frame_performance = document.getElementById("frameContext").contentWindow.performance; + assert_equals(frame_performance.getEntriesByType("navigation")[0].type, + "navigate", + "Expected navigation type to be navigate."); + assert_equals(frame_performance.getEntriesByType("navigation")[0].redirectCount, 1, "Expected redirectCount to be 1."); + + var timgingEvents = [ + 'startTime', + 'redirectStart', + 'redirectEnd', + ]; + verifyTimingEventOrder(timgingEvents, frame_performance.getEntriesByType("navigation")[0]); + done(); + } + </script> + + </head> + <body> + <h1>Description</h1> + <p>This test validates the values of the window.performance.getEntriesByType("navigation")[0].redirectCount and the + window.performance.getEntriesByType("navigation")[0].redirectStart/End times for a cross-origin server side redirect navigation when the redirect chooses to opt-in.</p> + + <iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe> + <script> + // combine the page origin and redirect origin into the IFRAME's src URL + var destUrl = make_absolute_url({subdomain: "www", + path: "/common/redirect-opt-in.py", + query: "location=" + make_absolute_url( + {path: "/navigation-timing/resources/blank_page_green.html"}) + }); + var frameContext = document.getElementById("frameContext"); + frameContext.onload = onload_test; + frameContext.src = destUrl; + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unique_nav_instances.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unique_nav_instances.html new file mode 100644 index 00000000000..1d77ab6bae1 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unique_nav_instances.html @@ -0,0 +1,76 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h1>Description</h1> + <p>This test validates that each window has a unique nav timing 2 instance.</p> + <iframe id="frameContext" src="resources/blank_page_green.html" style="display:none;";></iframe> + <script> + + var navTiming2Attributes = [ + 'connectEnd', + 'connectStart', + 'decodedBodySize', + 'domComplete', + 'domContentLoadedEventEnd', + 'domContentLoadedEventStart', + 'domInteractive', + 'domainLookupEnd', + 'domainLookupStart', + 'duration', + 'encodedBodySize', + 'entryType', + 'fetchStart', + 'initiatorType', + 'loadEventEnd', + 'loadEventStart', + 'name', + 'redirectCount', + 'redirectEnd', + 'redirectStart', + 'requestStart', + 'responseEnd', + 'responseStart', + 'secureConnectionStart', + 'transferSize', + 'type', + 'unloadEventEnd', + 'unloadEventStart', + 'workerStart' + ]; + + function not_same_instance(instance1, instance2, attributes) { + for (var i in attributes) { + if (instance1[attributes[i]] != instance2[attributes[i]]) + return true; + } + return false; + } + + async_test(function (t) { + var observer = new PerformanceObserver( + t.step_func(function (entryList) { + assert_equals(entryList.getEntriesByType("navigation").length, 1, "Only one nav timing instance exists."); + assert_equals(document.getElementById("frameContext").contentWindow.performance.getEntriesByType("navigation").length, 1, + "Only one nav timing instance exists."); + var main_frame_instance = entryList.getEntriesByType("navigation")[0]; + var iframe_instance = document.getElementById("frameContext").contentWindow.performance.getEntriesByType("navigation")[0]; + assert_true(not_same_instance(main_frame_instance, iframe_instance, navTiming2Attributes), + "Two nav timing instances are not the same instance."); + observer.disconnect(); + t.done(); + }) + ); + observer.observe({entryTypes: ["navigation"]}); + + }, "Each window has a unique nav timing 2 instance."); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_no_previous_document.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_no_previous_document.html new file mode 100644 index 00000000000..3e7b0721d27 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_no_previous_document.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + + <script> + + function onload_test() + { + var frame = document.getElementById("frameContext"); + + assert_equals(frame.contentWindow.performance.getEntriesByType("navigation")[0].type, + "navigate", + "Expected navigation type to be navigate."); + + assert_equals(frame.contentWindow.performance.getEntriesByType("navigation")[0].unloadEventStart, 0, + "Expected unloadEventStart to be 0."); + assert_equals(frame.contentWindow.performance.getEntriesByType("navigation")[0].unloadEventEnd, 0, + "Expected unloadEventEnd to be 0."); + done(); + } + </script> + + </head> + <body> + <h1>Description</h1> + <p>This test validates the unload event times are 0 when there is no previous document.</p> + + <iframe id="frameContext" onload="onload_test();" src="resources/blank_page_green.html" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html new file mode 100644 index 00000000000..4db4dd996d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/utils.js"></script> + <script> + + function onload_test() + { + var reload_frame = document.getElementById("frameContext"); + reload_frame.onload = do_test; + reload_frame.contentWindow.location.href = "resources/blank_page_green.html"; + } + + function do_test() + { + var newNavTiming = document.getElementById("frameContext").contentWindow.performance.getEntriesByType("navigation")[0]; + assert_equals(newNavTiming.type, "navigate", "Expected navigation type to be navigate."); + assert_equals(newNavTiming.unloadEventStart, 0, "Expected unloadEventStart to be 0."); + assert_equals(newNavTiming.unloadEventEnd, 0, "Expected unloadEventEnd to be 0."); + done(); + } + </script> + </head> + <body> + <h1>Description</h1> + <p>This test validates the value of window.performance.getEntriesByType("navigation")[0].(type/unloadEventEnd/unloadEventStart) with a navigation on top of a cross-origin document.</p> + + <p>This page should be loaded with a green background frame below. The frame will be automatically reloaded + and then verified that + <ul> + <li>The window.performance.getEntriesByType("navigation").type = "navigate"</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventStart = 0</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventEnd = 0</li> + </ul> + </p> + + <iframe id="frameContext" onload="onload_test();" src="http://www.apple.com" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html new file mode 100644 index 00000000000..8a7f57d7460 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_with_cross_origin_redirects.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/utils.js"></script> + <script> + + var reload_frame; + + function onload_test() + { + reload_frame = document.getElementById("frameContext"); + reload_frame.onload = do_test; + setTimeout("reload_the_frame();", 100); + } + + function reload_the_frame() + { + var destUrl = make_absolute_url({subdomain: "www", + path: "/common/redirect.py", + query: "location=" + make_absolute_url( + {path: "/navigation-timing/resources/blank_page_yellow.html"}) + }); + reload_frame.contentWindow.location.href = destUrl; + } + + function do_test() + { + var newNavTiming = document.getElementById("frameContext").contentWindow.performance.getEntriesByType("navigation")[0]; + assert_equals(newNavTiming.type, "navigate", "Expected navigation type to be navigate."); + assert_equals(newNavTiming.unloadEventStart, 0, "Expected unloadEventStart to be 0."); + assert_equals(newNavTiming.unloadEventEnd, 0, "Expected unloadEventEnd to be 0."); + done(); + } + </script> + </head> + <body> + <h1>Description</h1> + <p>This test validates the value of window.performance.getEntriesByType("navigation")[0].(type/unloadEventEnd/unloadEventStart) with a reloaded navigation.</p> + + <p>This page should be loaded with a green background frame below. The frame will be automatically reloaded + and then verified that + <ul> + <li>The window.performance.getEntriesByType("navigation").type = "navigate"</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventStart == 0</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventEnd == 0</li> + </ul> + </p> + + <iframe id="frameContext" onload="onload_test();" src="resources/blank_page_green.html" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_with_previous_document.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_with_previous_document.html new file mode 100644 index 00000000000..90f336d1340 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_unloadEvents_with_previous_document.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <title>Navigation Timing 2 WPT</title> + <link rel="author" title="Google" href="http://www.google.com/" /> + <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + + function onload_test() + { + var reload_frame = document.getElementById("frameContext"); + reload_frame.onload = do_test; + reload_frame.contentWindow.location.reload(true); + } + + function do_test() + { + var newNavTiming = document.getElementById("frameContext").contentWindow.performance.getEntriesByType("navigation")[0]; + assert_true(newNavTiming.unloadEventStart > 0, "Expected unloadEventStart to be greater than 0."); + assert_true(newNavTiming.unloadEventEnd > 0, "Expected unloadEventEnd to be greater than 0."); + done(); + } + </script> + </head> + <body> + <h1>Description</h1> + <p>This test validates the value of window.performance.getEntriesByType("navigation")[0].(type/unloadEventEnd/unloadEventStart) with a reloaded navigation.</p> + + <p>This page should be loaded with a green background frame below. The frame will be automatically reloaded + and then verified that + <ul> + <li>The window.performance.getEntriesByType("navigation").unloadEventStart > 0 after reload</li> + <li>The window.performance.getEntriesByType("navigation").unloadEventEnd > 0 after reload</li> + </ul> + </p> + + <iframe id="frameContext" onload="onload_test();" src="resources/blank_page_green.html" style="width: 250px; height: 250px;"></iframe> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.copy.html new file mode 100644 index 00000000000..bc2ed9cee5e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.copy.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.copy</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'copy'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,191, "50,25", "255,255,0,191", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.copy.worker.js new file mode 100644 index 00000000000..35dd3d9facf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.copy.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.copy +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'copy'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,191, "50,25", "255,255,0,191", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.html new file mode 100644 index 00000000000..c36b232b6dd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.destination-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-atop'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 128,255,128,191, "50,25", "128,255,128,191", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.worker.js new file mode 100644 index 00000000000..17181cb4224 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-atop.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.destination-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-atop'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 128,255,128,191, "50,25", "128,255,128,191", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-in.html new file mode 100644 index 00000000000..f7249e40420 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-in.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.destination-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-in'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,96, "50,25", "0,255,255,96", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-in.worker.js new file mode 100644 index 00000000000..12504f950a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-in.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.destination-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-in'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,96, "50,25", "0,255,255,96", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-out.html new file mode 100644 index 00000000000..454cf7544ac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-out.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.destination-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.destination-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,32, "50,25", "0,255,255,32", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-out.worker.js new file mode 100644 index 00000000000..ed8835bf6e3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-out.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.destination-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,32, "50,25", "0,255,255,32", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-over.html new file mode 100644 index 00000000000..872bfe08c8c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-over.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.destination-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.destination-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-over'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 109,255,146,223, "50,25", "109,255,146,223", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-over.worker.js new file mode 100644 index 00000000000..8d350c5de90 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.destination-over.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.destination-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-over'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 109,255,146,223, "50,25", "109,255,146,223", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.lighter.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.lighter.html new file mode 100644 index 00000000000..781b6c1deef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.lighter.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.lighter</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.lighter</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'lighter'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,128,255, "50,25", "191,255,128,255", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.lighter.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.lighter.worker.js new file mode 100644 index 00000000000..060c6a3ffa3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.lighter.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.lighter +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'lighter'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,128,255, "50,25", "191,255,128,255", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-atop.html new file mode 100644 index 00000000000..22eedc08120 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-atop.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.source-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.source-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-atop'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-atop.worker.js new file mode 100644 index 00000000000..0005bca4c37 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-atop.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.source-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-atop'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-in.html new file mode 100644 index 00000000000..564b864457b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-in.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.source-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-in'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-in.worker.js new file mode 100644 index 00000000000..82a508e7525 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-in.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.source-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-in'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-out.html new file mode 100644 index 00000000000..431d6bcf18e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-out.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.source-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-out'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-out.worker.js new file mode 100644 index 00000000000..ce16d3bc6a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-out.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.source-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-out'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-over.html new file mode 100644 index 00000000000..123aa5e64d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-over.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.source-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.source-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-over'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 219,255,36,223, "50,25", "219,255,36,223", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-over.worker.js new file mode 100644 index 00000000000..b5dcfff3cd5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.source-over.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.source-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'source-over'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 219,255,36,223, "50,25", "219,255,36,223", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.xor.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.xor.html new file mode 100644 index 00000000000..49ae6c08c68 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.xor.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.canvas.xor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.canvas.xor</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'xor'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.xor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.xor.worker.js new file mode 100644 index 00000000000..f3d50255ac5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.canvas.xor.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.canvas.xor +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); +var ctx2 = offscreenCanvas2.getContext('2d'); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'xor'; + ctx.drawImage(offscreenCanvas2, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.copy.html new file mode 100644 index 00000000000..4761b047a68 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.copy.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.copy</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.copy.worker.js new file mode 100644 index 00000000000..fc4a4cb58d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.copy.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.copy +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-atop.html new file mode 100644 index 00000000000..aa863d15c76 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-atop.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.destination-atop</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-atop.worker.js new file mode 100644 index 00000000000..6c5807889ed --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-atop.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.destination-atop +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-in.html new file mode 100644 index 00000000000..3bde3ff7c5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-in.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.destination-in</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-in.worker.js new file mode 100644 index 00000000000..bccf3a8869a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-in.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.destination-in +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-out.html new file mode 100644 index 00000000000..5ded0b36154 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-out.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.destination-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.destination-out</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-out.worker.js new file mode 100644 index 00000000000..fee113a1c61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-out.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.destination-out +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-over.html new file mode 100644 index 00000000000..4776e0e2160 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-over.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.destination-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.destination-over</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-over.worker.js new file mode 100644 index 00000000000..5116844113d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.destination-over.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.destination-over +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.lighter.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.lighter.html new file mode 100644 index 00000000000..bf1cd8bb1b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.lighter.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.lighter</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.lighter</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.lighter.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.lighter.worker.js new file mode 100644 index 00000000000..e9e9fc9cd63 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.lighter.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.lighter +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-atop.html new file mode 100644 index 00000000000..3a0f0df5de6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-atop.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.source-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.source-atop</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-atop.worker.js new file mode 100644 index 00000000000..a6e0fdcf828 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-atop.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.source-atop +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-in.html new file mode 100644 index 00000000000..15e0aee5532 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-in.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.source-in</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-in.worker.js new file mode 100644 index 00000000000..6b520c1b392 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-in.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.source-in +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-out.html new file mode 100644 index 00000000000..97de42d9ba3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-out.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.source-out</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-out.worker.js new file mode 100644 index 00000000000..72a8f2911bb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-out.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.source-out +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-over.html new file mode 100644 index 00000000000..9ac231d6a45 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-over.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.source-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.source-over</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-over.worker.js new file mode 100644 index 00000000000..a5946266514 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.source-over.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.source-over +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.xor.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.xor.html new file mode 100644 index 00000000000..fb99584888c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.xor.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.clip.xor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.clip.xor</h1> +<p class="desc">fill() does not affect pixels outside the clip region.</p> + + +<script> +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.xor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.xor.worker.js new file mode 100644 index 00000000000..629968029a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.clip.xor.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.clip.xor +// Description:fill() does not affect pixels outside the clip region. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() does not affect pixels outside the clip region."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.rect(-20, -20, 10, 10); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.html new file mode 100644 index 00000000000..0ccfea9a6ed --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.canvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.canvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.worker.js new file mode 100644 index 00000000000..ab8a6424acd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvas.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.canvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.html new file mode 100644 index 00000000000..f797c637649 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.canvascopy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.canvascopy</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy' +ctx.globalAlpha = 0.51; +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,130, "50,25", "0,255,0,130", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.worker.js new file mode 100644 index 00000000000..bc8daaf91ad --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvascopy.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.canvascopy +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy' +ctx.globalAlpha = 0.51; +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,130, "50,25", "0,255,0,130", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.html new file mode 100644 index 00000000000..ea6c5ac2d68 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.canvaspattern</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.canvaspattern</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.worker.js new file mode 100644 index 00000000000..08b5d6ad9db --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.canvaspattern.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.canvaspattern +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.default.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.default.html new file mode 100644 index 00000000000..6a15c0c8978 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.default.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.default</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.default</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.globalAlpha, 1.0, "ctx.globalAlpha", "1.0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.default.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.default.worker.js new file mode 100644 index 00000000000..c961928284e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.default.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.default +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.globalAlpha, 1.0, "ctx.globalAlpha", "1.0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.html new file mode 100644 index 00000000000..13acdaffff5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.fill</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.fill</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.worker.js new file mode 100644 index 00000000000..d2fbf0827b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.fill.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.fill +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.image.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.image.html new file mode 100644 index 00000000000..f24e06a08e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.image.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.image</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.image</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.image.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.image.worker.js new file mode 100644 index 00000000000..4974687e8d2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.image.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.image +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.html new file mode 100644 index 00000000000..33fa23a8f97 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.imagepattern</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.imagepattern</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + ctx.fillRect(0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.worker.js new file mode 100644 index 00000000000..d805f69f47c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.imagepattern.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.imagepattern +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + ctx.fillRect(0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 2,253,0,255, "50,25", "2,253,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.html new file mode 100644 index 00000000000..f422cfea233 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.invalid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalAlpha = 0.5; +var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons +ctx.globalAlpha = Infinity; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = -Infinity; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = NaN; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.worker.js new file mode 100644 index 00000000000..095b9446b7f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.invalid.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.invalid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalAlpha = 0.5; +var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons +ctx.globalAlpha = Infinity; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = -Infinity; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = NaN; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.range.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.range.html new file mode 100644 index 00000000000..bde15e2d8c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.range.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.globalAlpha.range</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.globalAlpha.range</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalAlpha = 0.5; +var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons +ctx.globalAlpha = 1.1; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = -0.1; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = 0; +_assertSame(ctx.globalAlpha, 0, "ctx.globalAlpha", "0"); +ctx.globalAlpha = 1; +_assertSame(ctx.globalAlpha, 1, "ctx.globalAlpha", "1"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.range.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.range.worker.js new file mode 100644 index 00000000000..f38ee56f9a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.globalAlpha.range.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.globalAlpha.range +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalAlpha = 0.5; +var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons +ctx.globalAlpha = 1.1; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = -0.1; +_assertSame(ctx.globalAlpha, a, "ctx.globalAlpha", "a"); +ctx.globalAlpha = 0; +_assertSame(ctx.globalAlpha, 0, "ctx.globalAlpha", "0"); +ctx.globalAlpha = 1; +_assertSame(ctx.globalAlpha, 1, "ctx.globalAlpha", "1"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.copy.html new file mode 100644 index 00000000000..3001aa1c491 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.copy.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.copy</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,191, "50,25", "255,255,0,191", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.copy.worker.js new file mode 100644 index 00000000000..0476e3a1149 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.copy.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.copy +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,191, "50,25", "255,255,0,191", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-atop.html new file mode 100644 index 00000000000..2b18c36c710 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-atop.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.destination-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 128,255,128,191, "50,25", "128,255,128,191", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-atop.worker.js new file mode 100644 index 00000000000..b5870047a2b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-atop.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.destination-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 128,255,128,191, "50,25", "128,255,128,191", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-in.html new file mode 100644 index 00000000000..cfde801496f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-in.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.destination-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,96, "50,25", "0,255,255,96", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-in.worker.js new file mode 100644 index 00000000000..eff6475a5da --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-in.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.destination-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,96, "50,25", "0,255,255,96", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-out.html new file mode 100644 index 00000000000..1f705119adb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-out.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.destination-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.destination-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,32, "50,25", "0,255,255,32", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-out.worker.js new file mode 100644 index 00000000000..fda73d92fc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-out.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.destination-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,32, "50,25", "0,255,255,32", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-over.html new file mode 100644 index 00000000000..1b21d2d9f53 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-over.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.destination-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.destination-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 109,255,146,223, "50,25", "109,255,146,223", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-over.worker.js new file mode 100644 index 00000000000..620911dd4f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.destination-over.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.destination-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 109,255,146,223, "50,25", "109,255,146,223", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.lighter.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.lighter.html new file mode 100644 index 00000000000..f898e447624 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.lighter.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.lighter</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.lighter</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,128,255, "50,25", "191,255,128,255", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.lighter.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.lighter.worker.js new file mode 100644 index 00000000000..574de5c3408 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.lighter.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.lighter +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,128,255, "50,25", "191,255,128,255", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-atop.html new file mode 100644 index 00000000000..012d8920159 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-atop.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.source-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.source-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-atop.worker.js new file mode 100644 index 00000000000..b159a7d0a5c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-atop.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.source-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-in.html new file mode 100644 index 00000000000..f41fc4aa10d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-in.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.source-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-in.worker.js new file mode 100644 index 00000000000..789fcb9039d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-in.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.source-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-out.html new file mode 100644 index 00000000000..91860e78795 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-out.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.source-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-out.worker.js new file mode 100644 index 00000000000..583d2222e7b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-out.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.source-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,96, "50,25", "255,255,0,96", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-over.html new file mode 100644 index 00000000000..b8e52cac0ad --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-over.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.source-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.source-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 219,255,36,223, "50,25", "219,255,36,223", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-over.worker.js new file mode 100644 index 00000000000..b459339e4fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.source-over.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.source-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 219,255,36,223, "50,25", "219,255,36,223", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.xor.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.xor.html new file mode 100644 index 00000000000..d050711da1e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.xor.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.image.xor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.image.xor</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.xor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.xor.worker.js new file mode 100644 index 00000000000..bd77785b558 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.image.xor.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.image.xor +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 191,255,64,128, "50,25", "191,255,64,128", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.casesensitive.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.casesensitive.html new file mode 100644 index 00000000000..7c7016e4de4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.casesensitive.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.casesensitive</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.casesensitive</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'Source-over'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.casesensitive.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.casesensitive.worker.js new file mode 100644 index 00000000000..091dfd61bbf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.casesensitive.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.casesensitive +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'Source-over'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.clear.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.clear.html new file mode 100644 index 00000000000..cb15204ac61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.clear.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.clear</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.clear</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'clear'; +_assertSame(ctx.globalCompositeOperation, 'clear', "ctx.globalCompositeOperation", "'clear'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.clear.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.clear.worker.js new file mode 100644 index 00000000000..1efd1494e60 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.clear.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.clear +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'clear'; +_assertSame(ctx.globalCompositeOperation, 'clear', "ctx.globalCompositeOperation", "'clear'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.darker.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.darker.html new file mode 100644 index 00000000000..1f4cfb07a65 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.darker.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.darker</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.darker</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'darker'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.darker.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.darker.worker.js new file mode 100644 index 00000000000..2b282f5640a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.darker.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.darker +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'darker'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.default.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.default.html new file mode 100644 index 00000000000..b114e149479 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.default.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.default</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.default</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.globalCompositeOperation, 'source-over', "ctx.globalCompositeOperation", "'source-over'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.default.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.default.worker.js new file mode 100644 index 00000000000..906f1bb3390 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.default.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.default +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.globalCompositeOperation, 'source-over', "ctx.globalCompositeOperation", "'source-over'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.get.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.get.html new file mode 100644 index 00000000000..e3c8f9ee2fb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.get.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.get</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.get</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var modes = ['source-atop', 'source-in', 'source-out', 'source-over', + 'destination-atop', 'destination-in', 'destination-out', 'destination-over', + 'lighter', 'copy', 'xor']; +for (var i = 0; i < modes.length; ++i) +{ + ctx.globalCompositeOperation = modes[i]; + _assertSame(ctx.globalCompositeOperation, modes[i], "ctx.globalCompositeOperation", "modes[\""+(i)+"\"]"); +} + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.get.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.get.worker.js new file mode 100644 index 00000000000..2dd50fa6d97 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.get.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.get +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var modes = ['source-atop', 'source-in', 'source-out', 'source-over', + 'destination-atop', 'destination-in', 'destination-out', 'destination-over', + 'lighter', 'copy', 'xor']; +for (var i = 0; i < modes.length; ++i) +{ + ctx.globalCompositeOperation = modes[i]; + _assertSame(ctx.globalCompositeOperation, modes[i], "ctx.globalCompositeOperation", "modes[\""+(i)+"\"]"); +} + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.highlight.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.highlight.html new file mode 100644 index 00000000000..1bfdb3b1657 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.highlight.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.highlight</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.highlight</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'highlight'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.highlight.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.highlight.worker.js new file mode 100644 index 00000000000..fac64fce135 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.highlight.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.highlight +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'highlight'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.html new file mode 100644 index 00000000000..7e1d65c33b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.nullsuffix</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.nullsuffix</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'source-over\0'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.worker.js new file mode 100644 index 00000000000..831f9477418 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.nullsuffix.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.nullsuffix +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'source-over\0'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.over.html new file mode 100644 index 00000000000..71a34454bbf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.over.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'over'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.over.worker.js new file mode 100644 index 00000000000..89c26345f3c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.over.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'over'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.unrecognised.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.unrecognised.html new file mode 100644 index 00000000000..36e990ff05d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.unrecognised.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.operation.unrecognised</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.operation.unrecognised</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'nonexistent'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.unrecognised.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.unrecognised.worker.js new file mode 100644 index 00000000000..5980d166a0e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.operation.unrecognised.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.operation.unrecognised +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'xor'; +ctx.globalCompositeOperation = 'nonexistent'; +_assertSame(ctx.globalCompositeOperation, 'xor', "ctx.globalCompositeOperation", "'xor'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.copy.html new file mode 100644 index 00000000000..98fd5d22464 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.copy.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.copy</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.copy.worker.js new file mode 100644 index 00000000000..41249671365 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.copy.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.copy +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-atop.html new file mode 100644 index 00000000000..a3b645f9d5b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-atop.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.destination-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,255, "50,25", "0,255,255,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-atop.worker.js new file mode 100644 index 00000000000..bb2bf5a3169 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-atop.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.destination-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,255, "50,25", "0,255,255,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-in.html new file mode 100644 index 00000000000..40dbb4c7f06 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-in.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.destination-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,255, "50,25", "0,255,255,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-in.worker.js new file mode 100644 index 00000000000..b54208f66ce --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-in.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.destination-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,255, "50,25", "0,255,255,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-out.html new file mode 100644 index 00000000000..62171ecac9e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-out.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.destination-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.destination-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-out.worker.js new file mode 100644 index 00000000000..fbcd75d61a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-out.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.destination-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-over.html new file mode 100644 index 00000000000..14669d6ba4b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-over.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.destination-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.destination-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,255, "50,25", "0,255,255,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-over.worker.js new file mode 100644 index 00000000000..76d0df25834 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.destination-over.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.destination-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,255,255, "50,25", "0,255,255,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.lighter.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.lighter.html new file mode 100644 index 00000000000..af7572a0d95 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.lighter.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.lighter</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.lighter</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,255,255, "50,25", "255,255,255,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.lighter.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.lighter.worker.js new file mode 100644 index 00000000000..344a5a3b74b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.lighter.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.lighter +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,255,255, "50,25", "255,255,255,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-atop.html new file mode 100644 index 00000000000..082d4215a4d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-atop.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.source-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.source-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-atop.worker.js new file mode 100644 index 00000000000..c2d0f0e12c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-atop.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.source-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-in.html new file mode 100644 index 00000000000..c3552686b32 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-in.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.source-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-in.worker.js new file mode 100644 index 00000000000..de94d1eea3e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-in.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.source-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-out.html new file mode 100644 index 00000000000..89fccfebcd7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-out.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.source-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-out.worker.js new file mode 100644 index 00000000000..76e6adc174a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-out.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.source-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-over.html new file mode 100644 index 00000000000..de2206f54eb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-over.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.source-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.source-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-over.worker.js new file mode 100644 index 00000000000..edbd628a22c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.source-over.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.source-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 255,255,0,255, "50,25", "255,255,0,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.xor.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.xor.html new file mode 100644 index 00000000000..8d48ff8dbef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.xor.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.solid.xor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.solid.xor</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.xor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.xor.worker.js new file mode 100644 index 00000000000..a24595171d9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.solid.xor.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.solid.xor +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.fillStyle = 'rgba(255, 255, 0, 1.0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.copy.html new file mode 100644 index 00000000000..cf256a9d04a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.copy.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.copy</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,255,191, "50,25", "0,0,255,191", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.copy.worker.js new file mode 100644 index 00000000000..8fb35ab43c2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.copy.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.copy +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,255,191, "50,25", "0,0,255,191", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.html new file mode 100644 index 00000000000..04bfca5e680 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.destination-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,128,128,191, "50,25", "0,128,128,191", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.worker.js new file mode 100644 index 00000000000..bc036b225ab --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-atop.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.destination-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,128,128,191, "50,25", "0,128,128,191", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-in.html new file mode 100644 index 00000000000..e429c2bdeaf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-in.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.destination-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,96, "50,25", "0,255,0,96", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-in.worker.js new file mode 100644 index 00000000000..f9ee6d213ab --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-in.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.destination-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,96, "50,25", "0,255,0,96", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-out.html new file mode 100644 index 00000000000..a80a3a91728 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-out.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.destination-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.destination-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,32, "50,25", "0,255,0,32", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-out.worker.js new file mode 100644 index 00000000000..f61ac0fd7df --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-out.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.destination-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,32, "50,25", "0,255,0,32", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-over.html new file mode 100644 index 00000000000..87adccf59a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-over.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.destination-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.destination-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,146,109,223, "50,25", "0,146,109,223", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-over.worker.js new file mode 100644 index 00000000000..1160e73d844 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.destination-over.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.destination-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,146,109,223, "50,25", "0,146,109,223", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.lighter.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.lighter.html new file mode 100644 index 00000000000..9ae5ddeba9b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.lighter.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.lighter</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.lighter</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,128,191,255, "50,25", "0,128,191,255", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.lighter.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.lighter.worker.js new file mode 100644 index 00000000000..8da114c9b2b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.lighter.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.lighter +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'lighter'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,128,191,255, "50,25", "0,128,191,255", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-atop.html new file mode 100644 index 00000000000..bdb283cba03 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-atop.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.source-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.source-atop</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,64,191,128, "50,25", "0,64,191,128", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-atop.worker.js new file mode 100644 index 00000000000..a03e2e4a330 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-atop.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.source-atop +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-atop'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,64,191,128, "50,25", "0,64,191,128", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-in.html new file mode 100644 index 00000000000..3fb830ae564 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-in.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.source-in</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,255,96, "50,25", "0,0,255,96", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-in.worker.js new file mode 100644 index 00000000000..f49539b59e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-in.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.source-in +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,255,96, "50,25", "0,0,255,96", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-out.html new file mode 100644 index 00000000000..b3405bb0fad --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-out.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.source-out</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,255,96, "50,25", "0,0,255,96", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-out.worker.js new file mode 100644 index 00000000000..afa1adf14aa --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-out.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.source-out +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,255,96, "50,25", "0,0,255,96", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-over.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-over.html new file mode 100644 index 00000000000..cc1e9533096 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-over.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.source-over</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.source-over</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,36,219,223, "50,25", "0,36,219,223", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-over.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-over.worker.js new file mode 100644 index 00000000000..8153e176a87 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.source-over.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.source-over +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-over'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,36,219,223, "50,25", "0,36,219,223", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.xor.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.xor.html new file mode 100644 index 00000000000..3f98e78a3c6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.xor.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.transparent.xor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.transparent.xor</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,64,191,128, "50,25", "0,64,191,128", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.xor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.xor.worker.js new file mode 100644 index 00000000000..58634bd6e8e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.transparent.xor.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.transparent.xor +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,64,191,128, "50,25", "0,64,191,128", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.html new file mode 100644 index 00000000000..49a73820a05 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.fill.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.fill.copy</h1> +<p class="desc">fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.worker.js new file mode 100644 index 00000000000..9ecbf5d461f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.copy.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.fill.copy +// Description:fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.html new file mode 100644 index 00000000000..bf41ce61516 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.fill.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.fill.destination-atop</h1> +<p class="desc">fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.worker.js new file mode 100644 index 00000000000..3f1af3d7d5c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-atop.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.fill.destination-atop +// Description:fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.html new file mode 100644 index 00000000000..e27c70a234a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.fill.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.fill.destination-in</h1> +<p class="desc">fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.worker.js new file mode 100644 index 00000000000..fe1ae656ba8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.destination-in.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.fill.destination-in +// Description:fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.html new file mode 100644 index 00000000000..66b0d641969 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.fill.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.fill.source-in</h1> +<p class="desc">fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.worker.js new file mode 100644 index 00000000000..42e1ff037e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-in.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.fill.source-in +// Description:fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.html new file mode 100644 index 00000000000..5c80c3f73f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.fill.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.fill.source-out</h1> +<p class="desc">fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.worker.js new file mode 100644 index 00000000000..6f73870438d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.fill.source-out.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.fill.source-out +// Description:fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +ctx.fillStyle = 'rgba(0, 0, 255, 0.75)'; +ctx.translate(0, 25); +ctx.fillRect(0, 50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.html new file mode 100644 index 00000000000..733a5135877 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.image.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.image.copy</h1> +<p class="desc">drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.worker.js new file mode 100644 index 00000000000..7898066df39 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.copy.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.image.copy +// Description:drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.html new file mode 100644 index 00000000000..9224e74e0aa --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.image.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.image.destination-atop</h1> +<p class="desc">drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.worker.js new file mode 100644 index 00000000000..c2799605e01 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-atop.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.image.destination-atop +// Description:drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.html new file mode 100644 index 00000000000..5102b1941df --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.image.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.image.destination-in</h1> +<p class="desc">drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.worker.js new file mode 100644 index 00000000000..9a1090da712 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.destination-in.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.image.destination-in +// Description:drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.html new file mode 100644 index 00000000000..0d2a898b10e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.image.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.image.source-in</h1> +<p class="desc">drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.worker.js new file mode 100644 index 00000000000..03070b4e993 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-in.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.image.source-in +// Description:drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.html new file mode 100644 index 00000000000..265902b3cd6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.image.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.image.source-out</h1> +<p class="desc">drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.worker.js new file mode 100644 index 00000000000..41b3fa5763c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.image.source-out.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.image.source-out +// Description:drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + _assertPixelApprox(offscreenCanvas, 15,15, 0,0,0,0, "15,15", "0,0,0,0", 5); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.html new file mode 100644 index 00000000000..92422f58f64 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.nocontext.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.nocontext.copy</h1> +<p class="desc">drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.worker.js new file mode 100644 index 00000000000..75778f44cb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.copy.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.nocontext.copy +// Description:drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.html new file mode 100644 index 00000000000..b058c6fbb47 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.nocontext.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.nocontext.destination-atop</h1> +<p class="desc">drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.worker.js new file mode 100644 index 00000000000..0eee51ab0f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-atop.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.nocontext.destination-atop +// Description:drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.html new file mode 100644 index 00000000000..d9b9dc3f640 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.nocontext.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.nocontext.destination-in</h1> +<p class="desc">drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.worker.js new file mode 100644 index 00000000000..83163655a92 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.destination-in.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.nocontext.destination-in +// Description:drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.html new file mode 100644 index 00000000000..fc52d1094fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.nocontext.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.nocontext.source-in</h1> +<p class="desc">drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.worker.js new file mode 100644 index 00000000000..cca1b1bd345 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-in.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.nocontext.source-in +// Description:drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.html new file mode 100644 index 00000000000..b555c653067 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.nocontext.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.nocontext.source-out</h1> +<p class="desc">drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.worker.js new file mode 100644 index 00000000000..40d7cc85132 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.nocontext.source-out.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.nocontext.source-out +// Description:drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.html new file mode 100644 index 00000000000..0a67a45f83f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.pattern.copy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.pattern.copy</h1> +<p class="desc">Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.worker.js new file mode 100644 index 00000000000..ea4f47fb823 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.copy.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.pattern.copy +// Description:Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'copy'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.html new file mode 100644 index 00000000000..0b290d60aac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.pattern.destination-atop</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.pattern.destination-atop</h1> +<p class="desc">Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.worker.js new file mode 100644 index 00000000000..f32811e25bc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-atop.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.pattern.destination-atop +// Description:Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.html new file mode 100644 index 00000000000..88ec897a62e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.pattern.destination-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.pattern.destination-in</h1> +<p class="desc">Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.worker.js new file mode 100644 index 00000000000..0800f0bf7e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.destination-in.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.pattern.destination-in +// Description:Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.html new file mode 100644 index 00000000000..78d1fad65a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.pattern.source-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.pattern.source-in</h1> +<p class="desc">Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.worker.js new file mode 100644 index 00000000000..a34d8f6d6ee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-in.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.pattern.source-in +// Description:Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-in'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.html b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.html new file mode 100644 index 00000000000..47237e3dbc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.composite.uncovered.pattern.source-out</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.composite.uncovered.pattern.source-out</h1> +<p class="desc">Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.</p> + + +<script> +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.worker.js new file mode 100644 index 00000000000..bb4514e4e31 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/compositing/2d.composite.uncovered.pattern.source-out.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.composite.uncovered.pattern.source-out +// Description:Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged."); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = 'rgba(0, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'source-out'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0", 5); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.coordinatespace.html b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.coordinatespace.html new file mode 100644 index 00000000000..ec24a19c173 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.coordinatespace.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.coordinatespace</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.coordinatespace</h1> +<p class="desc">Coordinate space goes from top-left to bottom-right</p> + +<p class="notes">This should not be upside down. +<script> +var t = async_test("Coordinate space goes from top-left to bottom-right"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#00f'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0ff'; +ctx.fillRect(0, 0, 50, 25); +_assertPixel(offscreenCanvas, 25,12, 0,255,255,255, "25,12", "0,255,255,255"); +_assertPixel(offscreenCanvas, 75,12, 0,0,255,255, "75,12", "0,0,255,255"); +_assertPixel(offscreenCanvas, 25,37, 0,0,255,255, "25,37", "0,0,255,255"); +_assertPixel(offscreenCanvas, 75,37, 0,0,255,255, "75,37", "0,0,255,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.coordinatespace.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.coordinatespace.worker.js new file mode 100644 index 00000000000..7cad97b2dfb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.coordinatespace.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.coordinatespace +// Description:Coordinate space goes from top-left to bottom-right +// Note:<p class="notes">This should not be upside down. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Coordinate space goes from top-left to bottom-right"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#00f'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0ff'; +ctx.fillRect(0, 0, 50, 25); +_assertPixel(offscreenCanvas, 25,12, 0,255,255,255, "25,12", "0,255,255,255"); +_assertPixel(offscreenCanvas, 75,12, 0,0,255,255, "75,12", "0,0,255,255"); +_assertPixel(offscreenCanvas, 25,37, 0,0,255,255, "25,37", "0,0,255,255"); +_assertPixel(offscreenCanvas, 75,37, 0,0,255,255, "75,37", "0,0,255,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.missingargs.html b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.missingargs.html new file mode 100644 index 00000000000..0be8b58b61e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.missingargs.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.missingargs</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.missingargs</h1> +<p class="desc">Missing arguments cause TypeError</p> + + +<script> +var t = async_test("Missing arguments cause TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.scale(); }); +assert_throws(new TypeError(), function() { ctx.scale(1); }); +assert_throws(new TypeError(), function() { ctx.rotate(); }); +assert_throws(new TypeError(), function() { ctx.translate(); }); +assert_throws(new TypeError(), function() { ctx.translate(0); }); +if (ctx.transform) { // (avoid spurious failures, since the aim here is not to test that all features are supported) + assert_throws(new TypeError(), function() { ctx.transform(); }); + assert_throws(new TypeError(), function() { ctx.transform(1); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0, 1); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0, 1, 0); }); +} +if (ctx.setTransform) { + assert_throws(new TypeError(), function() { ctx.setTransform(); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0, 1); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0, 1, 0); }); +} +assert_throws(new TypeError(), function() { ctx.createLinearGradient(); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.createPattern(offscreenCanvas); }); +assert_throws(new TypeError(), function() { ctx.clearRect(); }); +assert_throws(new TypeError(), function() { ctx.clearRect(0); }); +assert_throws(new TypeError(), function() { ctx.clearRect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.clearRect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.fillRect(); }); +assert_throws(new TypeError(), function() { ctx.fillRect(0); }); +assert_throws(new TypeError(), function() { ctx.fillRect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.fillRect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(0); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.moveTo(); }); +assert_throws(new TypeError(), function() { ctx.moveTo(0); }); +assert_throws(new TypeError(), function() { ctx.lineTo(); }); +assert_throws(new TypeError(), function() { ctx.lineTo(0); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(0); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(0, 0); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0, 0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0, 0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0, 0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.rect(); }); +assert_throws(new TypeError(), function() { ctx.rect(0); }); +assert_throws(new TypeError(), function() { ctx.rect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.rect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.arc(); }); +assert_throws(new TypeError(), function() { ctx.arc(0); }); +assert_throws(new TypeError(), function() { ctx.arc(0, 0); }); +assert_throws(new TypeError(), function() { ctx.arc(0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.arc(0, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.drawImage(); }); +assert_throws(new TypeError(), function() { ctx.drawImage(offscreenCanvas); }); +assert_throws(new TypeError(), function() { ctx.drawImage(offscreenCanvas, 0); }); +// TODO: n >= 3 args on drawImage could be either a valid overload, +// or too few for another overload, or too many for another +// overload - what should happen? +if (ctx.createImageData) { + assert_throws(new TypeError(), function() { ctx.createImageData(); }); + assert_throws(new TypeError(), function() { ctx.createImageData(1); }); +} +if (ctx.getImageData) { + assert_throws(new TypeError(), function() { ctx.getImageData(); }); + assert_throws(new TypeError(), function() { ctx.getImageData(0); }); + assert_throws(new TypeError(), function() { ctx.getImageData(0, 0); }); + assert_throws(new TypeError(), function() { ctx.getImageData(0, 0, 1); }); +} +if (ctx.putImageData) { + var imgdata = ctx.getImageData(0, 0, 1, 1); + assert_throws(new TypeError(), function() { ctx.putImageData(); }); + assert_throws(new TypeError(), function() { ctx.putImageData(imgdata); }); + assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 0); }); +} +var g = ctx.createLinearGradient(0, 0, 0, 0); +assert_throws(new TypeError(), function() { g.addColorStop(); }); +assert_throws(new TypeError(), function() { g.addColorStop(0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.missingargs.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.missingargs.worker.js new file mode 100644 index 00000000000..1a9d41e385d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.missingargs.worker.js @@ -0,0 +1,116 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.missingargs +// Description:Missing arguments cause TypeError +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Missing arguments cause TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.scale(); }); +assert_throws(new TypeError(), function() { ctx.scale(1); }); +assert_throws(new TypeError(), function() { ctx.rotate(); }); +assert_throws(new TypeError(), function() { ctx.translate(); }); +assert_throws(new TypeError(), function() { ctx.translate(0); }); +if (ctx.transform) { // (avoid spurious failures, since the aim here is not to test that all features are supported) + assert_throws(new TypeError(), function() { ctx.transform(); }); + assert_throws(new TypeError(), function() { ctx.transform(1); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0, 1); }); + assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0, 1, 0); }); +} +if (ctx.setTransform) { + assert_throws(new TypeError(), function() { ctx.setTransform(); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0, 1); }); + assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0, 1, 0); }); +} +assert_throws(new TypeError(), function() { ctx.createLinearGradient(); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.createPattern(offscreenCanvas); }); +assert_throws(new TypeError(), function() { ctx.clearRect(); }); +assert_throws(new TypeError(), function() { ctx.clearRect(0); }); +assert_throws(new TypeError(), function() { ctx.clearRect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.clearRect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.fillRect(); }); +assert_throws(new TypeError(), function() { ctx.fillRect(0); }); +assert_throws(new TypeError(), function() { ctx.fillRect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.fillRect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(0); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.strokeRect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.moveTo(); }); +assert_throws(new TypeError(), function() { ctx.moveTo(0); }); +assert_throws(new TypeError(), function() { ctx.lineTo(); }); +assert_throws(new TypeError(), function() { ctx.lineTo(0); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(0); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(0, 0); }); +assert_throws(new TypeError(), function() { ctx.quadraticCurveTo(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.bezierCurveTo(0, 0, 0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0, 0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.arcTo(0, 0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.rect(); }); +assert_throws(new TypeError(), function() { ctx.rect(0); }); +assert_throws(new TypeError(), function() { ctx.rect(0, 0); }); +assert_throws(new TypeError(), function() { ctx.rect(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.arc(); }); +assert_throws(new TypeError(), function() { ctx.arc(0); }); +assert_throws(new TypeError(), function() { ctx.arc(0, 0); }); +assert_throws(new TypeError(), function() { ctx.arc(0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.arc(0, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.drawImage(); }); +assert_throws(new TypeError(), function() { ctx.drawImage(offscreenCanvas); }); +assert_throws(new TypeError(), function() { ctx.drawImage(offscreenCanvas, 0); }); +// TODO: n >= 3 args on drawImage could be either a valid overload, +// or too few for another overload, or too many for another +// overload - what should happen? +if (ctx.createImageData) { + assert_throws(new TypeError(), function() { ctx.createImageData(); }); + assert_throws(new TypeError(), function() { ctx.createImageData(1); }); +} +if (ctx.getImageData) { + assert_throws(new TypeError(), function() { ctx.getImageData(); }); + assert_throws(new TypeError(), function() { ctx.getImageData(0); }); + assert_throws(new TypeError(), function() { ctx.getImageData(0, 0); }); + assert_throws(new TypeError(), function() { ctx.getImageData(0, 0, 1); }); +} +if (ctx.putImageData) { + var imgdata = ctx.getImageData(0, 0, 1, 1); + assert_throws(new TypeError(), function() { ctx.putImageData(); }); + assert_throws(new TypeError(), function() { ctx.putImageData(imgdata); }); + assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 0); }); +} +var g = ctx.createLinearGradient(0, 0, 0, 0); +assert_throws(new TypeError(), function() { g.addColorStop(); }); +assert_throws(new TypeError(), function() { g.addColorStop(0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.voidreturn.html b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.voidreturn.html new file mode 100644 index 00000000000..42eb98ec1ec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.voidreturn.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.voidreturn</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.voidreturn</h1> +<p class="desc">void methods return undefined</p> + + +<script> +var t = async_test("void methods return undefined"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.save(), undefined, "ctx.save()", "undefined"); +_assertSame(ctx.restore(), undefined, "ctx.restore()", "undefined"); +_assertSame(ctx.scale(1, 1), undefined, "ctx.scale(1, 1)", "undefined"); +_assertSame(ctx.rotate(0), undefined, "ctx.rotate(0)", "undefined"); +_assertSame(ctx.translate(0, 0), undefined, "ctx.translate(0, 0)", "undefined"); +if (ctx.transform) { // (avoid spurious failures, since the aim here is not to test that all features are supported) + _assertSame(ctx.transform(1, 0, 0, 1, 0, 0), undefined, "ctx.transform(1, 0, 0, 1, 0, 0)", "undefined"); +} +if (ctx.setTransform) { + _assertSame(ctx.setTransform(1, 0, 0, 1, 0, 0), undefined, "ctx.setTransform(1, 0, 0, 1, 0, 0)", "undefined"); +} +_assertSame(ctx.clearRect(0, 0, 0, 0), undefined, "ctx.clearRect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.fillRect(0, 0, 0, 0), undefined, "ctx.fillRect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.strokeRect(0, 0, 0, 0), undefined, "ctx.strokeRect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.beginPath(), undefined, "ctx.beginPath()", "undefined"); +_assertSame(ctx.closePath(), undefined, "ctx.closePath()", "undefined"); +_assertSame(ctx.moveTo(0, 0), undefined, "ctx.moveTo(0, 0)", "undefined"); +_assertSame(ctx.lineTo(0, 0), undefined, "ctx.lineTo(0, 0)", "undefined"); +_assertSame(ctx.quadraticCurveTo(0, 0, 0, 0), undefined, "ctx.quadraticCurveTo(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.bezierCurveTo(0, 0, 0, 0, 0, 0), undefined, "ctx.bezierCurveTo(0, 0, 0, 0, 0, 0)", "undefined"); +_assertSame(ctx.arcTo(0, 0, 0, 0, 1), undefined, "ctx.arcTo(0, 0, 0, 0, 1)", "undefined"); +_assertSame(ctx.rect(0, 0, 0, 0), undefined, "ctx.rect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.arc(0, 0, 1, 0, 0, true), undefined, "ctx.arc(0, 0, 1, 0, 0, true)", "undefined"); +_assertSame(ctx.fill(), undefined, "ctx.fill()", "undefined"); +_assertSame(ctx.stroke(), undefined, "ctx.stroke()", "undefined"); +_assertSame(ctx.clip(), undefined, "ctx.clip()", "undefined"); +if (ctx.putImageData) { + _assertSame(ctx.putImageData(ctx.getImageData(0, 0, 1, 1), 0, 0), undefined, "ctx.putImageData(ctx.getImageData(0, 0, 1, 1), 0, 0)", "undefined"); +} +_assertSame(ctx.drawImage(offscreenCanvas, 0, 0, 1, 1, 0, 0, 0, 0), undefined, "ctx.drawImage(offscreenCanvas, 0, 0, 1, 1, 0, 0, 0, 0)", "undefined"); +_assertSame(ctx.createLinearGradient(0, 0, 0, 0).addColorStop(0, 'white'), undefined, "ctx.createLinearGradient(0, 0, 0, 0).addColorStop(0, 'white')", "undefined"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.voidreturn.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.voidreturn.worker.js new file mode 100644 index 00000000000..0d7da597275 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/conformance-requirements/2d.voidreturn.worker.js @@ -0,0 +1,50 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.voidreturn +// Description:void methods return undefined +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("void methods return undefined"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.save(), undefined, "ctx.save()", "undefined"); +_assertSame(ctx.restore(), undefined, "ctx.restore()", "undefined"); +_assertSame(ctx.scale(1, 1), undefined, "ctx.scale(1, 1)", "undefined"); +_assertSame(ctx.rotate(0), undefined, "ctx.rotate(0)", "undefined"); +_assertSame(ctx.translate(0, 0), undefined, "ctx.translate(0, 0)", "undefined"); +if (ctx.transform) { // (avoid spurious failures, since the aim here is not to test that all features are supported) + _assertSame(ctx.transform(1, 0, 0, 1, 0, 0), undefined, "ctx.transform(1, 0, 0, 1, 0, 0)", "undefined"); +} +if (ctx.setTransform) { + _assertSame(ctx.setTransform(1, 0, 0, 1, 0, 0), undefined, "ctx.setTransform(1, 0, 0, 1, 0, 0)", "undefined"); +} +_assertSame(ctx.clearRect(0, 0, 0, 0), undefined, "ctx.clearRect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.fillRect(0, 0, 0, 0), undefined, "ctx.fillRect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.strokeRect(0, 0, 0, 0), undefined, "ctx.strokeRect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.beginPath(), undefined, "ctx.beginPath()", "undefined"); +_assertSame(ctx.closePath(), undefined, "ctx.closePath()", "undefined"); +_assertSame(ctx.moveTo(0, 0), undefined, "ctx.moveTo(0, 0)", "undefined"); +_assertSame(ctx.lineTo(0, 0), undefined, "ctx.lineTo(0, 0)", "undefined"); +_assertSame(ctx.quadraticCurveTo(0, 0, 0, 0), undefined, "ctx.quadraticCurveTo(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.bezierCurveTo(0, 0, 0, 0, 0, 0), undefined, "ctx.bezierCurveTo(0, 0, 0, 0, 0, 0)", "undefined"); +_assertSame(ctx.arcTo(0, 0, 0, 0, 1), undefined, "ctx.arcTo(0, 0, 0, 0, 1)", "undefined"); +_assertSame(ctx.rect(0, 0, 0, 0), undefined, "ctx.rect(0, 0, 0, 0)", "undefined"); +_assertSame(ctx.arc(0, 0, 1, 0, 0, true), undefined, "ctx.arc(0, 0, 1, 0, 0, true)", "undefined"); +_assertSame(ctx.fill(), undefined, "ctx.fill()", "undefined"); +_assertSame(ctx.stroke(), undefined, "ctx.stroke()", "undefined"); +_assertSame(ctx.clip(), undefined, "ctx.clip()", "undefined"); +if (ctx.putImageData) { + _assertSame(ctx.putImageData(ctx.getImageData(0, 0, 1, 1), 0, 0), undefined, "ctx.putImageData(ctx.getImageData(0, 0, 1, 1), 0, 0)", "undefined"); +} +_assertSame(ctx.drawImage(offscreenCanvas, 0, 0, 1, 1, 0, 0, 0, 0), undefined, "ctx.drawImage(offscreenCanvas, 0, 0, 1, 1, 0, 0, 0, 0)", "undefined"); +_assertSame(ctx.createLinearGradient(0, 0, 0, 0).addColorStop(0, 'white'), undefined, "ctx.createLinearGradient(0, 0, 0, 0).addColorStop(0, 'white')", "undefined"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.html new file mode 100644 index 00000000000..da1dc8fcc2f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.3arg</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.3arg</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 0, 0); + ctx.drawImage(response1, -100, 0); + ctx.drawImage(response1, 100, 0); + ctx.drawImage(response1, 0, -50); + ctx.drawImage(response1, 0, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.worker.js new file mode 100644 index 00000000000..08cb353a50d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.3arg.worker.js @@ -0,0 +1,48 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.3arg +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 0, 0); + ctx.drawImage(response1, -100, 0); + ctx.drawImage(response1, 100, 0); + ctx.drawImage(response1, 0, -50); + ctx.drawImage(response1, 0, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.html new file mode 100644 index 00000000000..6d5fbfdefc1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.5arg</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.5arg</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 50, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.worker.js new file mode 100644 index 00000000000..17e01fad01e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.5arg.worker.js @@ -0,0 +1,49 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.5arg +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 50, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.html new file mode 100644 index 00000000000..530dc683a53 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.9arg.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.9arg.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.js new file mode 100644 index 00000000000..53046e22d00 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.9arg.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.html new file mode 100644 index 00000000000..e6c75125c76 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.9arg.destpos</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.9arg.destpos</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 0, 0, 100, 50, 0, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, -100, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 100, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, -50, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.worker.js new file mode 100644 index 00000000000..2a18a9355f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.worker.js @@ -0,0 +1,50 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.9arg.destpos +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 0, 0, 100, 50, 0, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, -100, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 100, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, -50, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, 50, 100, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.html new file mode 100644 index 00000000000..88b9634d099 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.9arg.destsize</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.9arg.destsize</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 1, 1, 1, 1, 0, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, -50, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 100, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, -25, 100, 25); + ctx.drawImage(response1, 0, 0, 100, 50, 0, 50, 100, 25); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.worker.js new file mode 100644 index 00000000000..a9f940725ca --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.worker.js @@ -0,0 +1,50 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.9arg.destsize +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 1, 1, 1, 1, 0, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, -50, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 100, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, -25, 100, 25); + ctx.drawImage(response1, 0, 0, 100, 50, 0, 50, 100, 25); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.html new file mode 100644 index 00000000000..9ea58b9093c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.9arg.sourcepos</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.9arg.sourcepos</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 140, 20, 100, 50, 0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.worker.js new file mode 100644 index 00000000000..0b1885d75d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.9arg.sourcepos +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 140, 20, 100, 50, 0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.html new file mode 100644 index 00000000000..12aad6ca592 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.9arg.sourcesize</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.9arg.sourcesize</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0, 256, 256, 0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 51, 26); + ctx.fillRect(49, 24, 51, 26); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 80,20, 0,255,0,255, "80,20", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 20,30, 0,255,0,255, "20,30", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 80,30, 0,255,0,255, "80,30", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.js new file mode 100644 index 00000000000..e1fa60dcb21 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.9arg.sourcesize +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0, 256, 256, 0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 51, 26); + ctx.fillRect(49, 24, 51, 26); + _assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 80,20, 0,255,0,255, "80,20", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 20,30, 0,255,0,255, "20,30", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 80,30, 0,255,0,255, "80,30", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.html new file mode 100644 index 00000000000..ab643dda692 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.alpha</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.worker.js new file mode 100644 index 00000000000..d71b3d50d56 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.alpha.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.alpha +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html new file mode 100644 index 00000000000..935c66fb50b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.animated.poster</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.animated.poster</h1> +<p class="desc">drawImage() of an APNG draws the poster frame</p> + + +<script> +var t = async_test("drawImage() of an APNG draws the poster frame"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/anim-poster-gr.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.js new file mode 100644 index 00000000000..d328d18d86f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.animated.poster +// Description:drawImage() of an APNG draws the poster frame +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of an APNG draws the poster frame"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/anim-poster-gr.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.html new file mode 100644 index 00000000000..05bf621c346 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.broken</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.broken</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/broken.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.worker.js new file mode 100644 index 00000000000..db968175a5e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.broken.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.broken +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/broken.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.html new file mode 100644 index 00000000000..32ff3fccbdc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.canvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.canvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.js new file mode 100644 index 00000000000..8af83f21765 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.canvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.html new file mode 100644 index 00000000000..a51c411adc4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.clip</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.rect(-10, -10, 1, 1); +ctx.clip(); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.worker.js new file mode 100644 index 00000000000..f0363c22e7a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.clip.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.clip +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.rect(-10, -10, 1, 1); +ctx.clip(); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.html new file mode 100644 index 00000000000..68d668417db --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.composite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.composite</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.worker.js new file mode 100644 index 00000000000..435c793e4e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.composite.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.composite +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-over'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.html new file mode 100644 index 00000000000..1d3b21b7dc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.floatsource</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.floatsource</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 10.1, 10.1, 0.1, 0.1, 0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.worker.js new file mode 100644 index 00000000000..3a90d33f783 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.floatsource.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.floatsource +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 10.1, 10.1, 0.1, 0.1, 0, 0, 100, 50); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.html new file mode 100644 index 00000000000..3b3a609b64f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.negativedest</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.negativedest</h1> +<p class="desc">Negative destination width/height represents the correct rectangle</p> + + +<script> +var t = async_test("Negative destination width/height represents the correct rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 100, 78, 50, 50, 0, 50, 50, -50); + ctx.drawImage(response, 100, 128, 50, -50, 100, 50, -50, -50); + _assertPixelApprox(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,1, 0,255,0,255, "51,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,48, 0,255,0,255, "51,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.worker.js new file mode 100644 index 00000000000..91cf4663b2f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedest.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.negativedest +// Description:Negative destination width/height represents the correct rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Negative destination width/height represents the correct rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 100, 78, 50, 50, 0, 50, 50, -50); + ctx.drawImage(response, 100, 128, 50, -50, 100, 50, -50, -50); + _assertPixelApprox(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,1, 0,255,0,255, "51,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,48, 0,255,0,255, "51,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.html new file mode 100644 index 00000000000..741aaea02a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.negativedir</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.negativedir</h1> +<p class="desc">Negative dimensions do not affect the direction of the image</p> + + +<script> +var t = async_test("Negative dimensions do not affect the direction of the image"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 178, 50, -100, 0, 0, 50, 100); + ctx.drawImage(response, 0, 78, 50, 100, 50, 100, 50, -100); + _assertPixelApprox(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,1, 0,255,0,255, "51,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,48, 0,255,0,255, "51,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.worker.js new file mode 100644 index 00000000000..9d4812bf169 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativedir.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.negativedir +// Description:Negative dimensions do not affect the direction of the image +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Negative dimensions do not affect the direction of the image"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 178, 50, -100, 0, 0, 50, 100); + ctx.drawImage(response, 0, 78, 50, 100, 50, 100, 50, -100); + _assertPixelApprox(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,1, 0,255,0,255, "51,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,48, 0,255,0,255, "51,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.html new file mode 100644 index 00000000000..0a99aa56741 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.negativesource</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.negativesource</h1> +<p class="desc">Negative source width/height represents the correct rectangle</p> + + +<script> +var t = async_test("Negative source width/height represents the correct rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 100, 78, -100, 50, 0, 0, 50, 50); + ctx.drawImage(response, 100, 128, -100, -50, 50, 0, 50, 50); + _assertPixelApprox(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,1, 0,255,0,255, "51,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,48, 0,255,0,255, "51,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.worker.js new file mode 100644 index 00000000000..fe0b0c17a75 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.negativesource.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.negativesource +// Description:Negative source width/height represents the correct rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Negative source width/height represents the correct rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 100, 78, -100, 50, 0, 0, 50, 50); + ctx.drawImage(response, 100, 128, -100, -50, 50, 0, 50, 50); + _assertPixelApprox(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,1, 0,255,0,255, "51,1", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 51,48, 0,255,0,255, "51,48", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.html new file mode 100644 index 00000000000..4780011bd30 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.html @@ -0,0 +1,338 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.nonfinite</h1> +<p class="desc">drawImage() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("drawImage() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, Infinity, 0); +ctx.drawImage(response, -Infinity, 0); +ctx.drawImage(response, NaN, 0); +ctx.drawImage(response, 0, Infinity); +ctx.drawImage(response, 0, -Infinity); +ctx.drawImage(response, 0, NaN); +ctx.drawImage(response, Infinity, Infinity); + ctx.drawImage(response, Infinity, 0, 100, 50); +ctx.drawImage(response, -Infinity, 0, 100, 50); +ctx.drawImage(response, NaN, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, -Infinity, 100, 50); +ctx.drawImage(response, 0, NaN, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, -Infinity, 50); +ctx.drawImage(response, 0, 0, NaN, 50); +ctx.drawImage(response, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, -Infinity); +ctx.drawImage(response, 0, 0, 100, NaN); +ctx.drawImage(response, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity); + ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, -Infinity, 0, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, NaN, 0, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, -Infinity, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, NaN, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, -Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, NaN, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, -Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, NaN, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, -Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, NaN, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, -Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, NaN, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, -Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, NaN, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, -Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, NaN); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, Infinity, Infinity); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.worker.js new file mode 100644 index 00000000000..4ebc7616525 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nonfinite.worker.js @@ -0,0 +1,334 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.nonfinite +// Description:drawImage() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, Infinity, 0); +ctx.drawImage(response, -Infinity, 0); +ctx.drawImage(response, NaN, 0); +ctx.drawImage(response, 0, Infinity); +ctx.drawImage(response, 0, -Infinity); +ctx.drawImage(response, 0, NaN); +ctx.drawImage(response, Infinity, Infinity); + ctx.drawImage(response, Infinity, 0, 100, 50); +ctx.drawImage(response, -Infinity, 0, 100, 50); +ctx.drawImage(response, NaN, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, -Infinity, 100, 50); +ctx.drawImage(response, 0, NaN, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, -Infinity, 50); +ctx.drawImage(response, 0, 0, NaN, 50); +ctx.drawImage(response, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, -Infinity); +ctx.drawImage(response, 0, 0, 100, NaN); +ctx.drawImage(response, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity); + ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, -Infinity, 0, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, NaN, 0, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, -Infinity, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, NaN, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, -Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, NaN, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, -Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, NaN, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, -Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, NaN, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, -Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, NaN, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, -Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, NaN, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, -Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, NaN); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, Infinity, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, Infinity, 0, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, Infinity, 100, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, Infinity, 50, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, Infinity, 0, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, 100, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, Infinity, 0, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, Infinity, 50); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, Infinity, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, Infinity, 100, Infinity); +ctx.drawImage(response, 0, 0, 100, 50, 0, 0, Infinity, Infinity); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.html new file mode 100644 index 00000000000..b66efebf756 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.nowrap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.nowrap</h1> +<p class="desc">Stretched images do not get pixels wrapping around the edges</p> + + +<script> +var t = async_test("Stretched images do not get pixels wrapping around the edges"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, -1950, 0, 2000, 50); + _assertPixelApprox(offscreenCanvas, 45,25, 0,255,0,255, "45,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 55,25, 0,255,0,255, "55,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.worker.js new file mode 100644 index 00000000000..b014974b64b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.nowrap.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.nowrap +// Description:Stretched images do not get pixels wrapping around the edges +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Stretched images do not get pixels wrapping around the edges"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, -1950, 0, 2000, 50); + _assertPixelApprox(offscreenCanvas, 45,25, 0,255,0,255, "45,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 55,25, 0,255,0,255, "55,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.html new file mode 100644 index 00000000000..77452b9c776 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.null</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.null</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.drawImage(null, 0, 0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.worker.js new file mode 100644 index 00000000000..e886a334cc1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.null +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.drawImage(null, 0, 0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.html new file mode 100644 index 00000000000..b4eca14a997 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.path</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.rect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + ctx.fill(); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.worker.js new file mode 100644 index 00000000000..7e4a240cee6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.path +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.rect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + ctx.fill(); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.html new file mode 100644 index 00000000000..6828b7c095d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.self.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.self.1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.drawImage(offscreenCanvas, 50, 0); +_assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.worker.js new file mode 100644 index 00000000000..ddd7e18ff22 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.1.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.self.1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.drawImage(offscreenCanvas, 50, 0); +_assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.html new file mode 100644 index 00000000000..690202d3316 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.self.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.self.2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 1, 100, 49); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 1); +ctx.drawImage(offscreenCanvas, 0, 1); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 2); +_assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.worker.js new file mode 100644 index 00000000000..b3c005e2e75 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.self.2.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.self.2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 1, 100, 49); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 1); +ctx.drawImage(offscreenCanvas, 0, 1); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 2); +_assertPixelApprox(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.html new file mode 100644 index 00000000000..2e3cdc030ff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.svg</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.svg</h1> +<p class="desc">drawImage() of an SVG image</p> + + +<script> +var t = async_test("drawImage() of an SVG image"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.svg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.worker.js new file mode 100644 index 00000000000..6860a85256c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.svg.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.svg +// Description:drawImage() of an SVG image +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage() of an SVG image"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.svg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.html new file mode 100644 index 00000000000..0817e81851a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.transform</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.transform</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 0); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.worker.js new file mode 100644 index 00000000000..41b0d4ce5dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.transform +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 0); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html new file mode 100644 index 00000000000..f9b7f3a1fb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.wrongtype</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.wrongtype</h1> +<p class="desc">Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError</p> + + +<script> +var t = async_test("Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.drawImage(undefined, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.drawImage(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.drawImage("", 0, 0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.js new file mode 100644 index 00000000000..c4f4668857a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.wrongtype +// Description:Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.drawImage(undefined, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.drawImage(0, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.drawImage("", 0, 0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html new file mode 100644 index 00000000000..57210ef2512 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.zerocanvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.zerocanvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(0, 10); +ctx.drawImage(offscreenCanvas2, 0, 0); +offscreenCanvas2.width = 10; +offscreenCanvas2.height = 0; +ctx.drawImage(offscreenCanvas2, 0, 0); +offscreenCanvas2.width = 0; +offscreenCanvas2.height = 0; +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js new file mode 100644 index 00000000000..45dfff628bc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.zerocanvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(0, 10); +ctx.drawImage(offscreenCanvas2, 0, 0); +offscreenCanvas2.width = 10; +offscreenCanvas2.height = 0; +ctx.drawImage(offscreenCanvas2, 0, 0); +offscreenCanvas2.width = 0; +offscreenCanvas2.height = 0; +ctx.drawImage(offscreenCanvas2, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.html new file mode 100644 index 00000000000..a7670cd9f2e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.zerosource</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.zerosource</h1> +<p class="desc">drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR</p> + + +<script> +var t = async_test("drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 10, 10, 0, 1, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 10, 10, 1, 0, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 10, 10, 0, 0, 0, 0, 100, 50); }); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html new file mode 100644 index 00000000000..c1f2b324d5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.drawImage.zerosource.image</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.drawImage.zerosource.image</h1> +<p class="desc">drawImage with zero-sized source rectangle from image throws INDEX_SIZE_ERR</p> + + +<script> +var t = async_test("drawImage with zero-sized source rectangle from image throws INDEX_SIZE_ERR"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-zerowidth.svg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 0, 0, 100, 50); }); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.worker.js new file mode 100644 index 00000000000..3cc3c72119e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.zerosource.image +// Description:drawImage with zero-sized source rectangle from image throws INDEX_SIZE_ERR +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage with zero-sized source rectangle from image throws INDEX_SIZE_ERR"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-zerowidth.svg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 0, 0, 100, 50); }); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.worker.js new file mode 100644 index 00000000000..0f0ed5d9dd1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.drawImage.zerosource +// Description:drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 10, 10, 0, 1, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 10, 10, 1, 0, 0, 0, 100, 50); }); + assert_throws("INDEX_SIZE_ERR", function() { ctx.drawImage(response, 10, 10, 0, 0, 0, 0, 100, 50); }); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.html new file mode 100644 index 00000000000..e5141d69aeb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.basic</h1> +<p class="desc">clearRect clears to transparent black</p> + + +<script> +var t = async_test("clearRect clears to transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.worker.js new file mode 100644 index 00000000000..eb0ae4efe0c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.basic.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.basic +// Description:clearRect clears to transparent black +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect clears to transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html new file mode 100644 index 00000000000..25af32dca14 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.clip</h1> +<p class="desc">clearRect is affected by clipping regions</p> + + +<script> +var t = async_test("clearRect is affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 16, 16); +ctx.clip(); +ctx.clearRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 16, 16); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.worker.js new file mode 100644 index 00000000000..ce58871ecfc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.clip.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.clip +// Description:clearRect is affected by clipping regions +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect is affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 16, 16); +ctx.clip(); +ctx.clearRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 16, 16); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.html new file mode 100644 index 00000000000..19ddabfc932 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.globalalpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.globalalpha</h1> +<p class="desc">clearRect is not affected by globalAlpha</p> + + +<script> +var t = async_test("clearRect is not affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.1; +ctx.clearRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.worker.js new file mode 100644 index 00000000000..a29ce44d828 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.globalalpha +// Description:clearRect is not affected by globalAlpha +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect is not affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalAlpha = 0.1; +ctx.clearRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.html new file mode 100644 index 00000000000..63a9ac352ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.globalcomposite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.globalcomposite</h1> +<p class="desc">clearRect is not affected by globalCompositeOperation</p> + + +<script> +var t = async_test("clearRect is not affected by globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.clearRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.worker.js new file mode 100644 index 00000000000..4873b0a3598 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.globalcomposite +// Description:clearRect is not affected by globalCompositeOperation +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect is not affected by globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-atop'; +ctx.clearRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.html new file mode 100644 index 00000000000..064f8054421 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.negative</h1> +<p class="desc">clearRect of negative sizes works</p> + + +<script> +var t = async_test("clearRect of negative sizes works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(0, 0, 50, 25); +ctx.clearRect(100, 0, -50, 25); +ctx.clearRect(0, 50, 50, -25); +ctx.clearRect(100, 50, -50, -25); +_assertPixel(offscreenCanvas, 25,12, 0,0,0,0, "25,12", "0,0,0,0"); +_assertPixel(offscreenCanvas, 75,12, 0,0,0,0, "75,12", "0,0,0,0"); +_assertPixel(offscreenCanvas, 25,37, 0,0,0,0, "25,37", "0,0,0,0"); +_assertPixel(offscreenCanvas, 75,37, 0,0,0,0, "75,37", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.worker.js new file mode 100644 index 00000000000..8dc1cf24f12 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.negative.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.negative +// Description:clearRect of negative sizes works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect of negative sizes works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(0, 0, 50, 25); +ctx.clearRect(100, 0, -50, 25); +ctx.clearRect(0, 50, 50, -25); +ctx.clearRect(100, 50, -50, -25); +_assertPixel(offscreenCanvas, 25,12, 0,0,0,0, "25,12", "0,0,0,0"); +_assertPixel(offscreenCanvas, 75,12, 0,0,0,0, "75,12", "0,0,0,0"); +_assertPixel(offscreenCanvas, 25,37, 0,0,0,0, "25,37", "0,0,0,0"); +_assertPixel(offscreenCanvas, 75,37, 0,0,0,0, "75,37", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.html new file mode 100644 index 00000000000..8e3b241a5ba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.nonfinite</h1> +<p class="desc">clearRect() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("clearRect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(Infinity, 0, 100, 50); +ctx.clearRect(-Infinity, 0, 100, 50); +ctx.clearRect(NaN, 0, 100, 50); +ctx.clearRect(0, Infinity, 100, 50); +ctx.clearRect(0, -Infinity, 100, 50); +ctx.clearRect(0, NaN, 100, 50); +ctx.clearRect(0, 0, Infinity, 50); +ctx.clearRect(0, 0, -Infinity, 50); +ctx.clearRect(0, 0, NaN, 50); +ctx.clearRect(0, 0, 100, Infinity); +ctx.clearRect(0, 0, 100, -Infinity); +ctx.clearRect(0, 0, 100, NaN); +ctx.clearRect(Infinity, Infinity, 100, 50); +ctx.clearRect(Infinity, Infinity, Infinity, 50); +ctx.clearRect(Infinity, Infinity, Infinity, Infinity); +ctx.clearRect(Infinity, Infinity, 100, Infinity); +ctx.clearRect(Infinity, 0, Infinity, 50); +ctx.clearRect(Infinity, 0, Infinity, Infinity); +ctx.clearRect(Infinity, 0, 100, Infinity); +ctx.clearRect(0, Infinity, Infinity, 50); +ctx.clearRect(0, Infinity, Infinity, Infinity); +ctx.clearRect(0, Infinity, 100, Infinity); +ctx.clearRect(0, 0, Infinity, Infinity); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.worker.js new file mode 100644 index 00000000000..bd512336e00 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.worker.js @@ -0,0 +1,45 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.nonfinite +// Description:clearRect() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(Infinity, 0, 100, 50); +ctx.clearRect(-Infinity, 0, 100, 50); +ctx.clearRect(NaN, 0, 100, 50); +ctx.clearRect(0, Infinity, 100, 50); +ctx.clearRect(0, -Infinity, 100, 50); +ctx.clearRect(0, NaN, 100, 50); +ctx.clearRect(0, 0, Infinity, 50); +ctx.clearRect(0, 0, -Infinity, 50); +ctx.clearRect(0, 0, NaN, 50); +ctx.clearRect(0, 0, 100, Infinity); +ctx.clearRect(0, 0, 100, -Infinity); +ctx.clearRect(0, 0, 100, NaN); +ctx.clearRect(Infinity, Infinity, 100, 50); +ctx.clearRect(Infinity, Infinity, Infinity, 50); +ctx.clearRect(Infinity, Infinity, Infinity, Infinity); +ctx.clearRect(Infinity, Infinity, 100, Infinity); +ctx.clearRect(Infinity, 0, Infinity, 50); +ctx.clearRect(Infinity, 0, Infinity, Infinity); +ctx.clearRect(Infinity, 0, 100, Infinity); +ctx.clearRect(0, Infinity, Infinity, 50); +ctx.clearRect(0, Infinity, Infinity, Infinity); +ctx.clearRect(0, Infinity, 100, Infinity); +ctx.clearRect(0, 0, Infinity, Infinity); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.html new file mode 100644 index 00000000000..00d2286fb56 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.path</h1> +<p class="desc">clearRect does not affect the current path</p> + + +<script> +var t = async_test("clearRect does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.clearRect(0, 0, 16, 16); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.worker.js new file mode 100644 index 00000000000..385672d9f29 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.path.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.path +// Description:clearRect does not affect the current path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.clearRect(0, 0, 16, 16); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.html new file mode 100644 index 00000000000..54cbbfb201f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.shadow</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.shadow</h1> +<p class="desc">clearRect does not draw shadows</p> + + +<script> +var t = async_test("clearRect does not draw shadows"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 0; +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 50; +ctx.clearRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.worker.js new file mode 100644 index 00000000000..86bd149a3f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.shadow +// Description:clearRect does not draw shadows +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect does not draw shadows"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 0; +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 50; +ctx.clearRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.html new file mode 100644 index 00000000000..14278ab1a59 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.transform</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.transform</h1> +<p class="desc">clearRect is affected by transforms</p> + + +<script> +var t = async_test("clearRect is affected by transforms"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(10, 10); +ctx.translate(0, 5); +ctx.clearRect(0, -5, 10, 5); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.worker.js new file mode 100644 index 00000000000..e5ea33355a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.transform.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.transform +// Description:clearRect is affected by transforms +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect is affected by transforms"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(10, 10); +ctx.translate(0, 5); +ctx.clearRect(0, -5, 10, 5); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.html new file mode 100644 index 00000000000..d1f95530eb8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.clearRect.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.clearRect.zero</h1> +<p class="desc">clearRect of zero pixels has no effect</p> + + +<script> +var t = async_test("clearRect of zero pixels has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(0, 0, 100, 0); +ctx.clearRect(0, 0, 0, 50); +ctx.clearRect(0, 0, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.worker.js new file mode 100644 index 00000000000..00850c6b0f2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.clearRect.zero.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.clearRect.zero +// Description:clearRect of zero pixels has no effect +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("clearRect of zero pixels has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.clearRect(0, 0, 100, 0); +ctx.clearRect(0, 0, 0, 50); +ctx.clearRect(0, 0, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.html new file mode 100644 index 00000000000..2f6e6d1a9fe --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.basic</h1> +<p class="desc">fillRect works</p> + + +<script> +var t = async_test("fillRect works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.worker.js new file mode 100644 index 00000000000..805561044ff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.basic.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.basic +// Description:fillRect works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html new file mode 100644 index 00000000000..ddc625dfbe6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.clip</h1> +<p class="desc">fillRect is affected by clipping regions</p> + + +<script> +var t = async_test("fillRect is affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 16, 16); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 16, 16); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.worker.js new file mode 100644 index 00000000000..740a9de5e20 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.clip.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.clip +// Description:fillRect is affected by clipping regions +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect is affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 16, 16); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 16, 16); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.html new file mode 100644 index 00000000000..ba525ce239c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.negative</h1> +<p class="desc">fillRect of negative sizes works</p> + + +<script> +var t = async_test("fillRect of negative sizes works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 25); +ctx.fillRect(100, 0, -50, 25); +ctx.fillRect(0, 50, 50, -25); +ctx.fillRect(100, 50, -50, -25); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.worker.js new file mode 100644 index 00000000000..df644d5fb38 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.negative.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.negative +// Description:fillRect of negative sizes works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect of negative sizes works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 25); +ctx.fillRect(100, 0, -50, 25); +ctx.fillRect(0, 50, 50, -25); +ctx.fillRect(100, 50, -50, -25); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.html new file mode 100644 index 00000000000..7bedee63276 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.nonfinite</h1> +<p class="desc">fillRect() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("fillRect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(Infinity, 0, 100, 50); +ctx.fillRect(-Infinity, 0, 100, 50); +ctx.fillRect(NaN, 0, 100, 50); +ctx.fillRect(0, Infinity, 100, 50); +ctx.fillRect(0, -Infinity, 100, 50); +ctx.fillRect(0, NaN, 100, 50); +ctx.fillRect(0, 0, Infinity, 50); +ctx.fillRect(0, 0, -Infinity, 50); +ctx.fillRect(0, 0, NaN, 50); +ctx.fillRect(0, 0, 100, Infinity); +ctx.fillRect(0, 0, 100, -Infinity); +ctx.fillRect(0, 0, 100, NaN); +ctx.fillRect(Infinity, Infinity, 100, 50); +ctx.fillRect(Infinity, Infinity, Infinity, 50); +ctx.fillRect(Infinity, Infinity, Infinity, Infinity); +ctx.fillRect(Infinity, Infinity, 100, Infinity); +ctx.fillRect(Infinity, 0, Infinity, 50); +ctx.fillRect(Infinity, 0, Infinity, Infinity); +ctx.fillRect(Infinity, 0, 100, Infinity); +ctx.fillRect(0, Infinity, Infinity, 50); +ctx.fillRect(0, Infinity, Infinity, Infinity); +ctx.fillRect(0, Infinity, 100, Infinity); +ctx.fillRect(0, 0, Infinity, Infinity); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.worker.js new file mode 100644 index 00000000000..79455b29f61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.worker.js @@ -0,0 +1,46 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.nonfinite +// Description:fillRect() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(Infinity, 0, 100, 50); +ctx.fillRect(-Infinity, 0, 100, 50); +ctx.fillRect(NaN, 0, 100, 50); +ctx.fillRect(0, Infinity, 100, 50); +ctx.fillRect(0, -Infinity, 100, 50); +ctx.fillRect(0, NaN, 100, 50); +ctx.fillRect(0, 0, Infinity, 50); +ctx.fillRect(0, 0, -Infinity, 50); +ctx.fillRect(0, 0, NaN, 50); +ctx.fillRect(0, 0, 100, Infinity); +ctx.fillRect(0, 0, 100, -Infinity); +ctx.fillRect(0, 0, 100, NaN); +ctx.fillRect(Infinity, Infinity, 100, 50); +ctx.fillRect(Infinity, Infinity, Infinity, 50); +ctx.fillRect(Infinity, Infinity, Infinity, Infinity); +ctx.fillRect(Infinity, Infinity, 100, Infinity); +ctx.fillRect(Infinity, 0, Infinity, 50); +ctx.fillRect(Infinity, 0, Infinity, Infinity); +ctx.fillRect(Infinity, 0, 100, Infinity); +ctx.fillRect(0, Infinity, Infinity, 50); +ctx.fillRect(0, Infinity, Infinity, Infinity); +ctx.fillRect(0, Infinity, 100, Infinity); +ctx.fillRect(0, 0, Infinity, Infinity); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.html new file mode 100644 index 00000000000..ff6530e9885 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.path</h1> +<p class="desc">fillRect does not affect the current path</p> + + +<script> +var t = async_test("fillRect does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 16, 16); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.worker.js new file mode 100644 index 00000000000..7433620ed61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.path.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.path +// Description:fillRect does not affect the current path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 16, 16); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.html new file mode 100644 index 00000000000..1399bbbfb62 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.shadow</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.shadow</h1> +<p class="desc">fillRect draws shadows</p> + + +<script> +var t = async_test("fillRect draws shadows"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowBlur = 0; +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.worker.js new file mode 100644 index 00000000000..7f056f50d3c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.shadow +// Description:fillRect draws shadows +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect draws shadows"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowBlur = 0; +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.html new file mode 100644 index 00000000000..21b780a5529 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.transform</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.transform</h1> +<p class="desc">fillRect is affected by transforms</p> + + +<script> +var t = async_test("fillRect is affected by transforms"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.scale(10, 10); +ctx.translate(0, 5); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, -5, 10, 5); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.worker.js new file mode 100644 index 00000000000..d0bfaa9a4ba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.transform.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.transform +// Description:fillRect is affected by transforms +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect is affected by transforms"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.scale(10, 10); +ctx.translate(0, 5); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, -5, 10, 5); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.html new file mode 100644 index 00000000000..b1309ee1f7c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillRect.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillRect.zero</h1> +<p class="desc">fillRect of zero pixels has no effect</p> + + +<script> +var t = async_test("fillRect of zero pixels has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 0); +ctx.fillRect(0, 0, 0, 50); +ctx.fillRect(0, 0, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.worker.js new file mode 100644 index 00000000000..afe3832cc1c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.fillRect.zero.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillRect.zero +// Description:fillRect of zero pixels has no effect +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect of zero pixels has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 0); +ctx.fillRect(0, 0, 0, 50); +ctx.fillRect(0, 0, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.html new file mode 100644 index 00000000000..329e298974c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.basic</h1> +<p class="desc">strokeRect works</p> + + +<script> +var t = async_test("strokeRect works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.strokeRect(25, 24, 50, 2); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.worker.js new file mode 100644 index 00000000000..13fd2ae9b0a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.basic +// Description:strokeRect works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.strokeRect(25, 24, 50, 2); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html new file mode 100644 index 00000000000..1f1c947d3e9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.clip</h1> +<p class="desc">strokeRect is affected by clipping regions</p> + + +<script> +var t = async_test("strokeRect is affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 16, 16); +ctx.clip(); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 16, 16); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.worker.js new file mode 100644 index 00000000000..dfb6705c06a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.clip +// Description:strokeRect is affected by clipping regions +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect is affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 16, 16); +ctx.clip(); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 16, 16); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.html new file mode 100644 index 00000000000..35e4e0667e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.globalalpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.globalalpha</h1> +<p class="desc">strokeRect is affected by globalAlpha</p> + + +<script> +var t = async_test("strokeRect is affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalAlpha = 0; +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(25, 24, 50, 2); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.worker.js new file mode 100644 index 00000000000..f24120034f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.globalalpha +// Description:strokeRect is affected by globalAlpha +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect is affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalAlpha = 0; +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(25, 24, 50, 2); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.html new file mode 100644 index 00000000000..44b8966e428 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.globalcomposite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.globalcomposite</h1> +<p class="desc">strokeRect is not affected by globalCompositeOperation</p> + + +<script> +var t = async_test("strokeRect is not affected by globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'source-in'; +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(25, 24, 50, 2); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.worker.js new file mode 100644 index 00000000000..93be63c3ebb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.globalcomposite +// Description:strokeRect is not affected by globalCompositeOperation +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect is not affected by globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'source-in'; +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(25, 24, 50, 2); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.html new file mode 100644 index 00000000000..be5f9aa3c75 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.negative</h1> +<p class="desc">strokeRect of negative sizes works</p> + + +<script> +var t = async_test("strokeRect of negative sizes works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 25; +ctx.strokeRect(12, 12, 26, 1); +ctx.strokeRect(88, 12, -26, 1); +ctx.strokeRect(12, 38, 26, -1); +ctx.strokeRect(88, 38, -26, -1); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.worker.js new file mode 100644 index 00000000000..9c83950a9fc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.negative +// Description:strokeRect of negative sizes works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect of negative sizes works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 25; +ctx.strokeRect(12, 12, 26, 1); +ctx.strokeRect(88, 12, -26, 1); +ctx.strokeRect(12, 38, 26, -1); +ctx.strokeRect(88, 38, -26, -1); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.html new file mode 100644 index 00000000000..9198365876c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.nonfinite</h1> +<p class="desc">strokeRect() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("strokeRect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 150; +ctx.strokeRect(Infinity, 0, 100, 50); +ctx.strokeRect(-Infinity, 0, 100, 50); +ctx.strokeRect(NaN, 0, 100, 50); +ctx.strokeRect(0, Infinity, 100, 50); +ctx.strokeRect(0, -Infinity, 100, 50); +ctx.strokeRect(0, NaN, 100, 50); +ctx.strokeRect(0, 0, Infinity, 50); +ctx.strokeRect(0, 0, -Infinity, 50); +ctx.strokeRect(0, 0, NaN, 50); +ctx.strokeRect(0, 0, 100, Infinity); +ctx.strokeRect(0, 0, 100, -Infinity); +ctx.strokeRect(0, 0, 100, NaN); +ctx.strokeRect(Infinity, Infinity, 100, 50); +ctx.strokeRect(Infinity, Infinity, Infinity, 50); +ctx.strokeRect(Infinity, Infinity, Infinity, Infinity); +ctx.strokeRect(Infinity, Infinity, 100, Infinity); +ctx.strokeRect(Infinity, 0, Infinity, 50); +ctx.strokeRect(Infinity, 0, Infinity, Infinity); +ctx.strokeRect(Infinity, 0, 100, Infinity); +ctx.strokeRect(0, Infinity, Infinity, 50); +ctx.strokeRect(0, Infinity, Infinity, Infinity); +ctx.strokeRect(0, Infinity, 100, Infinity); +ctx.strokeRect(0, 0, Infinity, Infinity); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.worker.js new file mode 100644 index 00000000000..7fb16811a0a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.worker.js @@ -0,0 +1,47 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.nonfinite +// Description:strokeRect() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 150; +ctx.strokeRect(Infinity, 0, 100, 50); +ctx.strokeRect(-Infinity, 0, 100, 50); +ctx.strokeRect(NaN, 0, 100, 50); +ctx.strokeRect(0, Infinity, 100, 50); +ctx.strokeRect(0, -Infinity, 100, 50); +ctx.strokeRect(0, NaN, 100, 50); +ctx.strokeRect(0, 0, Infinity, 50); +ctx.strokeRect(0, 0, -Infinity, 50); +ctx.strokeRect(0, 0, NaN, 50); +ctx.strokeRect(0, 0, 100, Infinity); +ctx.strokeRect(0, 0, 100, -Infinity); +ctx.strokeRect(0, 0, 100, NaN); +ctx.strokeRect(Infinity, Infinity, 100, 50); +ctx.strokeRect(Infinity, Infinity, Infinity, 50); +ctx.strokeRect(Infinity, Infinity, Infinity, Infinity); +ctx.strokeRect(Infinity, Infinity, 100, Infinity); +ctx.strokeRect(Infinity, 0, Infinity, 50); +ctx.strokeRect(Infinity, 0, Infinity, Infinity); +ctx.strokeRect(Infinity, 0, 100, Infinity); +ctx.strokeRect(0, Infinity, Infinity, 50); +ctx.strokeRect(0, Infinity, Infinity, Infinity); +ctx.strokeRect(0, Infinity, 100, Infinity); +ctx.strokeRect(0, 0, Infinity, Infinity); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.html new file mode 100644 index 00000000000..dc49cbfbe69 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.path</h1> +<p class="desc">strokeRect does not affect the current path</p> + + +<script> +var t = async_test("strokeRect does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 5; +ctx.strokeRect(0, 0, 16, 16); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.worker.js new file mode 100644 index 00000000000..b5908b1674f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.path.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.path +// Description:strokeRect does not affect the current path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 5; +ctx.strokeRect(0, 0, 16, 16); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.html new file mode 100644 index 00000000000..a042d943589 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.shadow</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.shadow</h1> +<p class="desc">strokeRect draws shadows</p> + + +<script> +var t = async_test("strokeRect draws shadows"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowBlur = 0; +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 50; +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(0, -75, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.worker.js new file mode 100644 index 00000000000..781e0b969c9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.shadow +// Description:strokeRect draws shadows +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect draws shadows"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowBlur = 0; +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 50; +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.strokeRect(0, -75, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.html new file mode 100644 index 00000000000..ba859b8d83e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.transform</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.transform</h1> +<p class="desc">fillRect is affected by transforms</p> + + +<script> +var t = async_test("fillRect is affected by transforms"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.scale(10, 10); +ctx.translate(0, 5); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 5; +ctx.strokeRect(2.5, -2.6, 5, 0.2); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.worker.js new file mode 100644 index 00000000000..85bc6e8b23c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.transform +// Description:fillRect is affected by transforms +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("fillRect is affected by transforms"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.scale(10, 10); +ctx.translate(0, 5); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 5; +ctx.strokeRect(2.5, -2.6, 5, 0.2); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.html new file mode 100644 index 00000000000..973b9d1af14 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.zero.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.zero.1</h1> +<p class="desc">strokeRect of 0x0 pixels draws nothing</p> + + +<script> +var t = async_test("strokeRect of 0x0 pixels draws nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 250; +ctx.strokeRect(50, 25, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.worker.js new file mode 100644 index 00000000000..5d1f4664afc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.zero.1 +// Description:strokeRect of 0x0 pixels draws nothing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect of 0x0 pixels draws nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 250; +ctx.strokeRect(50, 25, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.html new file mode 100644 index 00000000000..161e240839f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.zero.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.zero.2</h1> +<p class="desc">strokeRect of 0x0 pixels draws nothing, including caps and joins</p> + + +<script> +var t = async_test("strokeRect of 0x0 pixels draws nothing, including caps and joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 250; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.strokeRect(50, 25, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.worker.js new file mode 100644 index 00000000000..bd7f8520836 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.zero.2 +// Description:strokeRect of 0x0 pixels draws nothing, including caps and joins +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect of 0x0 pixels draws nothing, including caps and joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 250; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.strokeRect(50, 25, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.html new file mode 100644 index 00000000000..7566ba8482a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.zero.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.zero.3</h1> +<p class="desc">strokeRect of Nx0 pixels draws a straight line</p> + + +<script> +var t = async_test("strokeRect of Nx0 pixels draws a straight line"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.strokeRect(0, 25, 100, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.worker.js new file mode 100644 index 00000000000..0b73deb276a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.zero.3 +// Description:strokeRect of Nx0 pixels draws a straight line +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect of Nx0 pixels draws a straight line"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.strokeRect(0, 25, 100, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.html new file mode 100644 index 00000000000..e40d78d06df --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.zero.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.zero.4</h1> +<p class="desc">strokeRect of Nx0 pixels draws a closed line with no caps</p> + + +<script> +var t = async_test("strokeRect of Nx0 pixels draws a closed line with no caps"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 250; +ctx.lineCap = 'round'; +ctx.strokeRect(100, 25, 100, 0); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.worker.js new file mode 100644 index 00000000000..e7de7a5dd18 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.zero.4 +// Description:strokeRect of Nx0 pixels draws a closed line with no caps +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect of Nx0 pixels draws a closed line with no caps"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 250; +ctx.lineCap = 'round'; +ctx.strokeRect(100, 25, 100, 0); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.html b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.html new file mode 100644 index 00000000000..c23f675e825 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeRect.zero.5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeRect.zero.5</h1> +<p class="desc">strokeRect of Nx0 pixels draws a closed line with joins</p> + + +<script> +var t = async_test("strokeRect of Nx0 pixels draws a closed line with joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 250; +ctx.lineJoin = 'round'; +ctx.strokeRect(100, 25, 100, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.worker.js new file mode 100644 index 00000000000..cb8224ed848 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeRect.zero.5 +// Description:strokeRect of Nx0 pixels draws a closed line with joins +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("strokeRect of Nx0 pixels draws a closed line with joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 250; +ctx.lineJoin = 'round'; +ctx.strokeRect(100, 25, 100, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.html new file mode 100644 index 00000000000..0e011add2d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.default</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.default</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.fillStyle, '#000000', "ctx.fillStyle", "'#000000'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.worker.js new file mode 100644 index 00000000000..bd5af5228c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.default.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.default +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.fillStyle, '#000000', "ctx.fillStyle", "'#000000'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.html new file mode 100644 index 00000000000..d21282a5900 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.get.semitransparent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.get.semitransparent</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(255,255,255,0.45)'; +assert_regexp_match(ctx.fillStyle, /^rgba\(255, 255, 255, 0\.4\d+\)$/); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.worker.js new file mode 100644 index 00000000000..6d544f17e22 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.get.semitransparent +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(255,255,255,0.45)'; +assert_regexp_match(ctx.fillStyle, /^rgba\(255, 255, 255, 0\.4\d+\)$/); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.html new file mode 100644 index 00000000000..5da5b976751 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.get.solid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.get.solid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#fa0'; +_assertSame(ctx.fillStyle, '#ffaa00', "ctx.fillStyle", "'#ffaa00'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.worker.js new file mode 100644 index 00000000000..aeea44abd1c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.solid.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.get.solid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#fa0'; +_assertSame(ctx.fillStyle, '#ffaa00', "ctx.fillStyle", "'#ffaa00'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.html new file mode 100644 index 00000000000..a390abbb873 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.get.transparent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.get.transparent</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(0,0,0,0)'; +_assertSame(ctx.fillStyle, 'rgba(0, 0, 0, 0)', "ctx.fillStyle", "'rgba(0, 0, 0, 0)'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.worker.js new file mode 100644 index 00000000000..3df91dd1a1c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.get.transparent.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.get.transparent +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(0,0,0,0)'; +_assertSame(ctx.fillStyle, 'rgba(0, 0, 0, 0)', "ctx.fillStyle", "'rgba(0, 0, 0, 0)'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.html new file mode 100644 index 00000000000..8d23262029c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.invalidstring</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.invalidstring</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillStyle = 'invalid'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.worker.js new file mode 100644 index 00000000000..50189bdf68f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidstring.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.invalidstring +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillStyle = 'invalid'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.html new file mode 100644 index 00000000000..3d1043d28d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.invalidtype</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.invalidtype</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillStyle = null; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.worker.js new file mode 100644 index 00000000000..422ae3e89b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.invalidtype.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.invalidtype +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillStyle = null; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html new file mode 100644 index 00000000000..f795694bde9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.worker.js new file mode 100644 index 00000000000..c147905d5f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html new file mode 100644 index 00000000000..a2c2c70d625 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0% / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.worker.js new file mode 100644 index 00000000000..d7a37d2c037 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0% / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html new file mode 100644 index 00000000000..a0bf4f37d0c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.worker.js new file mode 100644 index 00000000000..1709f493da6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html new file mode 100644 index 00000000000..a28f68948d9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.worker.js new file mode 100644 index 00000000000..2935c51f291 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html new file mode 100644 index 00000000000..87a0935dab2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-5</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.worker.js new file mode 100644 index 00000000000..64c81080e3f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-5 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html new file mode 100644 index 00000000000..c18f9d90582 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.worker.js new file mode 100644 index 00000000000..fe33f4b2bba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html new file mode 100644 index 00000000000..3ad95db1557 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-7</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-7</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(133.33333333grad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.worker.js new file mode 100644 index 00000000000..21d51d7d7f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-7 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(133.33333333grad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html new file mode 100644 index 00000000000..9971b225ba1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-8</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-8</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(2.0943951024rad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.worker.js new file mode 100644 index 00000000000..b5bc64c8c8b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-8 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(2.0943951024rad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html new file mode 100644 index 00000000000..0d99d1457eb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-9</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsl-9</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(0.3333333333turn, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.worker.js new file mode 100644 index 00000000000..cae19531eb0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsl-9 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(0.3333333333turn, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html new file mode 100644 index 00000000000..7f03f71be60 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.worker.js new file mode 100644 index 00000000000..21b44ce7f8c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html new file mode 100644 index 00000000000..014957dee12 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0% / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.worker.js new file mode 100644 index 00000000000..7bf78b9286c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120 100.0% 50.0% / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html new file mode 100644 index 00000000000..9fde7bd963d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.worker.js new file mode 100644 index 00000000000..ff6ab801761 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html new file mode 100644 index 00000000000..56699318a5c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.worker.js new file mode 100644 index 00000000000..f3910ef90f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html new file mode 100644 index 00000000000..1e1990f2fae --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-5</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.worker.js new file mode 100644 index 00000000000..c9631ec3025 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-5 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html new file mode 100644 index 00000000000..0f1b644ea21 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.worker.js new file mode 100644 index 00000000000..c6e4430d947 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html new file mode 100644 index 00000000000..da290762d57 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-7</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-7</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(133.33333333grad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.worker.js new file mode 100644 index 00000000000..cfeaefd06d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-7 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(133.33333333grad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html new file mode 100644 index 00000000000..404277d8a0e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-8</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-8</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(2.0943951024rad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.worker.js new file mode 100644 index 00000000000..fb3415ad903 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-8 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(2.0943951024rad, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html new file mode 100644 index 00000000000..2bd5a10a97c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-9</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-hsla-9</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(0.3333333333turn, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.worker.js new file mode 100644 index 00000000000..1df1c82c8fc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-hsla-9 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(0.3333333333turn, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html new file mode 100644 index 00000000000..3312d05a426 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgb-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgb-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255.0, 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.worker.js new file mode 100644 index 00000000000..4d1386a59b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgb-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255.0, 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html new file mode 100644 index 00000000000..716d4f807e9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgb-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgb-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255, 0, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.worker.js new file mode 100644 index 00000000000..100309e5bc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgb-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255, 0, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html new file mode 100644 index 00000000000..b0faa05949d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgb-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgb-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255, 0, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.worker.js new file mode 100644 index 00000000000..6ac47795ed8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgb-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255, 0, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html new file mode 100644 index 00000000000..df858019a99 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgb-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgb-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0 255 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.worker.js new file mode 100644 index 00000000000..acdfb2df415 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgb-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0 255 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html new file mode 100644 index 00000000000..b38903b0b23 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgb-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgb-5</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0 255 0 / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.worker.js new file mode 100644 index 00000000000..7c44ddd21fa --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgb-5 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0 255 0 / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html new file mode 100644 index 00000000000..c54d8dfd0e9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgb-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgb-6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0 255 0 / 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.worker.js new file mode 100644 index 00000000000..21d62f62132 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgb-6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0 255 0 / 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html new file mode 100644 index 00000000000..dbc831db383 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgba-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgba-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255.0, 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.worker.js new file mode 100644 index 00000000000..cbb68061075 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgba-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255.0, 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html new file mode 100644 index 00000000000..c1f9c6baf6b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgba-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgba-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.worker.js new file mode 100644 index 00000000000..ee3a09a8698 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgba-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html new file mode 100644 index 00000000000..f992663df6a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgba-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgba-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.worker.js new file mode 100644 index 00000000000..7b5f3926e41 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgba-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html new file mode 100644 index 00000000000..482c95fefc8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgba-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgba-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0 255 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.worker.js new file mode 100644 index 00000000000..8e029350d38 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgba-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0 255 0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html new file mode 100644 index 00000000000..ddfff551d7c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgba-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgba-5</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0 255 0 / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.worker.js new file mode 100644 index 00000000000..14d2b301537 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgba-5 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0 255 0 / 0.2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html new file mode 100644 index 00000000000..339cf5f918b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-rgba-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.css-color-4-rgba-6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0 255 0 / 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.worker.js new file mode 100644 index 00000000000..016c7cc51a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.css-color-4-rgba-6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0 255 0 / 20%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.html new file mode 100644 index 00000000000..6637693b410 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hex3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hex3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.worker.js new file mode 100644 index 00000000000..8ccfe6d694e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hex3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.html new file mode 100644 index 00000000000..403ea903871 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hex4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hex4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#0f0f'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.worker.js new file mode 100644 index 00000000000..d8743c30ec2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hex4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#0f0f'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.html new file mode 100644 index 00000000000..c2dbe904b56 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hex6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hex6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#00fF00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.worker.js new file mode 100644 index 00000000000..b6fe583a879 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hex6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#00fF00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.html new file mode 100644 index 00000000000..b09096eae0c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hex8</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hex8</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#00ff00ff'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.worker.js new file mode 100644 index 00000000000..06b5fd0fbdc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hex8.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hex8 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = '#00ff00ff'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.html new file mode 100644 index 00000000000..f6f99838484 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 100%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.worker.js new file mode 100644 index 00000000000..503f5b658b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 100%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.html new file mode 100644 index 00000000000..7df911580a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl( -240 , 100% , 50% )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.worker.js new file mode 100644 index 00000000000..bb9182a8b88 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl( -240 , 100% , 50% )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.html new file mode 100644 index 00000000000..e56c95fb276 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(360120, 100%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.worker.js new file mode 100644 index 00000000000..0809fd424e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(360120, 100%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.html new file mode 100644 index 00000000000..f23a7705394 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(-360240, 100%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.worker.js new file mode 100644 index 00000000000..ccbc3cda88d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(-360240, 100%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.html new file mode 100644 index 00000000000..0ef8a0a8cdd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-5</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.worker.js new file mode 100644 index 00000000000..42a9f90924e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-5 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.html new file mode 100644 index 00000000000..420b787ec8a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(+120, +100%, +50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.worker.js new file mode 100644 index 00000000000..9a5368620f9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(+120, +100%, +50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.html new file mode 100644 index 00000000000..f586958cddc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-clamp-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-clamp-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 200%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.worker.js new file mode 100644 index 00000000000..6c598606ef6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-clamp-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 200%, 50%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.html new file mode 100644 index 00000000000..92c9c95e23a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-clamp-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-clamp-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, -200%, 49.9%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.worker.js new file mode 100644 index 00000000000..7aac1c98e7d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-clamp-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, -200%, 49.9%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.html new file mode 100644 index 00000000000..a6cf15069f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-clamp-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-clamp-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 100%, 200%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 255,255,255,255, "50,25", "255,255,255,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.worker.js new file mode 100644 index 00000000000..341153b091d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-clamp-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 100%, 200%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 255,255,255,255, "50,25", "255,255,255,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.html new file mode 100644 index 00000000000..ac414fd6be0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsl-clamp-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsl-clamp-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 100%, -200%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,255, "50,25", "0,0,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.worker.js new file mode 100644 index 00000000000..403962afc64 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsl-clamp-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsl(120, 100%, -200%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,255, "50,25", "0,0,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.html new file mode 100644 index 00000000000..be595d7a4cc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 50%, 0.499)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.worker.js new file mode 100644 index 00000000000..8185fdd7c90 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 50%, 0.499)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.html new file mode 100644 index 00000000000..c1d0486dd7e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla( 120.0 , 100.0% , 50.0% , 1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.worker.js new file mode 100644 index 00000000000..91c882ec07e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla( 120.0 , 100.0% , 50.0% , 1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.html new file mode 100644 index 00000000000..80b0ecf3383 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-clamp-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-clamp-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 200%, 50%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.worker.js new file mode 100644 index 00000000000..b031416601f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-clamp-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 200%, 50%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.html new file mode 100644 index 00000000000..ae4e637a229 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-clamp-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-clamp-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, -200%, 49.9%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.worker.js new file mode 100644 index 00000000000..671ca1ad390 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-clamp-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, -200%, 49.9%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.html new file mode 100644 index 00000000000..9e35634b537 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-clamp-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-clamp-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 200%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 255,255,255,255, "50,25", "255,255,255,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.worker.js new file mode 100644 index 00000000000..a6045c614ab --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-clamp-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 200%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 255,255,255,255, "50,25", "255,255,255,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.html new file mode 100644 index 00000000000..858b459c1f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-clamp-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-clamp-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, -200%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,255, "50,25", "0,0,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.worker.js new file mode 100644 index 00000000000..77be7be041b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-clamp-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, -200%, 1)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,255, "50,25", "0,0,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.html new file mode 100644 index 00000000000..285108a6e74 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-clamp-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-clamp-5</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 50%, 2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.worker.js new file mode 100644 index 00000000000..d534d4d6c72 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-clamp-5 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 50%, 2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.html new file mode 100644 index 00000000000..8056511b633 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.hsla-clamp-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.hsla-clamp-6</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 0%, -2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.worker.js new file mode 100644 index 00000000000..32a77d921e2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.hsla-clamp-6 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'hsla(120, 100%, 0%, -2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.html new file mode 100644 index 00000000000..f0ea1a733ac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.html4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.html4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'limE'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.worker.js new file mode 100644 index 00000000000..c954966c38a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.html4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.html4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'limE'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html new file mode 100644 index 00000000000..b23a3762ef3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 50% / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.worker.js new file mode 100644 index 00000000000..27db125448a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsl-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 50% / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html new file mode 100644 index 00000000000..2227d55fb0a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0 100% 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.worker.js new file mode 100644 index 00000000000..4edbae4d7ed --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsl-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0 100% 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html new file mode 100644 index 00000000000..dc7caad3f7f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100% 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.worker.js new file mode 100644 index 00000000000..4744f9e873c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsl-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100% 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html new file mode 100644 index 00000000000..affb65e76c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0 100% 50% /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.worker.js new file mode 100644 index 00000000000..545df307f75 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsl-4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0 100% 50% /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html new file mode 100644 index 00000000000..407f6ee2cc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 50% /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.worker.js new file mode 100644 index 00000000000..960e318414c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsl-5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 50% /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html new file mode 100644 index 00000000000..319676e2102 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsla-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 100%, 50% / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.worker.js new file mode 100644 index 00000000000..0bbf5accd5e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsla-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 100%, 50% / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html new file mode 100644 index 00000000000..001e1baa62b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsla-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0 100% 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.worker.js new file mode 100644 index 00000000000..c1e7c0a5663 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsla-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0 100% 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html new file mode 100644 index 00000000000..4e9e59c0523 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-hsla-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 100% 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.worker.js new file mode 100644 index 00000000000..bb45213c4fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-hsla-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 100% 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html new file mode 100644 index 00000000000..ba0ca5e1bbb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255, 0, 0 / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.worker.js new file mode 100644 index 00000000000..17a8f440566 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgb-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255, 0, 0 / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html new file mode 100644 index 00000000000..42354ae8ca6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255 0 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.worker.js new file mode 100644 index 00000000000..7f6efc6060e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgb-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255 0 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html new file mode 100644 index 00000000000..402e6ad57f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255, 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.worker.js new file mode 100644 index 00000000000..f5d551c041c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgb-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255, 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html new file mode 100644 index 00000000000..2556a9c9b1e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(0 0 0 /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.worker.js new file mode 100644 index 00000000000..966f465868f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgb-4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(0 0 0 /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html new file mode 100644 index 00000000000..c2fc1ee8f6c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(0, 0, 0 /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.worker.js new file mode 100644 index 00000000000..3a54246c70a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgb-5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(0, 0, 0 /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html new file mode 100644 index 00000000000..f842efaf0e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgba-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0 / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.worker.js new file mode 100644 index 00000000000..88f7d35465f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgba-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0 / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html new file mode 100644 index 00000000000..22660ca39be --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgba-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255 0 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.worker.js new file mode 100644 index 00000000000..cd4b4890bd8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgba-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255 0 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html new file mode 100644 index 00000000000..e89a715ea76 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.css-color-4-rgba-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.worker.js new file mode 100644 index 00000000000..999e0b59990 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.css-color-4-rgba-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html new file mode 100644 index 00000000000..07ee3701851 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#f'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.worker.js new file mode 100644 index 00000000000..f595e108087 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#f'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.html new file mode 100644 index 00000000000..330c4bac174 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#f0'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.worker.js new file mode 100644 index 00000000000..6fb16f30dee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#f0'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.html new file mode 100644 index 00000000000..0a69c2804d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#g00'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.worker.js new file mode 100644 index 00000000000..832f4dea120 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#g00'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.html new file mode 100644 index 00000000000..5565e7002e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#fg00'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.worker.js new file mode 100644 index 00000000000..f7a7097acdf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#fg00'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.html new file mode 100644 index 00000000000..b1e452c2272 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#ff000'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.worker.js new file mode 100644 index 00000000000..a931467b7a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#ff000'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.html new file mode 100644 index 00000000000..b0954ef1fe0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex6</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#fg0000'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.worker.js new file mode 100644 index 00000000000..750548d74e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex6 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#fg0000'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.html new file mode 100644 index 00000000000..e53cb87a8bc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex7</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex7</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#ff0000f'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.worker.js new file mode 100644 index 00000000000..7796a4e99b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex7 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#ff0000f'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.html new file mode 100644 index 00000000000..a59332f040d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hex8</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hex8</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#fg0000ff'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.worker.js new file mode 100644 index 00000000000..2156ef06cc7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hex8 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '#fg0000ff'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.html new file mode 100644 index 00000000000..fb1548478ea --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsl-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsl-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0%, 100%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.worker.js new file mode 100644 index 00000000000..f1b2a5086fc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsl-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0%, 100%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.html new file mode 100644 index 00000000000..7f50966e0b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsl-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsl-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(z, 100%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.worker.js new file mode 100644 index 00000000000..b09a92dd94a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsl-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(z, 100%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.html new file mode 100644 index 00000000000..7244cd0e34c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsl-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsl-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 0, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.worker.js new file mode 100644 index 00000000000..0b2a0652a35 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsl-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 0, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.html new file mode 100644 index 00000000000..3577666a8c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsl-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsl-4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.worker.js new file mode 100644 index 00000000000..f1743472213 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsl-4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html new file mode 100644 index 00000000000..a3b907089e2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsl-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsl-5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100.%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.worker.js new file mode 100644 index 00000000000..331ec070233 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsl-5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100.%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html new file mode 100644 index 00000000000..9e80a6223b7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsl-6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsl-6</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 50%,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.worker.js new file mode 100644 index 00000000000..3cad84f77a4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsl-6 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsl(0, 100%, 50%,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.html new file mode 100644 index 00000000000..0904209ce36 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsla-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsla-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0%, 100%, 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.worker.js new file mode 100644 index 00000000000..011fbe7bd7d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsla-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0%, 100%, 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html new file mode 100644 index 00000000000..6e89e9d7007 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsla-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsla-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 0, 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.worker.js new file mode 100644 index 00000000000..9ac75b7dc52 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsla-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 0, 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html new file mode 100644 index 00000000000..82ca843a42d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.hsla-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.hsla-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 0, 50%, 1,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.worker.js new file mode 100644 index 00000000000..5f5126efc14 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.hsla-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'hsla(0, 0, 50%, 1,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html new file mode 100644 index 00000000000..26bbd26b7d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.name-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.name-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'darkbrown'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.worker.js new file mode 100644 index 00000000000..70b244089b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.name-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'darkbrown'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.html new file mode 100644 index 00000000000..d112d5d6811 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.name-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.name-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'firebrick1'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.worker.js new file mode 100644 index 00000000000..1aa0f528434 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.name-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'firebrick1'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.html new file mode 100644 index 00000000000..07a0f6cc83b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.name-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.name-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'red blue'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.worker.js new file mode 100644 index 00000000000..abc579a889a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.name-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'red blue'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.html new file mode 100644 index 00000000000..a69c30e8764 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.name-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.name-4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '"red"'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.worker.js new file mode 100644 index 00000000000..7b2f119d0e7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.name-4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '"red"'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.html new file mode 100644 index 00000000000..3f3ae631192 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.name-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.name-5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '"red'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.worker.js new file mode 100644 index 00000000000..a3f9cf144e8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.name-5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = '"red'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html new file mode 100644 index 00000000000..3ba241bc908 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgb-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgb-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255.0, 0, 0,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.worker.js new file mode 100644 index 00000000000..c1ef405c6a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgb-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255.0, 0, 0,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html new file mode 100644 index 00000000000..061784f9ea2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgb-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgb-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(100%, 0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.worker.js new file mode 100644 index 00000000000..e2c287ebe1f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgb-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(100%, 0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html new file mode 100644 index 00000000000..16416672870 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgb-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgb-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255, - 1, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.worker.js new file mode 100644 index 00000000000..bdb9b6dc7a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgb-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgb(255, - 1, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html new file mode 100644 index 00000000000..bc40569ca45 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgba-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgba-1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(100%, 0, 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.worker.js new file mode 100644 index 00000000000..290f175096d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgba-1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(100%, 0, 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html new file mode 100644 index 00000000000..eded526dfa4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgba-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgba-2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, 1. 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.worker.js new file mode 100644 index 00000000000..038b3838ed8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgba-2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, 1. 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html new file mode 100644 index 00000000000..dec7ace9295 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgba-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgba-3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, 1.)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.worker.js new file mode 100644 index 00000000000..9bdf773ca09 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgba-3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, 1.)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html new file mode 100644 index 00000000000..8b0aee56eab --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgba-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgba-4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, '; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.worker.js new file mode 100644 index 00000000000..0db44c38836 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgba-4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, '; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html new file mode 100644 index 00000000000..a3d9790a746 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.invalid.rgba-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.invalid.rgba-5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, 1,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.worker.js new file mode 100644 index 00000000000..e8317ecd30a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.invalid.rgba-5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#0f0'; +try { ctx.fillStyle = 'rgba(255, 0, 0, 1,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html new file mode 100644 index 00000000000..5c48aeef731 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-clamp-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-clamp-1</h1> +<p class="desc"></p> + +<p class="notes">Assumes colours are clamped to [0,255]. +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-1000, 1000, -1000)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.worker.js new file mode 100644 index 00000000000..b98c41cb310 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-clamp-1 +// Description: +// Note:<p class="notes">Assumes colours are clamped to [0,255]. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-1000, 1000, -1000)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.html new file mode 100644 index 00000000000..3db018c5f08 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-clamp-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-clamp-2</h1> +<p class="desc"></p> + +<p class="notes">Assumes colours are clamped to [0,255]. +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-200%, 200%, -200%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.worker.js new file mode 100644 index 00000000000..de7f906714d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-clamp-2 +// Description: +// Note:<p class="notes">Assumes colours are clamped to [0,255]. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-200%, 200%, -200%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.html new file mode 100644 index 00000000000..bde23483776 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-clamp-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-clamp-3</h1> +<p class="desc"></p> + +<p class="notes">Assumes colours are clamped to [0,255]. +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-2147483649, 4294967298, -18446744073709551619)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.worker.js new file mode 100644 index 00000000000..a594da0c17d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-clamp-3 +// Description: +// Note:<p class="notes">Assumes colours are clamped to [0,255]. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-2147483649, 4294967298, -18446744073709551619)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.html new file mode 100644 index 00000000000..3668053c056 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-clamp-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-clamp-4</h1> +<p class="desc"></p> + +<p class="notes">Assumes colours are clamped to [0,255]. +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-1000000000000000000000000000000000000000, 1000000000000000000000000000000000000000, -1000000000000000000000000000000000000000)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.worker.js new file mode 100644 index 00000000000..0dcbcbc8338 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-clamp-4 +// Description: +// Note:<p class="notes">Assumes colours are clamped to [0,255]. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-1000000000000000000000000000000000000000, 1000000000000000000000000000000000000000, -1000000000000000000000000000000000000000)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.html new file mode 100644 index 00000000000..04913c4384b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-clamp-5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-clamp-5</h1> +<p class="desc"></p> + +<p class="notes">Assumes colours are clamped to [0,255]. +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, -10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.worker.js new file mode 100644 index 00000000000..21ebeff24e8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-clamp-5 +// Description: +// Note:<p class="notes">Assumes colours are clamped to [0,255]. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, -10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.html new file mode 100644 index 00000000000..31586c65a57 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-eof</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-eof</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255, 0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.worker.js new file mode 100644 index 00000000000..ead4ddd5f9f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-eof +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0, 255, 0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.html new file mode 100644 index 00000000000..2821ff2c31c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-num</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-num</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0,255,0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.worker.js new file mode 100644 index 00000000000..333fe0fd304 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-num +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0,255,0)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.html new file mode 100644 index 00000000000..0fd927bfe8d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgb-percent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgb-percent</h1> +<p class="desc"></p> + +<p class="notes">CSS3 Color says "The integer value 255 corresponds to 100%". (In particular, it is not 254...) +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0% ,100% ,0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.worker.js new file mode 100644 index 00000000000..67513fb524c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgb-percent +// Description: +// Note:<p class="notes">CSS3 Color says "The integer value 255 corresponds to 100%". (In particular, it is not 254...) + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgb(0% ,100% ,0%)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.html new file mode 100644 index 00000000000..6e403249e69 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-clamp-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-clamp-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, -2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.worker.js new file mode 100644 index 00000000000..561f23228d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-clamp-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, -2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.html new file mode 100644 index 00000000000..c65b4405602 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-clamp-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-clamp-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.worker.js new file mode 100644 index 00000000000..7d7b27c6b5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-clamp-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 2)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.html new file mode 100644 index 00000000000..5f05f788ff2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-eof</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-eof</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 1'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.worker.js new file mode 100644 index 00000000000..8fa8b51e97a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-eof +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0, 255, 0, 1'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.html new file mode 100644 index 00000000000..8b75a3fa4ee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-num-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-num-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , .499 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.worker.js new file mode 100644 index 00000000000..2dbb92859ae --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-num-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , .499 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.html new file mode 100644 index 00000000000..c843b9ab1c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-num-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-num-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , 0.499 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.worker.js new file mode 100644 index 00000000000..3d8a26a03a3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-num-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , 0.499 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.html new file mode 100644 index 00000000000..ccd02aecb1f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-percent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-percent</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0%,100%,0%,0.499)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.worker.js new file mode 100644 index 00000000000..09521661fd9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-percent +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba(0%,100%,0%,0.499)'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,127, "50,25", "0,255,0,127"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.html new file mode 100644 index 00000000000..ba577fd9a95 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-solid-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-solid-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , 1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.worker.js new file mode 100644 index 00000000000..585e851b033 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-solid-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , 1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.html new file mode 100644 index 00000000000..6fb884c14ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-solid-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-solid-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , 1.0 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.worker.js new file mode 100644 index 00000000000..61265402a2a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-solid-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , 1.0 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.html new file mode 100644 index 00000000000..e48a586f213 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-solid-3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-solid-3</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , +1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.worker.js new file mode 100644 index 00000000000..db4516adc65 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-solid-3 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( 0 , 255 , 0 , +1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.html new file mode 100644 index 00000000000..5a48b8d1ad3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.rgba-solid-4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.rgba-solid-4</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( -0 , 255 , +0 , 1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.worker.js new file mode 100644 index 00000000000..181cc45bdee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.rgba-solid-4 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'rgba( -0 , 255 , +0 , 1 )'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.html new file mode 100644 index 00000000000..e9c9726b769 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.svg-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.svg-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'gray'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 128,128,128,255, "50,25", "128,128,128,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.worker.js new file mode 100644 index 00000000000..71bcb605f6e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.svg-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'gray'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 128,128,128,255, "50,25", "128,128,128,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.html new file mode 100644 index 00000000000..dcfec31d54d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.svg-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.svg-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'grey'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 128,128,128,255, "50,25", "128,128,128,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.worker.js new file mode 100644 index 00000000000..0ac805440e9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.svg-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'grey'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 128,128,128,255, "50,25", "128,128,128,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.html new file mode 100644 index 00000000000..ce35a742499 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.system</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.system</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'ThreeDDarkShadow'; +assert_regexp_match(ctx.fillStyle, /^#(?!(FF0000|ff0000|f00)$)/); // test that it's not red + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.worker.js new file mode 100644 index 00000000000..ab5907deaf7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.system.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.system +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'ThreeDDarkShadow'; +assert_regexp_match(ctx.fillStyle, /^#(?!(FF0000|ff0000|f00)$)/); // test that it's not red + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.html new file mode 100644 index 00000000000..3e7da89db94 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.transparent-1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.transparent-1</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'transparent'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.worker.js new file mode 100644 index 00000000000..10bb53b5e4d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.transparent-1 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'transparent'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html new file mode 100644 index 00000000000..9dd87625f5b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.fillStyle.parse.transparent-2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.fillStyle.parse.transparent-2</h1> +<p class="desc"></p> + +<p class="notes"> +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'TrAnSpArEnT'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.worker.js new file mode 100644 index 00000000000..0dd078467f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.fillStyle.parse.transparent-2 +// Description: +// Note:<p class="notes"> + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + + +ctx.fillStyle = '#f00'; +ctx.fillStyle = 'TrAnSpArEnT'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.html new file mode 100644 index 00000000000..372055807c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.empty</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(0, 0, 0, 50); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.worker.js new file mode 100644 index 00000000000..146520e9d70 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.empty.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.empty +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(0, 0, 0, 50); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.html new file mode 100644 index 00000000000..696c6e6afb4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.alpha</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#ff0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, 'rgba(0,0,255, 0)'); +g.addColorStop(1, 'rgba(0,0,255, 1)'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 25,25, 191,191,63,255, "25,25", "191,191,63,255", 3); +_assertPixelApprox(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255", 3); +_assertPixelApprox(offscreenCanvas, 75,25, 63,63,191,255, "75,25", "63,63,191,255", 3); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.worker.js new file mode 100644 index 00000000000..fe53db22029 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.alpha.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.alpha +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#ff0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, 'rgba(0,0,255, 0)'); +g.addColorStop(1, 'rgba(0,0,255, 1)'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 25,25, 191,191,63,255, "25,25", "191,191,63,255", 3); +_assertPixelApprox(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255", 3); +_assertPixelApprox(offscreenCanvas, 75,25, 63,63,191,255, "75,25", "63,63,191,255", 3); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.html new file mode 100644 index 00000000000..a924677855c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.colour</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.colour</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#ff0'); +g.addColorStop(1, '#00f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 25,25, 191,191,63,255, "25,25", "191,191,63,255", 3); +_assertPixelApprox(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255", 3); +_assertPixelApprox(offscreenCanvas, 75,25, 63,63,191,255, "75,25", "63,63,191,255", 3); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.worker.js new file mode 100644 index 00000000000..87cea53d523 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colour.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.colour +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#ff0'); +g.addColorStop(1, '#00f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 25,25, 191,191,63,255, "25,25", "191,191,63,255", 3); +_assertPixelApprox(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255", 3); +_assertPixelApprox(offscreenCanvas, 75,25, 63,63,191,255, "75,25", "63,63,191,255", 3); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html new file mode 100644 index 00000000000..19c4e47df54 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.colouralpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.colouralpha</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, 'rgba(255,255,0, 0)'); +g.addColorStop(1, 'rgba(0,0,255, 1)'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 25,25, 190,190,65,65, "25,25", "190,190,65,65", 3); +_assertPixelApprox(offscreenCanvas, 50,25, 126,126,128,128, "50,25", "126,126,128,128", 3); +_assertPixelApprox(offscreenCanvas, 75,25, 62,62,192,192, "75,25", "62,62,192,192", 3); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.worker.js new file mode 100644 index 00000000000..34c2d037757 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.colouralpha +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, 'rgba(255,255,0, 0)'); +g.addColorStop(1, 'rgba(0,0,255, 1)'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 25,25, 190,190,65,65, "25,25", "190,190,65,65", 3); +_assertPixelApprox(offscreenCanvas, 50,25, 126,126,128,128, "50,25", "126,126,128,128", 3); +_assertPixelApprox(offscreenCanvas, 75,25, 62,62,192,192, "75,25", "62,62,192,192", 3); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.html new file mode 100644 index 00000000000..7f5cd7bc2b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.multiple</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.multiple</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 200; +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#ff0'); +g.addColorStop(0.5, '#0ff'); +g.addColorStop(1, '#f0f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 200, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,255,127,255, "50,25", "127,255,127,255", 3); +_assertPixelApprox(offscreenCanvas, 100,25, 0,255,255,255, "100,25", "0,255,255,255", 3); +_assertPixelApprox(offscreenCanvas, 150,25, 127,127,255,255, "150,25", "127,127,255,255", 3); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.worker.js new file mode 100644 index 00000000000..33bdf88b04f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.multiple.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.multiple +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 200; +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#ff0'); +g.addColorStop(0.5, '#0ff'); +g.addColorStop(1, '#f0f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 200, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,255,127,255, "50,25", "127,255,127,255", 3); +_assertPixelApprox(offscreenCanvas, 100,25, 0,255,255,255, "100,25", "0,255,255,255", 3); +_assertPixelApprox(offscreenCanvas, 150,25, 127,127,255,255, "150,25", "127,127,255,255", 3); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.html new file mode 100644 index 00000000000..f0fd9afab66 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.outside</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(25, 0, 75, 0); +g.addColorStop(0.4, '#0f0'); +g.addColorStop(0.6, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 20,25, 0,255,0,255, "20,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 80,25, 0,255,0,255, "80,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.worker.js new file mode 100644 index 00000000000..9216d0fc511 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.outside.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.outside +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(25, 0, 75, 0); +g.addColorStop(0.4, '#0f0'); +g.addColorStop(0.6, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 20,25, 0,255,0,255, "20,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 80,25, 0,255,0,255, "80,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html new file mode 100644 index 00000000000..945873eea69 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.overlap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.overlap</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 200; +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0, '#ff0'); +g.addColorStop(0.25, '#00f'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.25, '#ff0'); +g.addColorStop(0.5, '#00f'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.75, '#00f'); +g.addColorStop(0.75, '#f00'); +g.addColorStop(0.75, '#ff0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.5, '#ff0'); +g.addColorStop(1, '#00f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 200, 50); +_assertPixelApprox(offscreenCanvas, 49,25, 0,0,255,255, "49,25", "0,0,255,255", 16); +_assertPixelApprox(offscreenCanvas, 51,25, 255,255,0,255, "51,25", "255,255,0,255", 16); +_assertPixelApprox(offscreenCanvas, 99,25, 0,0,255,255, "99,25", "0,0,255,255", 16); +_assertPixelApprox(offscreenCanvas, 101,25, 255,255,0,255, "101,25", "255,255,0,255", 16); +_assertPixelApprox(offscreenCanvas, 149,25, 0,0,255,255, "149,25", "0,0,255,255", 16); +_assertPixelApprox(offscreenCanvas, 151,25, 255,255,0,255, "151,25", "255,255,0,255", 16); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.worker.js new file mode 100644 index 00000000000..bf5a5a559c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap.worker.js @@ -0,0 +1,45 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.overlap +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 200; +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0, '#ff0'); +g.addColorStop(0.25, '#00f'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.25, '#ff0'); +g.addColorStop(0.5, '#00f'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.75, '#00f'); +g.addColorStop(0.75, '#f00'); +g.addColorStop(0.75, '#ff0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.5, '#ff0'); +g.addColorStop(1, '#00f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 200, 50); +_assertPixelApprox(offscreenCanvas, 49,25, 0,0,255,255, "49,25", "0,0,255,255", 16); +_assertPixelApprox(offscreenCanvas, 51,25, 255,255,0,255, "51,25", "255,255,0,255", 16); +_assertPixelApprox(offscreenCanvas, 99,25, 0,0,255,255, "99,25", "0,0,255,255", 16); +_assertPixelApprox(offscreenCanvas, 101,25, 255,255,0,255, "101,25", "255,255,0,255", 16); +_assertPixelApprox(offscreenCanvas, 149,25, 0,0,255,255, "149,25", "0,0,255,255", 16); +_assertPixelApprox(offscreenCanvas, 151,25, 255,255,0,255, "151,25", "255,255,0,255", 16); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.html new file mode 100644 index 00000000000..f20904e248d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.overlap2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.overlap2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +var ps = [ 0, 1/10, 1/4, 1/3, 1/2, 3/4, 1 ]; +for (var p = 0; p < ps.length; ++p) +{ + g.addColorStop(ps[p], '#0f0'); + for (var i = 0; i < 15; ++i) + g.addColorStop(ps[p], '#f00'); + g.addColorStop(ps[p], '#0f0'); +} +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 30,25, 0,255,0,255, "30,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 40,25, 0,255,0,255, "40,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 60,25, 0,255,0,255, "60,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,25, 0,255,0,255, "80,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.worker.js new file mode 100644 index 00000000000..42b84731b27 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.overlap2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +var ps = [ 0, 1/10, 1/4, 1/3, 1/2, 3/4, 1 ]; +for (var p = 0; p < ps.length; ++p) +{ + g.addColorStop(ps[p], '#0f0'); + for (var i = 0; i < 15; ++i) + g.addColorStop(ps[p], '#f00'); + g.addColorStop(ps[p], '#0f0'); +} +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 30,25, 0,255,0,255, "30,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 40,25, 0,255,0,255, "40,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 60,25, 0,255,0,255, "60,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,25, 0,255,0,255, "80,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.html new file mode 100644 index 00000000000..c585bb0857b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.solid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.solid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.worker.js new file mode 100644 index 00000000000..4b500080a73 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.solid.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.solid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.html new file mode 100644 index 00000000000..ffdb32de87c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.vertical</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.vertical</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 0, 50); +g.addColorStop(0, '#ff0'); +g.addColorStop(1, '#00f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,12, 191,191,63,255, "50,12", "191,191,63,255", 10); +_assertPixelApprox(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255", 5); +_assertPixelApprox(offscreenCanvas, 50,37, 63,63,191,255, "50,37", "63,63,191,255", 10); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.worker.js new file mode 100644 index 00000000000..8212ad82608 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.vertical.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.vertical +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 0, 50); +g.addColorStop(0, '#ff0'); +g.addColorStop(1, '#00f'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,12, 191,191,63,255, "50,12", "191,191,63,255", 10); +_assertPixelApprox(offscreenCanvas, 50,25, 127,127,127,255, "50,25", "127,127,127,255", 5); +_assertPixelApprox(offscreenCanvas, 50,37, 63,63,191,255, "50,37", "63,63,191,255", 10); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html new file mode 100644 index 00000000000..7c8eea808e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.zerosize.fill</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.zerosize.fill</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.rect(0, 0, 100, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 40,20, 0,255,0,255, "40,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.worker.js new file mode 100644 index 00000000000..4dbe1462382 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.zerosize.fill +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.rect(0, 0, 100, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 40,20, 0,255,0,255, "40,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html new file mode 100644 index 00000000000..5eb37c86997 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.zerosize.fillRect</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.zerosize.fillRect</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 40,20, 0,255,0,255, "40,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.worker.js new file mode 100644 index 00000000000..935e16a7db9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.zerosize.fillRect +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 40,20, 0,255,0,255, "40,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html new file mode 100644 index 00000000000..7215a955483 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.zerosize.stroke</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.zerosize.stroke</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.strokeStyle = g; +ctx.rect(20, 20, 60, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 19,19, 0,255,0,255, "19,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,19, 0,255,0,255, "20,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,19, 0,255,0,255, "21,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,20, 0,255,0,255, "19,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,20, 0,255,0,255, "21,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,21, 0,255,0,255, "19,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,21, 0,255,0,255, "20,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,21, 0,255,0,255, "21,21", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.worker.js new file mode 100644 index 00000000000..cda4dc46c16 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.zerosize.stroke +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.strokeStyle = g; +ctx.rect(20, 20, 60, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 19,19, 0,255,0,255, "19,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,19, 0,255,0,255, "20,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,19, 0,255,0,255, "21,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,20, 0,255,0,255, "19,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,20, 0,255,0,255, "21,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,21, 0,255,0,255, "19,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,21, 0,255,0,255, "20,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,21, 0,255,0,255, "21,21", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html new file mode 100644 index 00000000000..21c94eea7ff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.interpolate.zerosize.strokeRect</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.interpolate.zerosize.strokeRect</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.strokeStyle = g; +ctx.strokeRect(20, 20, 60, 10); +_assertPixel(offscreenCanvas, 19,19, 0,255,0,255, "19,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,19, 0,255,0,255, "20,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,19, 0,255,0,255, "21,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,20, 0,255,0,255, "19,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,20, 0,255,0,255, "21,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,21, 0,255,0,255, "19,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,21, 0,255,0,255, "20,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,21, 0,255,0,255, "21,21", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.worker.js new file mode 100644 index 00000000000..78b8e8f1246 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.interpolate.zerosize.strokeRect +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.strokeStyle = g; +ctx.strokeRect(20, 20, 60, 10); +_assertPixel(offscreenCanvas, 19,19, 0,255,0,255, "19,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,19, 0,255,0,255, "20,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,19, 0,255,0,255, "21,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,20, 0,255,0,255, "19,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,20, 0,255,0,255, "21,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 19,21, 0,255,0,255, "19,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,21, 0,255,0,255, "20,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,21, 0,255,0,255, "21,21", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.html new file mode 100644 index 00000000000..47b1ee5b2fb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.linear.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.linear.nonfinite</h1> +<p class="desc">createLinearGradient() throws TypeError if arguments are not finite</p> + + +<script> +var t = async_test("createLinearGradient() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(-Infinity, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(NaN, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, -Infinity, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, NaN, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, -Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, NaN, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1, NaN); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, Infinity, Infinity); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.worker.js new file mode 100644 index 00000000000..502921f61f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.nonfinite.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.linear.nonfinite +// Description:createLinearGradient() throws TypeError if arguments are not finite +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createLinearGradient() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(-Infinity, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(NaN, 0, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, -Infinity, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, NaN, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, -Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, NaN, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, 1, NaN); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, 1, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, Infinity, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(Infinity, 0, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, Infinity, 0); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, Infinity, 1, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createLinearGradient(0, 0, Infinity, Infinity); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.html new file mode 100644 index 00000000000..43b17d6106c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.linear.transform.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.linear.transform.1</h1> +<p class="desc">Linear gradient coordinates are relative to the coordinate space at the time of filling</p> + + +<script> +var t = async_test("Linear gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.75, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(-50, 0); +ctx.fillRect(50, 0, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.worker.js new file mode 100644 index 00000000000..f775d85095f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.1.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.linear.transform.1 +// Description:Linear gradient coordinates are relative to the coordinate space at the time of filling +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Linear gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.75, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(-50, 0); +ctx.fillRect(50, 0, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.html new file mode 100644 index 00000000000..44c95e7c052 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.linear.transform.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.linear.transform.2</h1> +<p class="desc">Linear gradient coordinates are relative to the coordinate space at the time of filling</p> + + +<script> +var t = async_test("Linear gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(100, 0); +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.75, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(-150, 0); +ctx.fillRect(50, 0, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.worker.js new file mode 100644 index 00000000000..bca8df0af4b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.2.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.linear.transform.2 +// Description:Linear gradient coordinates are relative to the coordinate space at the time of filling +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Linear gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(100, 0); +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.75, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(-150, 0); +ctx.fillRect(50, 0, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.html new file mode 100644 index 00000000000..963b7eadb11 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.linear.transform.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.linear.transform.3</h1> +<p class="desc">Linear gradient transforms do not experience broken caching effects</p> + + +<script> +var t = async_test("Linear gradient transforms do not experience broken caching effects"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.75, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(-50, 0); +ctx.fillRect(50, 0, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.worker.js new file mode 100644 index 00000000000..6acfd00ef92 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.linear.transform.3.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.linear.transform.3 +// Description:Linear gradient transforms do not experience broken caching effects +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Linear gradient transforms do not experience broken caching effects"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(0.25, '#0f0'); +g.addColorStop(0.75, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(-50, 0); +ctx.fillRect(50, 0, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.html new file mode 100644 index 00000000000..1aec24c65db --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.object.compare</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.object.compare</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g1 = ctx.createLinearGradient(0, 0, 100, 0); +var g2 = ctx.createLinearGradient(0, 0, 100, 0); +_assertDifferent(g1, g2, "g1", "g2"); +ctx.fillStyle = g1; +_assertSame(ctx.fillStyle, g1, "ctx.fillStyle", "g1"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.worker.js new file mode 100644 index 00000000000..affd64388b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.compare.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.object.compare +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g1 = ctx.createLinearGradient(0, 0, 100, 0); +var g2 = ctx.createLinearGradient(0, 0, 100, 0); +_assertDifferent(g1, g2, "g1", "g2"); +ctx.fillStyle = g1; +_assertSame(ctx.fillStyle, g1, "ctx.fillStyle", "g1"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.html new file mode 100644 index 00000000000..eeb62426d04 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.object.crosscanvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.object.crosscanvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var g = offscreenCanvas2.getContext('2d').createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.worker.js new file mode 100644 index 00000000000..9699977a6fe --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.crosscanvas.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.object.crosscanvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var g = offscreenCanvas2.getContext('2d').createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.html new file mode 100644 index 00000000000..795673bad7d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.object.invalidcolour</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.object.invalidcolour</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, ""); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, 'null'); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, 'undefined'); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, null); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, undefined); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.worker.js new file mode 100644 index 00000000000..1fa62f3b17e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidcolour.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.object.invalidcolour +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, ""); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, 'null'); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, 'undefined'); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, null); }); +assert_throws("SYNTAX_ERR", function() { g.addColorStop(0, undefined); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.html new file mode 100644 index 00000000000..2dd87fb47cf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.object.invalidoffset</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.object.invalidoffset</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +assert_throws("INDEX_SIZE_ERR", function() { g.addColorStop(-1, '#000'); }); +assert_throws("INDEX_SIZE_ERR", function() { g.addColorStop(2, '#000'); }); +assert_throws(new TypeError(), function() { g.addColorStop(Infinity, '#000'); }); +assert_throws(new TypeError(), function() { g.addColorStop(-Infinity, '#000'); }); +assert_throws(new TypeError(), function() { g.addColorStop(NaN, '#000'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.worker.js new file mode 100644 index 00000000000..28f7111579f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.invalidoffset.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.object.invalidoffset +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(0, 0, 100, 0); +assert_throws("INDEX_SIZE_ERR", function() { g.addColorStop(-1, '#000'); }); +assert_throws("INDEX_SIZE_ERR", function() { g.addColorStop(2, '#000'); }); +assert_throws(new TypeError(), function() { g.addColorStop(Infinity, '#000'); }); +assert_throws(new TypeError(), function() { g.addColorStop(-Infinity, '#000'); }); +assert_throws(new TypeError(), function() { g.addColorStop(NaN, '#000'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.html new file mode 100644 index 00000000000..c7f36a31993 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.object.update</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.object.update</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(-100, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +g.addColorStop(0.1, '#0f0'); +g.addColorStop(0.9, '#0f0'); +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.worker.js new file mode 100644 index 00000000000..028d9342416 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.object.update.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.object.update +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createLinearGradient(-100, 0, 200, 0); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +g.addColorStop(0.1, '#0f0'); +g.addColorStop(0.9, '#0f0'); +ctx.fillRect(0, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.html new file mode 100644 index 00000000000..6819e1601ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.behind</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.behind</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(120, 25, 10, 211, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.worker.js new file mode 100644 index 00000000000..397ff4ead14 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.behind.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.behind +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(120, 25, 10, 211, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.html new file mode 100644 index 00000000000..0c81b81e842 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.beside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.beside</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(0, 100, 40, 100, 100, 50); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.worker.js new file mode 100644 index 00000000000..145e5119e2e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.beside.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.beside +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(0, 100, 40, 100, 100, 50); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.html new file mode 100644 index 00000000000..51457750b61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.bottom</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.bottom</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(210, 25, 100, 230, 25, 101); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.worker.js new file mode 100644 index 00000000000..daa24b06cd8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.bottom +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(210, 25, 100, 230, 25, 101); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.html new file mode 100644 index 00000000000..8f6c3025d9f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.cylinder</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.cylinder</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(210, 25, 100, 230, 25, 100); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.worker.js new file mode 100644 index 00000000000..85f249571be --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.cylinder +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(210, 25, 100, 230, 25, 100); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.html new file mode 100644 index 00000000000..c5b46bef906 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.front</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.front</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(311, 25, 10, 210, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.worker.js new file mode 100644 index 00000000000..a7758e9e6b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.front.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.front +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(311, 25, 10, 210, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.html new file mode 100644 index 00000000000..a7025577781 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.shape1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.shape1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(30+tol, 40); +ctx.lineTo(110, -20+tol); +ctx.lineTo(110, 100-tol); +ctx.fill(); +var g = ctx.createRadialGradient(30+10*5/2, 40, 10*3/2, 30+10*15/4, 40, 10*9/4); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.worker.js new file mode 100644 index 00000000000..41323f632a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.shape1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(30+tol, 40); +ctx.lineTo(110, -20+tol); +ctx.lineTo(110, 100-tol); +ctx.fill(); +var g = ctx.createRadialGradient(30+10*5/2, 40, 10*3/2, 30+10*15/4, 40, 10*9/4); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.html new file mode 100644 index 00000000000..f4f8bb551dd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.shape2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.shape2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(30+10*5/2, 40, 10*3/2, 30+10*15/4, 40, 10*9/4); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(30-tol, 40); +ctx.lineTo(110, -20-tol); +ctx.lineTo(110, 100+tol); +ctx.fill(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.worker.js new file mode 100644 index 00000000000..4a0b9adf460 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.shape2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(30+10*5/2, 40, 10*3/2, 30+10*15/4, 40, 10*9/4); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(30-tol, 40); +ctx.lineTo(110, -20-tol); +ctx.lineTo(110, 100+tol); +ctx.fill(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.html new file mode 100644 index 00000000000..36f439ea700 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.cone.top</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.cone.top</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(230, 25, 100, 100, 25, 101); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.worker.js new file mode 100644 index 00000000000..4275e56f782 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.cone.top.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.cone.top +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(230, 25, 100, 100, 25, 101); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.html new file mode 100644 index 00000000000..9bbf489b80d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.equal</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.equal</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 20, 50, 25, 20); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.worker.js new file mode 100644 index 00000000000..f5224a32af0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.equal.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.equal +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 20, 50, 25, 20); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.html new file mode 100644 index 00000000000..2cdcd8843eb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.inside1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.inside1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 100, 50, 25, 200); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.worker.js new file mode 100644 index 00000000000..9a3f95a1f2d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside1.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.inside1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 100, 50, 25, 200); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.html new file mode 100644 index 00000000000..0a79dbef2db --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.inside2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.inside2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 200, 50, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.worker.js new file mode 100644 index 00000000000..4715d4e2bb4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside2.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.inside2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 200, 50, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.html new file mode 100644 index 00000000000..25d276edf43 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.inside3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.inside3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 200, 50, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(0.993, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.worker.js new file mode 100644 index 00000000000..b1f5530c146 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.inside3.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.inside3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(50, 25, 200, 50, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(0.993, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.html new file mode 100644 index 00000000000..7de3114838c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.negative</h1> +<p class="desc">createRadialGradient() throws INDEX_SIZE_ERR if either radius is negative</p> + + +<script> +var t = async_test("createRadialGradient() throws INDEX_SIZE_ERR if either radius is negative"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.createRadialGradient(0, 0, -0.1, 0, 0, 1); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createRadialGradient(0, 0, 1, 0, 0, -0.1); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createRadialGradient(0, 0, -0.1, 0, 0, -0.1); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.worker.js new file mode 100644 index 00000000000..c6a98cacdfe --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.negative.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.negative +// Description:createRadialGradient() throws INDEX_SIZE_ERR if either radius is negative +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createRadialGradient() throws INDEX_SIZE_ERR if either radius is negative"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.createRadialGradient(0, 0, -0.1, 0, 0, 1); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createRadialGradient(0, 0, 1, 0, 0, -0.1); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createRadialGradient(0, 0, -0.1, 0, 0, -0.1); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.html new file mode 100644 index 00000000000..22dbe277aa3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.html @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.nonfinite</h1> +<p class="desc">createRadialGradient() throws TypeError if arguments are not finite</p> + + +<script> +var t = async_test("createRadialGradient() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(-Infinity, 0, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(NaN, 0, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, -Infinity, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, NaN, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, -Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, NaN, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, -Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, NaN, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, -Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, NaN, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0, NaN); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, Infinity, Infinity); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.worker.js new file mode 100644 index 00000000000..bbd2e95a2ee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.nonfinite.worker.js @@ -0,0 +1,94 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.nonfinite +// Description:createRadialGradient() throws TypeError if arguments are not finite +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createRadialGradient() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(-Infinity, 0, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(NaN, 0, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, -Infinity, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, NaN, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, -Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, NaN, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, -Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, NaN, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, -Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, NaN, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, 0, NaN); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, Infinity, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(Infinity, 0, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, Infinity, 1, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, 0, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, Infinity, 0, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, Infinity, 1); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, Infinity, 0, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createRadialGradient(0, 0, 1, 0, Infinity, Infinity); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.html new file mode 100644 index 00000000000..ba0676bb7a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.outside1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.outside1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(200, 25, 10, 200, 25, 20); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.worker.js new file mode 100644 index 00000000000..58280a6e45d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside1.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.outside1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(200, 25, 10, 200, 25, 20); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#0f0'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.html new file mode 100644 index 00000000000..24c3a739e24 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.outside2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.outside2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(200, 25, 20, 200, 25, 10); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.worker.js new file mode 100644 index 00000000000..7f1b101bdda --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside2.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.outside2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(200, 25, 20, 200, 25, 10); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.html new file mode 100644 index 00000000000..42589dd1dfc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.outside3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.outside3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(200, 25, 20, 200, 25, 10); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.001, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.worker.js new file mode 100644 index 00000000000..3c41392126c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.outside3.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.outside3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(200, 25, 20, 200, 25, 10); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.001, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.html new file mode 100644 index 00000000000..7fc343028fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.touch1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.touch1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(150, 25, 50, 200, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.worker.js new file mode 100644 index 00000000000..d176c01393b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch1.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.touch1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(150, 25, 50, 200, 25, 100); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.html new file mode 100644 index 00000000000..1c8597d0c61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.touch2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.touch2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150); +g.addColorStop(0, '#f00'); +g.addColorStop(0.01, '#0f0'); +g.addColorStop(0.99, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.worker.js new file mode 100644 index 00000000000..2ffbc757bee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch2.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.touch2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150); +g.addColorStop(0, '#f00'); +g.addColorStop(0.01, '#0f0'); +g.addColorStop(0.99, '#0f0'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.html new file mode 100644 index 00000000000..1a8a81e0789 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.touch3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.touch3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(120, -15, 25, 140, -30, 50); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.worker.js new file mode 100644 index 00000000000..4ea9b8650ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.touch3.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.touch3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var g = ctx.createRadialGradient(120, -15, 25, 140, -30, 50); +g.addColorStop(0, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.html new file mode 100644 index 00000000000..a3b466f9aec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.transform.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.transform.1</h1> +<p class="desc">Radial gradient coordinates are relative to the coordinate space at the time of filling</p> + + +<script> +var t = async_test("Radial gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.51, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(50, 25); +ctx.scale(10, 10); +ctx.fillRect(-5, -2.5, 10, 5); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.worker.js new file mode 100644 index 00000000000..368349187dd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.1.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.transform.1 +// Description:Radial gradient coordinates are relative to the coordinate space at the time of filling +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Radial gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.51, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(50, 25); +ctx.scale(10, 10); +ctx.fillRect(-5, -2.5, 10, 5); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.html new file mode 100644 index 00000000000..2ea3d2a0bef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.transform.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.transform.2</h1> +<p class="desc">Radial gradient coordinates are relative to the coordinate space at the time of filling</p> + + +<script> +var t = async_test("Radial gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(100, 0); +var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.51, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(-50, 25); +ctx.scale(10, 10); +ctx.fillRect(-5, -2.5, 10, 5); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.worker.js new file mode 100644 index 00000000000..1519c337346 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.2.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.transform.2 +// Description:Radial gradient coordinates are relative to the coordinate space at the time of filling +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Radial gradient coordinates are relative to the coordinate space at the time of filling"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(100, 0); +var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.51, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.translate(-50, 25); +ctx.scale(10, 10); +ctx.fillRect(-5, -2.5, 10, 5); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.html new file mode 100644 index 00000000000..eb3f7ba0280 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.gradient.radial.transform.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.gradient.radial.transform.3</h1> +<p class="desc">Radial gradient transforms do not experience broken caching effects</p> + + +<script> +var t = async_test("Radial gradient transforms do not experience broken caching effects"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.51, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(50, 25); +ctx.scale(10, 10); +ctx.fillRect(-5, -2.5, 10, 5); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.worker.js new file mode 100644 index 00000000000..5239376db48 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.gradient.radial.transform.3.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.gradient.radial.transform.3 +// Description:Radial gradient transforms do not experience broken caching effects +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Radial gradient transforms do not experience broken caching effects"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); +g.addColorStop(0, '#0f0'); +g.addColorStop(0.5, '#0f0'); +g.addColorStop(0.51, '#f00'); +g.addColorStop(1, '#f00'); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(50, 25); +ctx.scale(10, 10); +ctx.fillRect(-5, -2.5, 10, 5); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.html new file mode 100644 index 00000000000..b3be4e9816d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.basic.canvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.basic.canvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.worker.js new file mode 100644 index 00000000000..a9969f65222 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.canvas.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.basic.canvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.html new file mode 100644 index 00000000000..730fb02383c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.basic.image</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.basic.image</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.worker.js new file mode 100644 index 00000000000..2d4dfd8ee6f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.image.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.basic.image +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.html new file mode 100644 index 00000000000..fcaecbce760 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.basic.nocontext</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.basic.nocontext</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.worker.js new file mode 100644 index 00000000000..a5dacef885e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.nocontext.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.basic.nocontext +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.html new file mode 100644 index 00000000000..4652c407ccf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.basic.zerocanvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.basic.zerocanvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 0; +offscreenCanvas.height = 10; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 10, "offscreenCanvas.height", "10"); +assert_throws("INVALID_STATE_ERR", function() { ctx.createPattern(offscreenCanvas, 'repeat'); }); +offscreenCanvas.width = 10; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 10, "offscreenCanvas.width", "10"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); +assert_throws("INVALID_STATE_ERR", function() { ctx.createPattern(offscreenCanvas, 'repeat'); }); +offscreenCanvas.width = 0; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); +assert_throws("INVALID_STATE_ERR", function() { ctx.createPattern(offscreenCanvas, 'repeat'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.worker.js new file mode 100644 index 00000000000..326ce535d45 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.basic.zerocanvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 0; +offscreenCanvas.height = 10; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 10, "offscreenCanvas.height", "10"); +assert_throws("INVALID_STATE_ERR", function() { ctx.createPattern(offscreenCanvas, 'repeat'); }); +offscreenCanvas.width = 10; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 10, "offscreenCanvas.width", "10"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); +assert_throws("INVALID_STATE_ERR", function() { ctx.createPattern(offscreenCanvas, 'repeat'); }); +offscreenCanvas.width = 0; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); +assert_throws("INVALID_STATE_ERR", function() { ctx.createPattern(offscreenCanvas, 'repeat'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.html new file mode 100644 index 00000000000..f7d0c5fdf61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.crosscanvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.crosscanvas</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var pattern = offscreenCanvas2.getContext('2d').createPattern(response, 'no-repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.worker.js new file mode 100644 index 00000000000..6d3ba31bace --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.crosscanvas.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.crosscanvas +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var pattern = offscreenCanvas2.getContext('2d').createPattern(response, 'no-repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.html new file mode 100644 index 00000000000..30fd65a26b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.image.null</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.image.null</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createPattern(null, 'repeat'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.worker.js new file mode 100644 index 00000000000..454e619a8b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.null.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.image.null +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createPattern(null, 'repeat'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.html new file mode 100644 index 00000000000..bcc4ad00cb8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.image.string</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.image.string</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createPattern('../images/red.png', 'repeat'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.worker.js new file mode 100644 index 00000000000..6d732e7b200 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.string.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.image.string +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createPattern('../images/red.png', 'repeat'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.html new file mode 100644 index 00000000000..f0347ea9732 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.image.undefined</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.image.undefined</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createPattern(undefined, 'repeat'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.worker.js new file mode 100644 index 00000000000..8ed51b6c1bb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.image.undefined.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.image.undefined +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createPattern(undefined, 'repeat'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.html new file mode 100644 index 00000000000..23c7e78ad9f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.modify.canvas1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.modify.canvas1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.worker.js new file mode 100644 index 00000000000..6ca4d6da35a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas1.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.modify.canvas1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.html new file mode 100644 index 00000000000..f7488fcca7e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.modify.canvas2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.modify.canvas2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.worker.js new file mode 100644 index 00000000000..a872bb8ea2b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.modify.canvas2.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.modify.canvas2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.html new file mode 100644 index 00000000000..925e5cb5ea8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.norepeat.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.norepeat.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.worker.js new file mode 100644 index 00000000000..9316317d60a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.norepeat.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.html new file mode 100644 index 00000000000..2b81da144b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.norepeat.coord1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.norepeat.coord1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 0); + ctx.fillRect(-50, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.worker.js new file mode 100644 index 00000000000..4210eaa4f9f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.norepeat.coord1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 0); + ctx.fillRect(-50, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.html new file mode 100644 index 00000000000..bdc3ab954f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.norepeat.coord2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.norepeat.coord2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.fillStyle = pattern; + ctx.translate(50, 0); + ctx.fillRect(-50, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.worker.js new file mode 100644 index 00000000000..226db04e1c6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.norepeat.coord2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.fillStyle = pattern; + ctx.translate(50, 0); + ctx.fillRect(-50, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.html new file mode 100644 index 00000000000..8c027af2a4c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.norepeat.coord3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.norepeat.coord3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 25); + ctx.fillRect(-50, -25, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 25); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.worker.js new file mode 100644 index 00000000000..da93c53d292 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.norepeat.coord3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 25); + ctx.fillRect(-50, -25, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 25); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.html new file mode 100644 index 00000000000..916272fcade --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.norepeat.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.norepeat.outside</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + ctx.fillRect(-100, 0, 100, 50); + ctx.fillRect(0, 50, 100, 50); + ctx.fillRect(100, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.worker.js new file mode 100644 index 00000000000..d8b59007076 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.norepeat.outside +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + ctx.fillRect(-100, 0, 100, 50); + ctx.fillRect(0, 50, 100, 50); + ctx.fillRect(100, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.html new file mode 100644 index 00000000000..42576fa5f8c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.orientation.canvas</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.orientation.canvas</h1> +<p class="desc">Canvas patterns do not get flipped when painted</p> + + +<script> +var t = async_test("Canvas patterns do not get flipped when painted"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 25); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 25, 100, 25); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 25); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.worker.js new file mode 100644 index 00000000000..3a7b8521c1e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.orientation.canvas +// Description:Canvas patterns do not get flipped when painted +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Canvas patterns do not get flipped when painted"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 25); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 25, 100, 25); +var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); +ctx.fillStyle = pattern; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 25); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.html new file mode 100644 index 00000000000..0b9bda31b80 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.orientation.image</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.orientation.image</h1> +<p class="desc">Image patterns do not get flipped when painted</p> + + +<script> +var t = async_test("Image patterns do not get flipped when painted"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rrgg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.save(); + ctx.translate(0, -103); + ctx.fillRect(0, 103, 100, 50); + ctx.restore(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 25); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.worker.js new file mode 100644 index 00000000000..a1fa022c6fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.orientation.image.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.orientation.image +// Description:Image patterns do not get flipped when painted +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Image patterns do not get flipped when painted"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rrgg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.save(); + ctx.translate(0, -103); + ctx.fillRect(0, 103, 100, 50); + ctx.restore(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 25); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.html new file mode 100644 index 00000000000..e2dd06a5b54 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeat.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeat.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.worker.js new file mode 100644 index 00000000000..062c5956c46 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeat.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.html new file mode 100644 index 00000000000..b7d9a57a6d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeat.coord1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeat.coord1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(-128, -78); + ctx.fillRect(128, 78, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.worker.js new file mode 100644 index 00000000000..9f442a8d51e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.worker.js @@ -0,0 +1,40 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeat.coord1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(-128, -78); + ctx.fillRect(128, 78, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.html new file mode 100644 index 00000000000..ff5b67de77f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeat.coord2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeat.coord2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/grgr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.worker.js new file mode 100644 index 00000000000..5e2f1216c48 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeat.coord2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/grgr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.html new file mode 100644 index 00000000000..02c45fd5281 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeat.coord3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeat.coord3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(-128, -78); + ctx.fillRect(128, 78, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js new file mode 100644 index 00000000000..622bcecfba5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeat.coord3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(-128, -78); + ctx.fillRect(128, 78, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.html new file mode 100644 index 00000000000..6489e235dce --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeat.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeat.outside</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 25); + ctx.fillRect(-50, -25, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.worker.js new file mode 100644 index 00000000000..246bccecd87 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.worker.js @@ -0,0 +1,40 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeat.outside +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 25); + ctx.fillRect(-50, -25, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.html new file mode 100644 index 00000000000..13e7b8d30bf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeatx.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeatx.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 16); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.worker.js new file mode 100644 index 00000000000..aba01182d9d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeatx.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 16); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.html new file mode 100644 index 00000000000..1fc2e52184d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeatx.coord1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeatx.coord1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.translate(0, 16); + ctx.fillRect(0, -16, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 16); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.worker.js new file mode 100644 index 00000000000..e4777e05d29 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeatx.coord1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.translate(0, 16); + ctx.fillRect(0, -16, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 16); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.html new file mode 100644 index 00000000000..c6ec1223cdb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeatx.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeatx.outside</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 16); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.worker.js new file mode 100644 index 00000000000..fc8a4a013c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeatx.outside +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 16); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.html new file mode 100644 index 00000000000..f678f1c28ff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeaty.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeaty.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 16, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.worker.js new file mode 100644 index 00000000000..40dfda945be --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeaty.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 16, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.html new file mode 100644 index 00000000000..6d3e3434d55 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeaty.coord1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeaty.coord1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.translate(48, 0); + ctx.fillRect(-48, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.worker.js new file mode 100644 index 00000000000..108c462f6ec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeaty.coord1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.translate(48, 0); + ctx.fillRect(-48, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.html new file mode 100644 index 00000000000..5790bdaf748 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.paint.repeaty.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.paint.repeaty.outside</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.worker.js new file mode 100644 index 00000000000..49586743408 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.paint.repeaty.outside +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.html new file mode 100644 index 00000000000..0b082dfa974 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.case</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.case</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "Repeat"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.worker.js new file mode 100644 index 00000000000..0130fe39be6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.case.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.case +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "Repeat"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.html new file mode 100644 index 00000000000..009736cc1ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.empty</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-1x1.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, ""); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 200, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.worker.js new file mode 100644 index 00000000000..8042a3c79e0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.empty.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.empty +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-1x1.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, ""); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 200, 50); + _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); + _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.html new file mode 100644 index 00000000000..7e78ae015ae --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.null</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.null</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assert(ctx.createPattern(offscreenCanvas, null) != null, "ctx.createPattern(offscreenCanvas, null) != null"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.worker.js new file mode 100644 index 00000000000..ee623df1f15 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.null.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.null +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assert(ctx.createPattern(offscreenCanvas, null) != null, "ctx.createPattern(offscreenCanvas, null) != null"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.html new file mode 100644 index 00000000000..7f85f3e479c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.nullsuffix</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.nullsuffix</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "repeat\0"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.worker.js new file mode 100644 index 00000000000..c6ed1417d16 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.nullsuffix +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "repeat\0"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.html new file mode 100644 index 00000000000..298ba9976dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.undefined</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.undefined</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, undefined); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.worker.js new file mode 100644 index 00000000000..3a275b82633 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.undefined.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.undefined +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, undefined); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.html new file mode 100644 index 00000000000..79e379ec475 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.unrecognised</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.unrecognised</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "invalid"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.worker.js new file mode 100644 index 00000000000..08c076b6cff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.unrecognised +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "invalid"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.html new file mode 100644 index 00000000000..c8f4ccf5f70 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.pattern.repeat.unrecognisednull</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.pattern.repeat.unrecognisednull</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "null"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.worker.js new file mode 100644 index 00000000000..fc4a45510c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.pattern.repeat.unrecognisednull +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("SYNTAX_ERR", function() { ctx.createPattern(offscreenCanvas, "null"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.html b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.html new file mode 100644 index 00000000000..0697685828e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.strokeStyle.default</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.strokeStyle.default</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.strokeStyle, '#000000', "ctx.strokeStyle", "'#000000'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.worker.js new file mode 100644 index 00000000000..498f2f99ad9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/fill-and-stroke-styles/2d.strokeStyle.default.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.strokeStyle.default +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.strokeStyle, '#000000', "ctx.strokeStyle", "'#000000'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/image-smoothing/image.smoothing.html b/tests/wpt/web-platform-tests/offscreen-canvas/image-smoothing/image.smoothing.html new file mode 100644 index 00000000000..a78524c51d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/image-smoothing/image.smoothing.html @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>OffscreenCanvasRenderingContext2D imageSmoothingEnabled test</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#the-offscreen-2d-rendering-context"> +<script> +function createTestImage() { + var image = new OffscreenCanvas(100, 50); + var imgctx = image.getContext('2d'); + imgctx.fillStyle = "#F00"; + imgctx.fillRect(0, 0, 2, 2); + imgctx.fillStyle = "#0F0"; + imgctx.fillRect(0, 0, 1, 1); + return image; +} + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + assert_true(ctx.imageSmoothingEnabled); +}, "When the context is created, imageSmoothingEnabled must be set to true."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.imageSmoothingEnabled = false; + assert_false(ctx.imageSmoothingEnabled); +}, "On getting imageSmoothingEnabled, the user agent must return the last value it was set to."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_not_equals(pixels[0], 0); + assert_not_equals(pixels[1], 255); +}, "Test that image smoothing is actually on by default."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.imageSmoothingEnabled = true; + var image = createTestImage(); + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_not_equals(pixels[0], 0); + assert_not_equals(pixels[1], 255); +}, "Test that image smoothing works when imageSmoothingEnabled is set to true"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with drawImage()."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.fillStyle = ctx.createPattern(image, 'repeat'); + ctx.fillRect(0, 0, 10, 10); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with fillRect and createPattern()."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.fillStyle = ctx.createPattern(image, 'repeat'); + ctx.scale(10, 10); + ctx.rect(0, 0, 10, 10); + ctx.fill(); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with fill() and createPattern()."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.strokeStyle = ctx.createPattern(image, 'repeat'); + ctx.lineWidth = 5; + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(10, 10); + ctx.stroke(); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with stroke() and createPattern()."); + +test(function() { + var repaints = 5; + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + + function draw() { + ctx.clearRect(0, 0, 10, 10); + ctx.setTransform(1, 0, 0, 1, 0, 0); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); + } + + while (repaints > 0) { + draw(); + repaints = repaints - 1; + } + +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) still works after repaints."); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/image-smoothing/image.smoothing.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/image-smoothing/image.smoothing.worker.js new file mode 100644 index 00000000000..4c37e84b1f2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/image-smoothing/image.smoothing.worker.js @@ -0,0 +1,126 @@ +// spec link: https://html.spec.whatwg.org/#the-offscreen-2d-rendering-context + +importScripts("/resources/testharness.js"); + +function createTestImage() { + var image = new OffscreenCanvas(100, 50); + var imgctx = image.getContext('2d'); + imgctx.fillStyle = "#F00"; + imgctx.fillRect(0, 0, 2, 2); + imgctx.fillStyle = "#0F0"; + imgctx.fillRect(0, 0, 1, 1); + return image; +} + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + assert_true(ctx.imageSmoothingEnabled); +}, "When the context is created, imageSmoothingEnabled must be set to true."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.imageSmoothingEnabled = false; + assert_false(ctx.imageSmoothingEnabled); +}, "On getting imageSmoothingEnabled, the user agent must return the last value it was set to."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_not_equals(pixels[0], 0); + assert_not_equals(pixels[1], 255); +}, "Test that image smoothing is actually on by default."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.imageSmoothingEnabled = true; + var image = createTestImage(); + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_not_equals(pixels[0], 0); + assert_not_equals(pixels[1], 255); +}, "Test that image smoothing works when imageSmoothingEnabled is set to true"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with drawImage()."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.fillStyle = ctx.createPattern(image, 'repeat'); + ctx.fillRect(0, 0, 10, 10); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with fillRect and createPattern()."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.fillStyle = ctx.createPattern(image, 'repeat'); + ctx.scale(10, 10); + ctx.rect(0, 0, 10, 10); + ctx.fill(); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with fill() and createPattern()."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + var image = createTestImage(); + ctx.strokeStyle = ctx.createPattern(image, 'repeat'); + ctx.lineWidth = 5; + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(10, 10); + ctx.stroke(); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with stroke() and createPattern()."); + +test(function() { + var repaints = 5; + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + + function draw() { + ctx.clearRect(0, 0, 10, 10); + ctx.setTransform(1, 0, 0, 1, 0, 0); + var image = createTestImage(); + ctx.imageSmoothingEnabled = false; + ctx.scale(10, 10); + ctx.drawImage(image, 0, 0); + var pixels = ctx.getImageData(9, 9, 1, 1).data; + assert_array_equals(pixels, [0, 255, 0, 255]); + } + + while (repaints > 0) { + draw(); + repaints = repaints - 1; + } + +}, "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) still works after repaints."); + +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.butt.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.butt.html new file mode 100644 index 00000000000..21ca86b29b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.butt.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.butt</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.butt</h1> +<p class="desc">lineCap 'butt' is rendered correctly</p> + + +<script> +var t = async_test("lineCap 'butt' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineCap = 'butt'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 15, 20, 20); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.fillRect(65, 15, 20, 20); +_assertPixel(offscreenCanvas, 25,14, 0,255,0,255, "25,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,15, 0,255,0,255, "25,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,16, 0,255,0,255, "25,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,34, 0,255,0,255, "25,34", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,35, 0,255,0,255, "25,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,36, 0,255,0,255, "25,36", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,14, 0,255,0,255, "75,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,15, 0,255,0,255, "75,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,16, 0,255,0,255, "75,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,34, 0,255,0,255, "75,34", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,35, 0,255,0,255, "75,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,36, 0,255,0,255, "75,36", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.butt.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.butt.worker.js new file mode 100644 index 00000000000..b9d503c8051 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.butt.worker.js @@ -0,0 +1,49 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.butt +// Description:lineCap 'butt' is rendered correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineCap 'butt' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineCap = 'butt'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 15, 20, 20); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.fillRect(65, 15, 20, 20); +_assertPixel(offscreenCanvas, 25,14, 0,255,0,255, "25,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,15, 0,255,0,255, "25,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,16, 0,255,0,255, "25,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,34, 0,255,0,255, "25,34", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,35, 0,255,0,255, "25,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,36, 0,255,0,255, "25,36", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,14, 0,255,0,255, "75,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,15, 0,255,0,255, "75,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,16, 0,255,0,255, "75,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,34, 0,255,0,255, "75,34", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,35, 0,255,0,255, "75,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,36, 0,255,0,255, "75,36", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.closed.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.closed.html new file mode 100644 index 00000000000..66b08530f54 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.closed.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.closed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.closed</h1> +<p class="desc">Line caps are not drawn at the corners of an unclosed rectangle</p> + + +<script> +var t = async_test("Line caps are not drawn at the corners of an unclosed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'bevel'; +ctx.lineCap = 'square'; +ctx.lineWidth = 400; +ctx.beginPath(); +ctx.moveTo(200, 200); +ctx.lineTo(200, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 200); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.closed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.closed.worker.js new file mode 100644 index 00000000000..f5237d6c2b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.closed.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.closed +// Description:Line caps are not drawn at the corners of an unclosed rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Line caps are not drawn at the corners of an unclosed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'bevel'; +ctx.lineCap = 'square'; +ctx.lineWidth = 400; +ctx.beginPath(); +ctx.moveTo(200, 200); +ctx.lineTo(200, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 200); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.invalid.html new file mode 100644 index 00000000000..cbf7cebc8bf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.invalid.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.invalid</h1> +<p class="desc">Setting lineCap to invalid values is ignored</p> + + +<script> +var t = async_test("Setting lineCap to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineCap = 'butt' +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'invalid'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'ROUND'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'round\0'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'round '; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = ""; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'bevel'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.invalid.worker.js new file mode 100644 index 00000000000..4c3495f277a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.invalid.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.invalid +// Description:Setting lineCap to invalid values is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting lineCap to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineCap = 'butt' +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'invalid'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'ROUND'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'round\0'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'round '; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = ""; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'butt'; +ctx.lineCap = 'bevel'; +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.open.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.open.html new file mode 100644 index 00000000000..8b7a599c32b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.open.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.open</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.open</h1> +<p class="desc">Line caps are drawn at the corners of an unclosed rectangle</p> + + +<script> +var t = async_test("Line caps are drawn at the corners of an unclosed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'bevel'; +ctx.lineCap = 'square'; +ctx.lineWidth = 400; +ctx.beginPath(); +ctx.moveTo(200, 200); +ctx.lineTo(200, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 200); +ctx.lineTo(200, 200); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.open.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.open.worker.js new file mode 100644 index 00000000000..b67dc5798bd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.open.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.open +// Description:Line caps are drawn at the corners of an unclosed rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Line caps are drawn at the corners of an unclosed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'bevel'; +ctx.lineCap = 'square'; +ctx.lineWidth = 400; +ctx.beginPath(); +ctx.moveTo(200, 200); +ctx.lineTo(200, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 200); +ctx.lineTo(200, 200); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.round.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.round.html new file mode 100644 index 00000000000..fb383cba9bd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.round.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.round</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.round</h1> +<p class="desc">lineCap 'round' is rendered correctly</p> + + +<script> +var t = async_test("lineCap 'round' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.lineCap = 'round'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(35-tol, 15); +ctx.arc(25, 15, 10-tol, 0, Math.PI, true); +ctx.arc(25, 35, 10-tol, Math.PI, 0, true); +ctx.fill(); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(85+tol, 15); +ctx.arc(75, 15, 10+tol, 0, Math.PI, true); +ctx.arc(75, 35, 10+tol, Math.PI, 0, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 17,6, 0,255,0,255, "17,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,6, 0,255,0,255, "25,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 32,6, 0,255,0,255, "32,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 17,43, 0,255,0,255, "17,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,43, 0,255,0,255, "25,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 32,43, 0,255,0,255, "32,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 67,6, 0,255,0,255, "67,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,6, 0,255,0,255, "75,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 82,6, 0,255,0,255, "82,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 67,43, 0,255,0,255, "67,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,43, 0,255,0,255, "75,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 82,43, 0,255,0,255, "82,43", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.round.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.round.worker.js new file mode 100644 index 00000000000..7592393b3cb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.round.worker.js @@ -0,0 +1,58 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.round +// Description:lineCap 'round' is rendered correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineCap 'round' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.lineCap = 'round'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(35-tol, 15); +ctx.arc(25, 15, 10-tol, 0, Math.PI, true); +ctx.arc(25, 35, 10-tol, Math.PI, 0, true); +ctx.fill(); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(85+tol, 15); +ctx.arc(75, 15, 10+tol, 0, Math.PI, true); +ctx.arc(75, 35, 10+tol, Math.PI, 0, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 17,6, 0,255,0,255, "17,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,6, 0,255,0,255, "25,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 32,6, 0,255,0,255, "32,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 17,43, 0,255,0,255, "17,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,43, 0,255,0,255, "25,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 32,43, 0,255,0,255, "32,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 67,6, 0,255,0,255, "67,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,6, 0,255,0,255, "75,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 82,6, 0,255,0,255, "82,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 67,43, 0,255,0,255, "67,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,43, 0,255,0,255, "75,43", "0,255,0,255"); +_assertPixel(offscreenCanvas, 82,43, 0,255,0,255, "82,43", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.square.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.square.html new file mode 100644 index 00000000000..ef9646e6328 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.square.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.square</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.square</h1> +<p class="desc">lineCap 'square' is rendered correctly</p> + + +<script> +var t = async_test("lineCap 'square' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineCap = 'square'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 5, 20, 40); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.fillRect(65, 5, 20, 40); +_assertPixel(offscreenCanvas, 25,4, 0,255,0,255, "25,4", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,5, 0,255,0,255, "25,5", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,6, 0,255,0,255, "25,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,44, 0,255,0,255, "25,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,45, 0,255,0,255, "25,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,46, 0,255,0,255, "25,46", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,4, 0,255,0,255, "75,4", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,5, 0,255,0,255, "75,5", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,6, 0,255,0,255, "75,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,44, 0,255,0,255, "75,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,45, 0,255,0,255, "75,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,46, 0,255,0,255, "75,46", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.square.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.square.worker.js new file mode 100644 index 00000000000..6e07a801e12 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.square.worker.js @@ -0,0 +1,49 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.square +// Description:lineCap 'square' is rendered correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineCap 'square' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineCap = 'square'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 5, 20, 40); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.fillRect(65, 5, 20, 40); +_assertPixel(offscreenCanvas, 25,4, 0,255,0,255, "25,4", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,5, 0,255,0,255, "25,5", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,6, 0,255,0,255, "25,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,44, 0,255,0,255, "25,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,45, 0,255,0,255, "25,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,46, 0,255,0,255, "25,46", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,4, 0,255,0,255, "75,4", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,5, 0,255,0,255, "75,5", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,6, 0,255,0,255, "75,6", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,44, 0,255,0,255, "75,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,45, 0,255,0,255, "75,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,46, 0,255,0,255, "75,46", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.valid.html new file mode 100644 index 00000000000..16a4f48d210 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.valid.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cap.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cap.valid</h1> +<p class="desc">Setting lineCap to valid values works</p> + + +<script> +var t = async_test("Setting lineCap to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineCap = 'butt' +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'round'; +_assertSame(ctx.lineCap, 'round', "ctx.lineCap", "'round'"); +ctx.lineCap = 'square'; +_assertSame(ctx.lineCap, 'square', "ctx.lineCap", "'square'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.valid.worker.js new file mode 100644 index 00000000000..b364f3d1c68 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cap.valid.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cap.valid +// Description:Setting lineCap to valid values works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting lineCap to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineCap = 'butt' +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +ctx.lineCap = 'round'; +_assertSame(ctx.lineCap, 'round', "ctx.lineCap", "'round'"); +ctx.lineCap = 'square'; +_assertSame(ctx.lineCap, 'square', "ctx.lineCap", "'square'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cross.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cross.html new file mode 100644 index 00000000000..31fc3f35009 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cross.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.cross</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.cross</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.lineJoin = 'bevel'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(110, 50); +ctx.lineTo(110, 60); +ctx.lineTo(100, 60); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cross.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cross.worker.js new file mode 100644 index 00000000000..b85231e87da --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.cross.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.cross +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.lineJoin = 'bevel'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(110, 50); +ctx.lineTo(110, 60); +ctx.lineTo(100, 60); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.defaults.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.defaults.html new file mode 100644 index 00000000000..e9fc509b5d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.defaults.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.defaults</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.defaults</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.lineWidth, 1, "ctx.lineWidth", "1"); +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +_assertSame(ctx.lineJoin, 'miter', "ctx.lineJoin", "'miter'"); +_assertSame(ctx.miterLimit, 10, "ctx.miterLimit", "10"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.defaults.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.defaults.worker.js new file mode 100644 index 00000000000..672bee54eff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.defaults.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.defaults +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.lineWidth, 1, "ctx.lineWidth", "1"); +_assertSame(ctx.lineCap, 'butt', "ctx.lineCap", "'butt'"); +_assertSame(ctx.lineJoin, 'miter', "ctx.lineJoin", "'miter'"); +_assertSame(ctx.miterLimit, 10, "ctx.miterLimit", "10"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.bevel.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.bevel.html new file mode 100644 index 00000000000..c721d29b900 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.bevel.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.bevel</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.bevel</h1> +<p class="desc">lineJoin 'bevel' is rendered correctly</p> + + +<script> +var t = async_test("lineJoin 'bevel' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.lineJoin = 'bevel'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(10, 10, 20, 20); +ctx.fillRect(20, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(30, 20); +ctx.lineTo(40-tol, 20); +ctx.lineTo(30, 10+tol); +ctx.fill(); +ctx.beginPath(); +ctx.moveTo(10, 20); +ctx.lineTo(30, 20); +ctx.lineTo(30, 40); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(60, 20); +ctx.lineTo(80, 20); +ctx.lineTo(80, 40); +ctx.stroke(); +ctx.fillRect(60, 10, 20, 20); +ctx.fillRect(70, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(80, 20); +ctx.lineTo(90+tol, 20); +ctx.lineTo(80, 10-tol); +ctx.fill(); +_assertPixel(offscreenCanvas, 34,16, 0,255,0,255, "34,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 34,15, 0,255,0,255, "34,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 35,15, 0,255,0,255, "35,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,15, 0,255,0,255, "36,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,14, 0,255,0,255, "36,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,16, 0,255,0,255, "84,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,15, 0,255,0,255, "84,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 85,15, 0,255,0,255, "85,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,15, 0,255,0,255, "86,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,14, 0,255,0,255, "86,14", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.bevel.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.bevel.worker.js new file mode 100644 index 00000000000..94d9efb72ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.bevel.worker.js @@ -0,0 +1,62 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.bevel +// Description:lineJoin 'bevel' is rendered correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineJoin 'bevel' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.lineJoin = 'bevel'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(10, 10, 20, 20); +ctx.fillRect(20, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(30, 20); +ctx.lineTo(40-tol, 20); +ctx.lineTo(30, 10+tol); +ctx.fill(); +ctx.beginPath(); +ctx.moveTo(10, 20); +ctx.lineTo(30, 20); +ctx.lineTo(30, 40); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(60, 20); +ctx.lineTo(80, 20); +ctx.lineTo(80, 40); +ctx.stroke(); +ctx.fillRect(60, 10, 20, 20); +ctx.fillRect(70, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(80, 20); +ctx.lineTo(90+tol, 20); +ctx.lineTo(80, 10-tol); +ctx.fill(); +_assertPixel(offscreenCanvas, 34,16, 0,255,0,255, "34,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 34,15, 0,255,0,255, "34,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 35,15, 0,255,0,255, "35,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,15, 0,255,0,255, "36,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,14, 0,255,0,255, "36,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,16, 0,255,0,255, "84,16", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,15, 0,255,0,255, "84,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 85,15, 0,255,0,255, "85,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,15, 0,255,0,255, "86,15", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,14, 0,255,0,255, "86,14", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.closed.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.closed.html new file mode 100644 index 00000000000..874ef833ded --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.closed.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.closed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.closed</h1> +<p class="desc">Line joins are drawn at the corner of a closed rectangle</p> + + +<script> +var t = async_test("Line joins are drawn at the corner of a closed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'miter'; +ctx.lineWidth = 200; +ctx.beginPath(); +ctx.moveTo(100, 50); +ctx.lineTo(100, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 50); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.closed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.closed.worker.js new file mode 100644 index 00000000000..195f5000268 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.closed.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.closed +// Description:Line joins are drawn at the corner of a closed rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Line joins are drawn at the corner of a closed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'miter'; +ctx.lineWidth = 200; +ctx.beginPath(); +ctx.moveTo(100, 50); +ctx.lineTo(100, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 50); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.invalid.html new file mode 100644 index 00000000000..e1533689519 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.invalid.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.invalid</h1> +<p class="desc">Setting lineJoin to invalid values is ignored</p> + + +<script> +var t = async_test("Setting lineJoin to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineJoin = 'bevel' +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'invalid'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'ROUND'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'round\0'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'round '; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = ""; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'butt'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.invalid.worker.js new file mode 100644 index 00000000000..1f3fb4ae9cc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.invalid.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.invalid +// Description:Setting lineJoin to invalid values is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting lineJoin to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineJoin = 'bevel' +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'invalid'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'ROUND'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'round\0'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'round '; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = ""; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'bevel'; +ctx.lineJoin = 'butt'; +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.miter.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.miter.html new file mode 100644 index 00000000000..9a463ed7c47 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.miter.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.miter</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.miter</h1> +<p class="desc">lineJoin 'miter' is rendered correctly</p> + + +<script> +var t = async_test("lineJoin 'miter' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'miter'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(10, 10, 30, 20); +ctx.fillRect(20, 10, 20, 30); +ctx.beginPath(); +ctx.moveTo(10, 20); +ctx.lineTo(30, 20); +ctx.lineTo(30, 40); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(60, 20); +ctx.lineTo(80, 20); +ctx.lineTo(80, 40); +ctx.stroke(); +ctx.fillRect(60, 10, 30, 20); +ctx.fillRect(70, 10, 20, 30); +_assertPixel(offscreenCanvas, 38,12, 0,255,0,255, "38,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,11, 0,255,0,255, "39,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 40,10, 0,255,0,255, "40,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 41,9, 0,255,0,255, "41,9", "0,255,0,255"); +_assertPixel(offscreenCanvas, 42,8, 0,255,0,255, "42,8", "0,255,0,255"); +_assertPixel(offscreenCanvas, 88,12, 0,255,0,255, "88,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 89,11, 0,255,0,255, "89,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,10, 0,255,0,255, "90,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 91,9, 0,255,0,255, "91,9", "0,255,0,255"); +_assertPixel(offscreenCanvas, 92,8, 0,255,0,255, "92,8", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.miter.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.miter.worker.js new file mode 100644 index 00000000000..2d432fca99a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.miter.worker.js @@ -0,0 +1,53 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.miter +// Description:lineJoin 'miter' is rendered correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineJoin 'miter' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'miter'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(10, 10, 30, 20); +ctx.fillRect(20, 10, 20, 30); +ctx.beginPath(); +ctx.moveTo(10, 20); +ctx.lineTo(30, 20); +ctx.lineTo(30, 40); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(60, 20); +ctx.lineTo(80, 20); +ctx.lineTo(80, 40); +ctx.stroke(); +ctx.fillRect(60, 10, 30, 20); +ctx.fillRect(70, 10, 20, 30); +_assertPixel(offscreenCanvas, 38,12, 0,255,0,255, "38,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,11, 0,255,0,255, "39,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 40,10, 0,255,0,255, "40,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 41,9, 0,255,0,255, "41,9", "0,255,0,255"); +_assertPixel(offscreenCanvas, 42,8, 0,255,0,255, "42,8", "0,255,0,255"); +_assertPixel(offscreenCanvas, 88,12, 0,255,0,255, "88,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 89,11, 0,255,0,255, "89,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,10, 0,255,0,255, "90,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 91,9, 0,255,0,255, "91,9", "0,255,0,255"); +_assertPixel(offscreenCanvas, 92,8, 0,255,0,255, "92,8", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.open.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.open.html new file mode 100644 index 00000000000..83b55b5116c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.open.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.open</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.open</h1> +<p class="desc">Line joins are not drawn at the corner of an unclosed rectangle</p> + + +<script> +var t = async_test("Line joins are not drawn at the corner of an unclosed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'miter'; +ctx.lineWidth = 200; +ctx.beginPath(); +ctx.moveTo(100, 50); +ctx.lineTo(100, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 50); +ctx.lineTo(100, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.open.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.open.worker.js new file mode 100644 index 00000000000..f8466311e2a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.open.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.open +// Description:Line joins are not drawn at the corner of an unclosed rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Line joins are not drawn at the corner of an unclosed rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineJoin = 'miter'; +ctx.lineWidth = 200; +ctx.beginPath(); +ctx.moveTo(100, 50); +ctx.lineTo(100, 1000); +ctx.lineTo(1000, 1000); +ctx.lineTo(1000, 50); +ctx.lineTo(100, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.parallel.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.parallel.html new file mode 100644 index 00000000000..52fa3981149 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.parallel.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.parallel</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.parallel</h1> +<p class="desc">Line joins are drawn at 180-degree joins</p> + + +<script> +var t = async_test("Line joins are drawn at 180-degree joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 300; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(-100, 25); +ctx.lineTo(0, 25); +ctx.lineTo(-100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.parallel.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.parallel.worker.js new file mode 100644 index 00000000000..e13b32d7561 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.parallel.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.parallel +// Description:Line joins are drawn at 180-degree joins +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Line joins are drawn at 180-degree joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 300; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(-100, 25); +ctx.lineTo(0, 25); +ctx.lineTo(-100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.round.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.round.html new file mode 100644 index 00000000000..26ce2d93802 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.round.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.round</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.round</h1> +<p class="desc">lineJoin 'round' is rendered correctly</p> + + +<script> +var t = async_test("lineJoin 'round' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.lineJoin = 'round'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(10, 10, 20, 20); +ctx.fillRect(20, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(30, 20); +ctx.arc(30, 20, 10-tol, 0, 2*Math.PI, true); +ctx.fill(); +ctx.beginPath(); +ctx.moveTo(10, 20); +ctx.lineTo(30, 20); +ctx.lineTo(30, 40); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(60, 20); +ctx.lineTo(80, 20); +ctx.lineTo(80, 40); +ctx.stroke(); +ctx.fillRect(60, 10, 20, 20); +ctx.fillRect(70, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(80, 20); +ctx.arc(80, 20, 10+tol, 0, 2*Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 36,14, 0,255,0,255, "36,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,13, 0,255,0,255, "36,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 37,13, 0,255,0,255, "37,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 38,13, 0,255,0,255, "38,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 38,12, 0,255,0,255, "38,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,14, 0,255,0,255, "86,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,13, 0,255,0,255, "86,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 87,13, 0,255,0,255, "87,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 88,13, 0,255,0,255, "88,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 88,12, 0,255,0,255, "88,12", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.round.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.round.worker.js new file mode 100644 index 00000000000..0c5166318ef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.round.worker.js @@ -0,0 +1,60 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.round +// Description:lineJoin 'round' is rendered correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineJoin 'round' is rendered correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var tol = 1; // tolerance to avoid antialiasing artifacts +ctx.lineJoin = 'round'; +ctx.lineWidth = 20; +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(10, 10, 20, 20); +ctx.fillRect(20, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(30, 20); +ctx.arc(30, 20, 10-tol, 0, 2*Math.PI, true); +ctx.fill(); +ctx.beginPath(); +ctx.moveTo(10, 20); +ctx.lineTo(30, 20); +ctx.lineTo(30, 40); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(60, 20); +ctx.lineTo(80, 20); +ctx.lineTo(80, 40); +ctx.stroke(); +ctx.fillRect(60, 10, 20, 20); +ctx.fillRect(70, 20, 20, 20); +ctx.beginPath(); +ctx.moveTo(80, 20); +ctx.arc(80, 20, 10+tol, 0, 2*Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 36,14, 0,255,0,255, "36,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,13, 0,255,0,255, "36,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 37,13, 0,255,0,255, "37,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 38,13, 0,255,0,255, "38,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 38,12, 0,255,0,255, "38,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,14, 0,255,0,255, "86,14", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,13, 0,255,0,255, "86,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 87,13, 0,255,0,255, "87,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 88,13, 0,255,0,255, "88,13", "0,255,0,255"); +_assertPixel(offscreenCanvas, 88,12, 0,255,0,255, "88,12", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.valid.html new file mode 100644 index 00000000000..16ce035178e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.valid.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.join.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.join.valid</h1> +<p class="desc">Setting lineJoin to valid values works</p> + + +<script> +var t = async_test("Setting lineJoin to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineJoin = 'bevel' +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'round'; +_assertSame(ctx.lineJoin, 'round', "ctx.lineJoin", "'round'"); +ctx.lineJoin = 'miter'; +_assertSame(ctx.lineJoin, 'miter', "ctx.lineJoin", "'miter'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.valid.worker.js new file mode 100644 index 00000000000..161803b8034 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.join.valid.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.join.valid +// Description:Setting lineJoin to valid values works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting lineJoin to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineJoin = 'bevel' +_assertSame(ctx.lineJoin, 'bevel', "ctx.lineJoin", "'bevel'"); +ctx.lineJoin = 'round'; +_assertSame(ctx.lineJoin, 'round', "ctx.lineJoin", "'round'"); +ctx.lineJoin = 'miter'; +_assertSame(ctx.lineJoin, 'miter', "ctx.lineJoin", "'miter'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.acute.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.acute.html new file mode 100644 index 00000000000..62de53227f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.acute.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.acute</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.acute</h1> +<p class="desc">Miter joins are drawn correctly with acute angles</p> + + +<script> +var t = async_test("Miter joins are drawn correctly with acute angles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#0f0'; +ctx.miterLimit = 2.614; +ctx.beginPath(); +ctx.moveTo(100, 1000); +ctx.lineTo(100, 100); +ctx.lineTo(1000, 1000); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 2.613; +ctx.beginPath(); +ctx.moveTo(100, 1000); +ctx.lineTo(100, 100); +ctx.lineTo(1000, 1000); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.acute.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.acute.worker.js new file mode 100644 index 00000000000..63f909e5652 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.acute.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.acute +// Description:Miter joins are drawn correctly with acute angles +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Miter joins are drawn correctly with acute angles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#0f0'; +ctx.miterLimit = 2.614; +ctx.beginPath(); +ctx.moveTo(100, 1000); +ctx.lineTo(100, 100); +ctx.lineTo(1000, 1000); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 2.613; +ctx.beginPath(); +ctx.moveTo(100, 1000); +ctx.lineTo(100, 100); +ctx.lineTo(1000, 1000); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.exceeded.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.exceeded.html new file mode 100644 index 00000000000..f15309b2d0d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.exceeded.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.exceeded</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.exceeded</h1> +<p class="desc">Miter joins are not drawn when the miter limit is exceeded</p> + + +<script> +var t = async_test("Miter joins are not drawn when the miter limit is exceeded"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.414; +ctx.beginPath(); +ctx.moveTo(200, 1000); +ctx.lineTo(200, 200); +ctx.lineTo(1000, 201); // slightly non-right-angle to avoid being a special case +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.exceeded.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.exceeded.worker.js new file mode 100644 index 00000000000..02b1653fdec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.exceeded.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.exceeded +// Description:Miter joins are not drawn when the miter limit is exceeded +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Miter joins are not drawn when the miter limit is exceeded"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.414; +ctx.beginPath(); +ctx.moveTo(200, 1000); +ctx.lineTo(200, 200); +ctx.lineTo(1000, 201); // slightly non-right-angle to avoid being a special case +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.invalid.html new file mode 100644 index 00000000000..e8d8863a9e7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.invalid.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.invalid</h1> +<p class="desc">Setting miterLimit to invalid values is ignored</p> + + +<script> +var t = async_test("Setting miterLimit to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.miterLimit = 1.5; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = 0; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = -1; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = Infinity; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = -Infinity; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = NaN; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.invalid.worker.js new file mode 100644 index 00000000000..1628f786d34 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.invalid.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.invalid +// Description:Setting miterLimit to invalid values is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting miterLimit to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.miterLimit = 1.5; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = 0; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = -1; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = Infinity; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = -Infinity; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = 1.5; +ctx.miterLimit = NaN; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.lineedge.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.lineedge.html new file mode 100644 index 00000000000..d6f8a607720 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.lineedge.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.lineedge</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.lineedge</h1> +<p class="desc">Miter joins are not drawn when the miter limit is exceeded at the corners of a zero-height rectangle</p> + + +<script> +var t = async_test("Miter joins are not drawn when the miter limit is exceeded at the corners of a zero-height rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.414; +ctx.beginPath(); +ctx.strokeRect(100, 25, 200, 0); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.lineedge.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.lineedge.worker.js new file mode 100644 index 00000000000..a0d1aaac76f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.lineedge.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.lineedge +// Description:Miter joins are not drawn when the miter limit is exceeded at the corners of a zero-height rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Miter joins are not drawn when the miter limit is exceeded at the corners of a zero-height rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.414; +ctx.beginPath(); +ctx.strokeRect(100, 25, 200, 0); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.obtuse.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.obtuse.html new file mode 100644 index 00000000000..2e87a873072 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.obtuse.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.obtuse</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.obtuse</h1> +<p class="desc">Miter joins are drawn correctly with obtuse angles</p> + + +<script> +var t = async_test("Miter joins are drawn correctly with obtuse angles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 1600; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#0f0'; +ctx.miterLimit = 1.083; +ctx.beginPath(); +ctx.moveTo(800, 10000); +ctx.lineTo(800, 300); +ctx.lineTo(10000, -8900); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.082; +ctx.beginPath(); +ctx.moveTo(800, 10000); +ctx.lineTo(800, 300); +ctx.lineTo(10000, -8900); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.obtuse.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.obtuse.worker.js new file mode 100644 index 00000000000..5796352c9b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.obtuse.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.obtuse +// Description:Miter joins are drawn correctly with obtuse angles +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Miter joins are drawn correctly with obtuse angles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 1600; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#0f0'; +ctx.miterLimit = 1.083; +ctx.beginPath(); +ctx.moveTo(800, 10000); +ctx.lineTo(800, 300); +ctx.lineTo(10000, -8900); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.082; +ctx.beginPath(); +ctx.moveTo(800, 10000); +ctx.lineTo(800, 300); +ctx.lineTo(10000, -8900); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.rightangle.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.rightangle.html new file mode 100644 index 00000000000..a7121f550dd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.rightangle.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.rightangle</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.rightangle</h1> +<p class="desc">Miter joins are not drawn when the miter limit is exceeded, on exact right angles</p> + + +<script> +var t = async_test("Miter joins are not drawn when the miter limit is exceeded, on exact right angles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.414; +ctx.beginPath(); +ctx.moveTo(200, 1000); +ctx.lineTo(200, 200); +ctx.lineTo(1000, 200); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.rightangle.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.rightangle.worker.js new file mode 100644 index 00000000000..717d7f2307d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.rightangle.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.rightangle +// Description:Miter joins are not drawn when the miter limit is exceeded, on exact right angles +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Miter joins are not drawn when the miter limit is exceeded, on exact right angles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#f00'; +ctx.miterLimit = 1.414; +ctx.beginPath(); +ctx.moveTo(200, 1000); +ctx.lineTo(200, 200); +ctx.lineTo(1000, 200); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.valid.html new file mode 100644 index 00000000000..8cd86b847aa --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.valid.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.valid</h1> +<p class="desc">Setting miterLimit to valid values works</p> + + +<script> +var t = async_test("Setting miterLimit to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.miterLimit = 1.5; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = "1e1"; +_assertSame(ctx.miterLimit, 10, "ctx.miterLimit", "10"); +ctx.miterLimit = 1/1024; +_assertSame(ctx.miterLimit, 1/1024, "ctx.miterLimit", "1/1024"); +ctx.miterLimit = 1000; +_assertSame(ctx.miterLimit, 1000, "ctx.miterLimit", "1000"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.valid.worker.js new file mode 100644 index 00000000000..60af1953be7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.valid.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.valid +// Description:Setting miterLimit to valid values works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting miterLimit to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.miterLimit = 1.5; +_assertSame(ctx.miterLimit, 1.5, "ctx.miterLimit", "1.5"); +ctx.miterLimit = "1e1"; +_assertSame(ctx.miterLimit, 10, "ctx.miterLimit", "10"); +ctx.miterLimit = 1/1024; +_assertSame(ctx.miterLimit, 1/1024, "ctx.miterLimit", "1/1024"); +ctx.miterLimit = 1000; +_assertSame(ctx.miterLimit, 1000, "ctx.miterLimit", "1000"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.within.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.within.html new file mode 100644 index 00000000000..12f10b268cb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.within.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.miter.within</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.miter.within</h1> +<p class="desc">Miter joins are drawn when the miter limit is not quite exceeded</p> + + +<script> +var t = async_test("Miter joins are drawn when the miter limit is not quite exceeded"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#0f0'; +ctx.miterLimit = 1.416; +ctx.beginPath(); +ctx.moveTo(200, 1000); +ctx.lineTo(200, 200); +ctx.lineTo(1000, 201); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.within.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.within.worker.js new file mode 100644 index 00000000000..c2e94635b6e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.miter.within.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.miter.within +// Description:Miter joins are drawn when the miter limit is not quite exceeded +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Miter joins are drawn when the miter limit is not quite exceeded"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.strokeStyle = '#0f0'; +ctx.miterLimit = 1.416; +ctx.beginPath(); +ctx.moveTo(200, 1000); +ctx.lineTo(200, 200); +ctx.lineTo(1000, 201); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.union.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.union.html new file mode 100644 index 00000000000..626a1a5852e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.union.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.union</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.union</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 24); +ctx.lineTo(100, 25); +ctx.lineTo(0, 26); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,1, 0,255,0,255, "25,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,1, 0,255,0,255, "25,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.union.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.union.worker.js new file mode 100644 index 00000000000..e2c66689b84 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.union.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.union +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 24); +ctx.lineTo(100, 25); +ctx.lineTo(0, 26); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,1, 0,255,0,255, "25,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,1, 0,255,0,255, "48,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,1, 0,255,0,255, "25,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.basic.html new file mode 100644 index 00000000000..1dd1bbf7bdd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.basic.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.width.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.width.basic</h1> +<p class="desc">lineWidth determines the width of line strokes</p> + + +<script> +var t = async_test("lineWidth determines the width of line strokes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 20; +// Draw a green line over a red box, to check the line is not too small +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 15, 20, 20); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +// Draw a green box over a red line, to check the line is not too large +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.fillRect(65, 15, 20, 20); +_assertPixel(offscreenCanvas, 14,25, 0,255,0,255, "14,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 15,25, 0,255,0,255, "15,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 16,25, 0,255,0,255, "16,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 34,25, 0,255,0,255, "34,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,25, 0,255,0,255, "36,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,25, 0,255,0,255, "64,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 66,25, 0,255,0,255, "66,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,25, 0,255,0,255, "84,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 85,25, 0,255,0,255, "85,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,25, 0,255,0,255, "86,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.basic.worker.js new file mode 100644 index 00000000000..e1e8a05d40e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.basic.worker.js @@ -0,0 +1,52 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.width.basic +// Description:lineWidth determines the width of line strokes +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineWidth determines the width of line strokes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 20; +// Draw a green line over a red box, to check the line is not too small +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 15, 20, 20); +ctx.beginPath(); +ctx.moveTo(25, 15); +ctx.lineTo(25, 35); +ctx.stroke(); +// Draw a green box over a red line, to check the line is not too large +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(75, 15); +ctx.lineTo(75, 35); +ctx.stroke(); +ctx.fillRect(65, 15, 20, 20); +_assertPixel(offscreenCanvas, 14,25, 0,255,0,255, "14,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 15,25, 0,255,0,255, "15,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 16,25, 0,255,0,255, "16,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 34,25, 0,255,0,255, "34,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,25, 0,255,0,255, "36,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,25, 0,255,0,255, "64,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 66,25, 0,255,0,255, "66,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,25, 0,255,0,255, "84,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 85,25, 0,255,0,255, "85,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,25, 0,255,0,255, "86,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.invalid.html new file mode 100644 index 00000000000..2f72c8d07ae --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.invalid.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.width.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.width.invalid</h1> +<p class="desc">Setting lineWidth to invalid values is ignored</p> + + +<script> +var t = async_test("Setting lineWidth to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineWidth = 1.5; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = 0; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = -1; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = Infinity; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = -Infinity; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = NaN; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.invalid.worker.js new file mode 100644 index 00000000000..2c3be82a8e2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.invalid.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.width.invalid +// Description:Setting lineWidth to invalid values is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting lineWidth to invalid values is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineWidth = 1.5; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = 0; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = -1; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = Infinity; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = -Infinity; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = 1.5; +ctx.lineWidth = NaN; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.scaledefault.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.scaledefault.html new file mode 100644 index 00000000000..bb4607ffc18 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.scaledefault.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.width.scaledefault</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.width.scaledefault</h1> +<p class="desc">Default lineWidth strokes are affected by scale transformations</p> + + +<script> +var t = async_test("Default lineWidth strokes are affected by scale transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(50, 50); +ctx.strokeStyle = '#0f0'; +ctx.moveTo(0, 0.5); +ctx.lineTo(2, 0.5); +ctx.stroke(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,5, 0,255,0,255, "50,5", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.scaledefault.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.scaledefault.worker.js new file mode 100644 index 00000000000..7fedaedae4c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.scaledefault.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.width.scaledefault +// Description:Default lineWidth strokes are affected by scale transformations +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Default lineWidth strokes are affected by scale transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(50, 50); +ctx.strokeStyle = '#0f0'; +ctx.moveTo(0, 0.5); +ctx.lineTo(2, 0.5); +ctx.stroke(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,5, 0,255,0,255, "50,5", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.transformed.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.transformed.html new file mode 100644 index 00000000000..72370f59266 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.transformed.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.width.transformed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.width.transformed</h1> +<p class="desc">Line stroke widths are affected by scale transformations</p> + + +<script> +var t = async_test("Line stroke widths are affected by scale transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 4; +// Draw a green line over a red box, to check the line is not too small +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 15, 20, 20); +ctx.save(); + ctx.scale(5, 1); + ctx.beginPath(); + ctx.moveTo(5, 15); + ctx.lineTo(5, 35); + ctx.stroke(); +ctx.restore(); +// Draw a green box over a red line, to check the line is not too large +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.save(); + ctx.scale(-5, 1); + ctx.beginPath(); + ctx.moveTo(-15, 15); + ctx.lineTo(-15, 35); + ctx.stroke(); +ctx.restore(); +ctx.fillRect(65, 15, 20, 20); +_assertPixel(offscreenCanvas, 14,25, 0,255,0,255, "14,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 15,25, 0,255,0,255, "15,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 16,25, 0,255,0,255, "16,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 34,25, 0,255,0,255, "34,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,25, 0,255,0,255, "36,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,25, 0,255,0,255, "64,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 66,25, 0,255,0,255, "66,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,25, 0,255,0,255, "84,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 85,25, 0,255,0,255, "85,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,25, 0,255,0,255, "86,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.transformed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.transformed.worker.js new file mode 100644 index 00000000000..7bd4efbadff --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.transformed.worker.js @@ -0,0 +1,58 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.width.transformed +// Description:Line stroke widths are affected by scale transformations +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Line stroke widths are affected by scale transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 4; +// Draw a green line over a red box, to check the line is not too small +ctx.fillStyle = '#f00'; +ctx.strokeStyle = '#0f0'; +ctx.fillRect(15, 15, 20, 20); +ctx.save(); + ctx.scale(5, 1); + ctx.beginPath(); + ctx.moveTo(5, 15); + ctx.lineTo(5, 35); + ctx.stroke(); +ctx.restore(); +// Draw a green box over a red line, to check the line is not too large +ctx.fillStyle = '#0f0'; +ctx.strokeStyle = '#f00'; +ctx.save(); + ctx.scale(-5, 1); + ctx.beginPath(); + ctx.moveTo(-15, 15); + ctx.lineTo(-15, 35); + ctx.stroke(); +ctx.restore(); +ctx.fillRect(65, 15, 20, 20); +_assertPixel(offscreenCanvas, 14,25, 0,255,0,255, "14,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 15,25, 0,255,0,255, "15,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 16,25, 0,255,0,255, "16,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 34,25, 0,255,0,255, "34,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 36,25, 0,255,0,255, "36,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,25, 0,255,0,255, "64,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 66,25, 0,255,0,255, "66,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 84,25, 0,255,0,255, "84,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 85,25, 0,255,0,255, "85,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 86,25, 0,255,0,255, "86,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.valid.html new file mode 100644 index 00000000000..6cfb199bc5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.valid.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.line.width.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.line.width.valid</h1> +<p class="desc">Setting lineWidth to valid values works</p> + + +<script> +var t = async_test("Setting lineWidth to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineWidth = 1.5; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = "1e1"; +_assertSame(ctx.lineWidth, 10, "ctx.lineWidth", "10"); +ctx.lineWidth = 1/1024; +_assertSame(ctx.lineWidth, 1/1024, "ctx.lineWidth", "1/1024"); +ctx.lineWidth = 1000; +_assertSame(ctx.lineWidth, 1000, "ctx.lineWidth", "1000"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.valid.worker.js new file mode 100644 index 00000000000..8e7498ff25f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/line-styles/2d.line.width.valid.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.line.width.valid +// Description:Setting lineWidth to valid values works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting lineWidth to valid values works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineWidth = 1.5; +_assertSame(ctx.lineWidth, 1.5, "ctx.lineWidth", "1.5"); +ctx.lineWidth = "1e1"; +_assertSame(ctx.lineWidth, 10, "ctx.lineWidth", "10"); +ctx.lineWidth = 1/1024; +_assertSame(ctx.lineWidth, 1/1024, "ctx.lineWidth", "1/1024"); +ctx.lineWidth = 1000; +_assertSame(ctx.lineWidth, 1000, "ctx.lineWidth", "1000"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.1.html new file mode 100644 index 00000000000..1a4cfe9cc66 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.angle.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.angle.1</h1> +<p class="desc">arc() draws pi/2 .. -pi anticlockwise correctly</p> + + +<script> +var t = async_test("arc() draws pi/2 .. -pi anticlockwise correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, Math.PI/2, -Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.1.worker.js new file mode 100644 index 00000000000..18536c988eb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.angle.1 +// Description:arc() draws pi/2 .. -pi anticlockwise correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws pi/2 .. -pi anticlockwise correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, Math.PI/2, -Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.2.html new file mode 100644 index 00000000000..ac1a5a66296 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.angle.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.angle.2</h1> +<p class="desc">arc() draws -3pi/2 .. -pi anticlockwise correctly</p> + + +<script> +var t = async_test("arc() draws -3pi/2 .. -pi anticlockwise correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, -3*Math.PI/2, -Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.2.worker.js new file mode 100644 index 00000000000..7a7def978a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.angle.2 +// Description:arc() draws -3pi/2 .. -pi anticlockwise correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws -3pi/2 .. -pi anticlockwise correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, -3*Math.PI/2, -Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.3.html new file mode 100644 index 00000000000..06840240780 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.3.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.angle.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.angle.3</h1> +<p class="desc">arc() wraps angles mod 2pi when anticlockwise and end > start+2pi</p> + + +<script> +var t = async_test("arc() wraps angles mod 2pi when anticlockwise and end > start+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, (512+1/2)*Math.PI, (1024-1)*Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.3.worker.js new file mode 100644 index 00000000000..4c4bfa8992c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.3.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.angle.3 +// Description:arc() wraps angles mod 2pi when anticlockwise and end > start+2pi +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() wraps angles mod 2pi when anticlockwise and end > start+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, (512+1/2)*Math.PI, (1024-1)*Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.4.html new file mode 100644 index 00000000000..f47669ccf9f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.4.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.angle.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.angle.4</h1> +<p class="desc">arc() draws a full circle when clockwise and end > start+2pi</p> + + +<script> +var t = async_test("arc() draws a full circle when clockwise and end > start+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arc(50, 25, 60, (512+1/2)*Math.PI, (1024-1)*Math.PI, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.4.worker.js new file mode 100644 index 00000000000..675808c9735 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.4.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.angle.4 +// Description:arc() draws a full circle when clockwise and end > start+2pi +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws a full circle when clockwise and end > start+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arc(50, 25, 60, (512+1/2)*Math.PI, (1024-1)*Math.PI, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.5.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.5.html new file mode 100644 index 00000000000..9020ff19e8c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.5.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.angle.5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.angle.5</h1> +<p class="desc">arc() wraps angles mod 2pi when clockwise and start > end+2pi</p> + + +<script> +var t = async_test("arc() wraps angles mod 2pi when clockwise and start > end+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, (1024-1)*Math.PI, (512+1/2)*Math.PI, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.5.worker.js new file mode 100644 index 00000000000..ba5c52198c9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.5.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.angle.5 +// Description:arc() wraps angles mod 2pi when clockwise and start > end+2pi +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() wraps angles mod 2pi when clockwise and start > end+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, (1024-1)*Math.PI, (512+1/2)*Math.PI, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.6.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.6.html new file mode 100644 index 00000000000..9a9d9dd5cbc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.6.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.angle.6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.angle.6</h1> +<p class="desc">arc() draws a full circle when anticlockwise and start > end+2pi</p> + + +<script> +var t = async_test("arc() draws a full circle when anticlockwise and start > end+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arc(50, 25, 60, (1024-1)*Math.PI, (512+1/2)*Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.6.worker.js new file mode 100644 index 00000000000..7201b69dba1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.angle.6.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.angle.6 +// Description:arc() draws a full circle when anticlockwise and start > end+2pi +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws a full circle when anticlockwise and start > end+2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arc(50, 25, 60, (1024-1)*Math.PI, (512+1/2)*Math.PI, true); +ctx.fill(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.default.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.default.html new file mode 100644 index 00000000000..077fe888373 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.default.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.default</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.default</h1> +<p class="desc">arc() with missing last argument defaults to clockwise</p> + + +<script> +var t = async_test("arc() with missing last argument defaults to clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, -Math.PI, Math.PI/2); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.default.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.default.worker.js new file mode 100644 index 00000000000..f6db49f0d2d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.default.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.default +// Description:arc() with missing last argument defaults to clockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with missing last argument defaults to clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 0); +ctx.arc(100, 0, 150, -Math.PI, Math.PI/2); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.empty.html new file mode 100644 index 00000000000..ec669b049e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.empty.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.empty</h1> +<p class="desc">arc() with an empty path does not draw a straight line to the start point</p> + + +<script> +var t = async_test("arc() with an empty path does not draw a straight line to the start point"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(200, 25, 5, 0, 2*Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.empty.worker.js new file mode 100644 index 00000000000..f78e4a92a3a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.empty.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.empty +// Description:arc() with an empty path does not draw a straight line to the start point +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with an empty path does not draw a straight line to the start point"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(200, 25, 5, 0, 2*Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.end.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.end.html new file mode 100644 index 00000000000..649c3043696 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.end.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.end</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.end</h1> +<p class="desc">arc() adds the end point of the arc to the subpath</p> + + +<script> +var t = async_test("arc() adds the end point of the arc to the subpath"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(-100, 0); +ctx.arc(-100, 0, 25, -Math.PI/2, Math.PI/2, true); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.end.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.end.worker.js new file mode 100644 index 00000000000..3782a6d82cf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.end.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.end +// Description:arc() adds the end point of the arc to the subpath +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() adds the end point of the arc to the subpath"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(-100, 0); +ctx.arc(-100, 0, 25, -Math.PI/2, Math.PI/2, true); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.negative.html new file mode 100644 index 00000000000..c46d56ce819 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.negative.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.negative</h1> +<p class="desc">arc() with negative radius throws INDEX_SIZE_ERR</p> + + +<script> +var t = async_test("arc() with negative radius throws INDEX_SIZE_ERR"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.arc(0, 0, -1, 0, 0, true); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.negative.worker.js new file mode 100644 index 00000000000..e389aafbf86 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.negative.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.negative +// Description:arc() with negative radius throws INDEX_SIZE_ERR +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with negative radius throws INDEX_SIZE_ERR"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.arc(0, 0, -1, 0, 0, true); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonempty.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonempty.html new file mode 100644 index 00000000000..75c70da4265 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonempty.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.nonempty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.nonempty</h1> +<p class="desc">arc() with a non-empty path does draw a straight line to the start point</p> + + +<script> +var t = async_test("arc() with a non-empty path does draw a straight line to the start point"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arc(200, 25, 5, 0, 2*Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonempty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonempty.worker.js new file mode 100644 index 00000000000..4446654dacc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonempty.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.nonempty +// Description:arc() with a non-empty path does draw a straight line to the start point +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with a non-empty path does draw a straight line to the start point"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arc(200, 25, 5, 0, 2*Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonfinite.html new file mode 100644 index 00000000000..e6743e41fc6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonfinite.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.nonfinite</h1> +<p class="desc">arc() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("arc() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.arc(Infinity, 0, 50, 0, 2*Math.PI, true); +ctx.arc(-Infinity, 0, 50, 0, 2*Math.PI, true); +ctx.arc(NaN, 0, 50, 0, 2*Math.PI, true); +ctx.arc(0, Infinity, 50, 0, 2*Math.PI, true); +ctx.arc(0, -Infinity, 50, 0, 2*Math.PI, true); +ctx.arc(0, NaN, 50, 0, 2*Math.PI, true); +ctx.arc(0, 0, Infinity, 0, 2*Math.PI, true); +ctx.arc(0, 0, -Infinity, 0, 2*Math.PI, true); +ctx.arc(0, 0, NaN, 0, 2*Math.PI, true); +ctx.arc(0, 0, 50, Infinity, 2*Math.PI, true); +ctx.arc(0, 0, 50, -Infinity, 2*Math.PI, true); +ctx.arc(0, 0, 50, NaN, 2*Math.PI, true); +ctx.arc(0, 0, 50, 0, Infinity, true); +ctx.arc(0, 0, 50, 0, -Infinity, true); +ctx.arc(0, 0, 50, 0, NaN, true); +ctx.arc(Infinity, Infinity, 50, 0, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, Infinity, 0, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, Infinity, Infinity, Infinity, true); +ctx.arc(Infinity, Infinity, Infinity, 0, Infinity, true); +ctx.arc(Infinity, Infinity, 50, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, 50, Infinity, Infinity, true); +ctx.arc(Infinity, Infinity, 50, 0, Infinity, true); +ctx.arc(Infinity, 0, Infinity, 0, 2*Math.PI, true); +ctx.arc(Infinity, 0, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, 0, Infinity, Infinity, Infinity, true); +ctx.arc(Infinity, 0, Infinity, 0, Infinity, true); +ctx.arc(Infinity, 0, 50, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, 0, 50, Infinity, Infinity, true); +ctx.arc(Infinity, 0, 50, 0, Infinity, true); +ctx.arc(0, Infinity, Infinity, 0, 2*Math.PI, true); +ctx.arc(0, Infinity, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(0, Infinity, Infinity, Infinity, Infinity, true); +ctx.arc(0, Infinity, Infinity, 0, Infinity, true); +ctx.arc(0, Infinity, 50, Infinity, 2*Math.PI, true); +ctx.arc(0, Infinity, 50, Infinity, Infinity, true); +ctx.arc(0, Infinity, 50, 0, Infinity, true); +ctx.arc(0, 0, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(0, 0, Infinity, Infinity, Infinity, true); +ctx.arc(0, 0, Infinity, 0, Infinity, true); +ctx.arc(0, 0, 50, Infinity, Infinity, true); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonfinite.worker.js new file mode 100644 index 00000000000..6a81cfec503 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.nonfinite.worker.js @@ -0,0 +1,70 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.nonfinite +// Description:arc() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.arc(Infinity, 0, 50, 0, 2*Math.PI, true); +ctx.arc(-Infinity, 0, 50, 0, 2*Math.PI, true); +ctx.arc(NaN, 0, 50, 0, 2*Math.PI, true); +ctx.arc(0, Infinity, 50, 0, 2*Math.PI, true); +ctx.arc(0, -Infinity, 50, 0, 2*Math.PI, true); +ctx.arc(0, NaN, 50, 0, 2*Math.PI, true); +ctx.arc(0, 0, Infinity, 0, 2*Math.PI, true); +ctx.arc(0, 0, -Infinity, 0, 2*Math.PI, true); +ctx.arc(0, 0, NaN, 0, 2*Math.PI, true); +ctx.arc(0, 0, 50, Infinity, 2*Math.PI, true); +ctx.arc(0, 0, 50, -Infinity, 2*Math.PI, true); +ctx.arc(0, 0, 50, NaN, 2*Math.PI, true); +ctx.arc(0, 0, 50, 0, Infinity, true); +ctx.arc(0, 0, 50, 0, -Infinity, true); +ctx.arc(0, 0, 50, 0, NaN, true); +ctx.arc(Infinity, Infinity, 50, 0, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, Infinity, 0, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, Infinity, Infinity, Infinity, true); +ctx.arc(Infinity, Infinity, Infinity, 0, Infinity, true); +ctx.arc(Infinity, Infinity, 50, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, Infinity, 50, Infinity, Infinity, true); +ctx.arc(Infinity, Infinity, 50, 0, Infinity, true); +ctx.arc(Infinity, 0, Infinity, 0, 2*Math.PI, true); +ctx.arc(Infinity, 0, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, 0, Infinity, Infinity, Infinity, true); +ctx.arc(Infinity, 0, Infinity, 0, Infinity, true); +ctx.arc(Infinity, 0, 50, Infinity, 2*Math.PI, true); +ctx.arc(Infinity, 0, 50, Infinity, Infinity, true); +ctx.arc(Infinity, 0, 50, 0, Infinity, true); +ctx.arc(0, Infinity, Infinity, 0, 2*Math.PI, true); +ctx.arc(0, Infinity, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(0, Infinity, Infinity, Infinity, Infinity, true); +ctx.arc(0, Infinity, Infinity, 0, Infinity, true); +ctx.arc(0, Infinity, 50, Infinity, 2*Math.PI, true); +ctx.arc(0, Infinity, 50, Infinity, Infinity, true); +ctx.arc(0, Infinity, 50, 0, Infinity, true); +ctx.arc(0, 0, Infinity, Infinity, 2*Math.PI, true); +ctx.arc(0, 0, Infinity, Infinity, Infinity, true); +ctx.arc(0, 0, Infinity, 0, Infinity, true); +ctx.arc(0, 0, 50, Infinity, Infinity, true); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.1.html new file mode 100644 index 00000000000..d6dd79309dd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.1.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.scale.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.scale.1</h1> +<p class="desc">Non-uniformly scaled arcs are the right shape</p> + + +<script> +var t = async_test("Non-uniformly scaled arcs are the right shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(2, 0.5); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(25, 50, 56, 0, 2*Math.PI, false); +ctx.fill(); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(-25, 50); +ctx.arc(-25, 50, 24, 0, 2*Math.PI, false); +ctx.moveTo(75, 50); +ctx.arc(75, 50, 24, 0, 2*Math.PI, false); +ctx.moveTo(25, -25); +ctx.arc(25, -25, 24, 0, 2*Math.PI, false); +ctx.moveTo(25, 125); +ctx.arc(25, 125, 24, 0, 2*Math.PI, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.1.worker.js new file mode 100644 index 00000000000..f35ba459afd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.1.worker.js @@ -0,0 +1,46 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.scale.1 +// Description:Non-uniformly scaled arcs are the right shape +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Non-uniformly scaled arcs are the right shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(2, 0.5); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(25, 50, 56, 0, 2*Math.PI, false); +ctx.fill(); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(-25, 50); +ctx.arc(-25, 50, 24, 0, 2*Math.PI, false); +ctx.moveTo(75, 50); +ctx.arc(75, 50, 24, 0, 2*Math.PI, false); +ctx.moveTo(25, -25); +ctx.arc(25, -25, 24, 0, 2*Math.PI, false); +ctx.moveTo(25, 125); +ctx.arc(25, 125, 24, 0, 2*Math.PI, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.2.html new file mode 100644 index 00000000000..c3dfddef12c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.2.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.scale.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.scale.2</h1> +<p class="desc">Highly scaled arcs are the right shape</p> + + +<script> +var t = async_test("Highly scaled arcs are the right shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(100, 100); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 1.2; +ctx.beginPath(); +ctx.arc(0, 0, 0.6, 0, Math.PI/2, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.2.worker.js new file mode 100644 index 00000000000..4ace0218af7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.scale.2.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.scale.2 +// Description:Highly scaled arcs are the right shape +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Highly scaled arcs are the right shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(100, 100); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 1.2; +ctx.beginPath(); +ctx.arc(0, 0, 0.6, 0, Math.PI/2, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.html new file mode 100644 index 00000000000..fbab5d11f20 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.selfintersect.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.selfintersect.1</h1> +<p class="desc">arc() with lineWidth > 2*radius is drawn sensibly</p> + + +<script> +var t = async_test("arc() with lineWidth > 2*radius is drawn sensibly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(100, 50, 25, 0, -Math.PI/2, true); +ctx.stroke(); +ctx.beginPath(); +ctx.arc(0, 0, 25, 0, -Math.PI/2, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.worker.js new file mode 100644 index 00000000000..31483542356 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.1.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.selfintersect.1 +// Description:arc() with lineWidth > 2*radius is drawn sensibly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with lineWidth > 2*radius is drawn sensibly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(100, 50, 25, 0, -Math.PI/2, true); +ctx.stroke(); +ctx.beginPath(); +ctx.arc(0, 0, 25, 0, -Math.PI/2, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.html new file mode 100644 index 00000000000..e96b8f2bc8b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.selfintersect.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.selfintersect.2</h1> +<p class="desc">arc() with lineWidth > 2*radius is drawn sensibly</p> + + +<script> +var t = async_test("arc() with lineWidth > 2*radius is drawn sensibly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 180; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(-50, 50, 25, 0, -Math.PI/2, true); +ctx.stroke(); +ctx.beginPath(); +ctx.arc(100, 0, 25, 0, -Math.PI/2, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,10, 0,255,0,255, "90,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 97,1, 0,255,0,255, "97,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 97,2, 0,255,0,255, "97,2", "0,255,0,255"); +_assertPixel(offscreenCanvas, 97,3, 0,255,0,255, "97,3", "0,255,0,255"); +_assertPixel(offscreenCanvas, 2,48, 0,255,0,255, "2,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.worker.js new file mode 100644 index 00000000000..bf29cd12ddc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.selfintersect.2.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.selfintersect.2 +// Description:arc() with lineWidth > 2*radius is drawn sensibly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with lineWidth > 2*radius is drawn sensibly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 180; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(-50, 50, 25, 0, -Math.PI/2, true); +ctx.stroke(); +ctx.beginPath(); +ctx.arc(100, 0, 25, 0, -Math.PI/2, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,10, 0,255,0,255, "90,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 97,1, 0,255,0,255, "97,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 97,2, 0,255,0,255, "97,2", "0,255,0,255"); +_assertPixel(offscreenCanvas, 97,3, 0,255,0,255, "97,3", "0,255,0,255"); +_assertPixel(offscreenCanvas, 2,48, 0,255,0,255, "2,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.1.html new file mode 100644 index 00000000000..8be62a1dba0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.1.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.shape.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.shape.1</h1> +<p class="desc">arc() from 0 to pi does not draw anything in the wrong half</p> + + +<script> +var t = async_test("arc() from 0 to pi does not draw anything in the wrong half"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(50, 50, 50, 0, Math.PI, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,48, 0,255,0,255, "20,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.1.worker.js new file mode 100644 index 00000000000..3be6bc6fd45 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.1.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.shape.1 +// Description:arc() from 0 to pi does not draw anything in the wrong half +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() from 0 to pi does not draw anything in the wrong half"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(50, 50, 50, 0, Math.PI, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,48, 0,255,0,255, "20,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.2.html new file mode 100644 index 00000000000..d9b53d9db77 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.2.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.shape.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.shape.2</h1> +<p class="desc">arc() from 0 to pi draws stuff in the right half</p> + + +<script> +var t = async_test("arc() from 0 to pi draws stuff in the right half"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 100; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(50, 50, 50, 0, Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,48, 0,255,0,255, "20,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.2.worker.js new file mode 100644 index 00000000000..98e7b1ddc5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.2.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.shape.2 +// Description:arc() from 0 to pi draws stuff in the right half +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() from 0 to pi draws stuff in the right half"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 100; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(50, 50, 50, 0, Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 20,48, 0,255,0,255, "20,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.3.html new file mode 100644 index 00000000000..03b44d772ac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.3.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.shape.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.shape.3</h1> +<p class="desc">arc() from 0 to -pi/2 does not draw anything in the wrong quadrant</p> + + +<script> +var t = async_test("arc() from 0 to -pi/2 does not draw anything in the wrong quadrant"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 100; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(0, 50, 50, 0, -Math.PI/2, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.3.worker.js new file mode 100644 index 00000000000..1f09f586aee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.3.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.shape.3 +// Description:arc() from 0 to -pi/2 does not draw anything in the wrong quadrant +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() from 0 to -pi/2 does not draw anything in the wrong quadrant"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 100; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(0, 50, 50, 0, -Math.PI/2, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.4.html new file mode 100644 index 00000000000..68767de525f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.4.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.shape.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.shape.4</h1> +<p class="desc">arc() from 0 to -pi/2 draws stuff in the right quadrant</p> + + +<script> +var t = async_test("arc() from 0 to -pi/2 draws stuff in the right quadrant"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 150; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(-50, 50, 100, 0, -Math.PI/2, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.4.worker.js new file mode 100644 index 00000000000..d299c5b675c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.4.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.shape.4 +// Description:arc() from 0 to -pi/2 draws stuff in the right quadrant +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() from 0 to -pi/2 draws stuff in the right quadrant"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 150; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arc(-50, 50, 100, 0, -Math.PI/2, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.5.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.5.html new file mode 100644 index 00000000000..e6a2aadbc82 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.5.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.shape.5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.shape.5</h1> +<p class="desc">arc() from 0 to 5pi does not draw crazy things</p> + + +<script> +var t = async_test("arc() from 0 to 5pi does not draw crazy things"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(300, 0, 100, 0, 5*Math.PI, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.5.worker.js new file mode 100644 index 00000000000..21a0ca3c77d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.shape.5.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.shape.5 +// Description:arc() from 0 to 5pi does not draw crazy things +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() from 0 to 5pi does not draw crazy things"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 200; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arc(300, 0, 100, 0, 5*Math.PI, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.1.html new file mode 100644 index 00000000000..5595e3284a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.twopie.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.twopie.1</h1> +<p class="desc">arc() draws nothing when end = start + 2pi-e and anticlockwise</p> + + +<script> +var t = async_test("arc() draws nothing when end = start + 2pi-e and anticlockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI - 1e-4, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.1.worker.js new file mode 100644 index 00000000000..552557154a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.twopie.1 +// Description:arc() draws nothing when end = start + 2pi-e and anticlockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws nothing when end = start + 2pi-e and anticlockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI - 1e-4, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.2.html new file mode 100644 index 00000000000..4ea42b2d3ec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.twopie.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.twopie.2</h1> +<p class="desc">arc() draws a full circle when end = start + 2pi-e and clockwise</p> + + +<script> +var t = async_test("arc() draws a full circle when end = start + 2pi-e and clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI - 1e-4, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.2.worker.js new file mode 100644 index 00000000000..d9f41d85da8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.twopie.2 +// Description:arc() draws a full circle when end = start + 2pi-e and clockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws a full circle when end = start + 2pi-e and clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI - 1e-4, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.3.html new file mode 100644 index 00000000000..01bae074db8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.3.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.twopie.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.twopie.3</h1> +<p class="desc">arc() draws a full circle when end = start + 2pi+e and anticlockwise</p> + + +<script> +var t = async_test("arc() draws a full circle when end = start + 2pi+e and anticlockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI + 1e-4, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.3.worker.js new file mode 100644 index 00000000000..41c400e7f13 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.3.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.twopie.3 +// Description:arc() draws a full circle when end = start + 2pi+e and anticlockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws a full circle when end = start + 2pi+e and anticlockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI + 1e-4, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.4.html new file mode 100644 index 00000000000..9906377045a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.4.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.twopie.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.twopie.4</h1> +<p class="desc">arc() draws nothing when end = start + 2pi+e and clockwise</p> + + +<script> +var t = async_test("arc() draws nothing when end = start + 2pi+e and clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI + 1e-4, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.4.worker.js new file mode 100644 index 00000000000..241071fd835 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.twopie.4.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.twopie.4 +// Description:arc() draws nothing when end = start + 2pi+e and clockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws nothing when end = start + 2pi+e and clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 2*Math.PI + 1e-4, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.1.html new file mode 100644 index 00000000000..60b73e041fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.zero.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.zero.1</h1> +<p class="desc">arc() draws nothing when startAngle = endAngle and anticlockwise</p> + + +<script> +var t = async_test("arc() draws nothing when startAngle = endAngle and anticlockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 0, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.1.worker.js new file mode 100644 index 00000000000..91f15d4e956 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.zero.1 +// Description:arc() draws nothing when startAngle = endAngle and anticlockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws nothing when startAngle = endAngle and anticlockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 0, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.2.html new file mode 100644 index 00000000000..306e5312807 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.zero.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.zero.2</h1> +<p class="desc">arc() draws nothing when startAngle = endAngle and clockwise</p> + + +<script> +var t = async_test("arc() draws nothing when startAngle = endAngle and clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 0, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.2.worker.js new file mode 100644 index 00000000000..4238b7dac86 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zero.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.zero.2 +// Description:arc() draws nothing when startAngle = endAngle and clockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() draws nothing when startAngle = endAngle and clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.arc(50, 25, 50, 0, 0, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,20, 0,255,0,255, "50,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zeroradius.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zeroradius.html new file mode 100644 index 00000000000..ed77c3b7a86 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zeroradius.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arc.zeroradius</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arc.zeroradius</h1> +<p class="desc">arc() with zero radius draws a line to the start point</p> + + +<script> +var t = async_test("arc() with zero radius draws a line to the start point"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00' +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arc(200, 25, 0, 0, Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zeroradius.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zeroradius.worker.js new file mode 100644 index 00000000000..fb12a8f438c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arc.zeroradius.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arc.zeroradius +// Description:arc() with zero radius draws a line to the start point +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arc() with zero radius draws a line to the start point"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00' +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arc(200, 25, 0, 0, Math.PI, true); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.html new file mode 100644 index 00000000000..1f73025683b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.coincide.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.coincide.1</h1> +<p class="desc">arcTo() has no effect if P0 = P1</p> + + +<script> +var t = async_test("arcTo() has no effect if P0 = P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(0, 25, 50, 1000, 1); +ctx.lineTo(100, 25); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arcTo(50, 25, 100, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.worker.js new file mode 100644 index 00000000000..a646c364019 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.1.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.coincide.1 +// Description:arcTo() has no effect if P0 = P1 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() has no effect if P0 = P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(0, 25, 50, 1000, 1); +ctx.lineTo(100, 25); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arcTo(50, 25, 100, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,1, 0,255,0,255, "50,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,48, 0,255,0,255, "50,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.html new file mode 100644 index 00000000000..d77d5de62ba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.coincide.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.coincide.2</h1> +<p class="desc">arcTo() draws a straight line to P1 if P1 = P2</p> + + +<script> +var t = async_test("arcTo() draws a straight line to P1 if P1 = P2"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 100, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.worker.js new file mode 100644 index 00000000000..5459619f342 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.coincide.2.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.coincide.2 +// Description:arcTo() draws a straight line to P1 if P1 = P2 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() draws a straight line to P1 if P1 = P2"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 100, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.html new file mode 100644 index 00000000000..e1cd1495eca --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.collinear.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.collinear.1</h1> +<p class="desc">arcTo() with all points on a line, and P1 between P0/P2, draws a straight line to P1</p> + + +<script> +var t = async_test("arcTo() with all points on a line, and P1 between P0/P2, draws a straight line to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 200, 25, 1); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(-100, 25); +ctx.arcTo(0, 25, 100, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.worker.js new file mode 100644 index 00000000000..580cac8dbf1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.1.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.collinear.1 +// Description:arcTo() with all points on a line, and P1 between P0/P2, draws a straight line to P1 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with all points on a line, and P1 between P0/P2, draws a straight line to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 200, 25, 1); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(-100, 25); +ctx.arcTo(0, 25, 100, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.html new file mode 100644 index 00000000000..1287b57ff89 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.collinear.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.collinear.2</h1> +<p class="desc">arcTo() with all points on a line, and P2 between P0/P1, draws a straight line to P1</p> + + +<script> +var t = async_test("arcTo() with all points on a line, and P2 between P0/P1, draws a straight line to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 10, 25, 1); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 25); +ctx.arcTo(200, 25, 110, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.worker.js new file mode 100644 index 00000000000..ceeae492e0a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.2.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.collinear.2 +// Description:arcTo() with all points on a line, and P2 between P0/P1, draws a straight line to P1 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with all points on a line, and P2 between P0/P1, draws a straight line to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 10, 25, 1); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 25); +ctx.arcTo(200, 25, 110, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.html new file mode 100644 index 00000000000..0c56e4dbade --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.collinear.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.collinear.3</h1> +<p class="desc">arcTo() with all points on a line, and P0 between P1/P2, draws a straight line to P1</p> + + +<script> +var t = async_test("arcTo() with all points on a line, and P0 between P1/P2, draws a straight line to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, -100, 25, 1); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 25); +ctx.arcTo(200, 25, 0, 25, 1); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(-100, 25); +ctx.arcTo(0, 25, -200, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.worker.js new file mode 100644 index 00000000000..536bd0d8363 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.collinear.3.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.collinear.3 +// Description:arcTo() with all points on a line, and P0 between P1/P2, draws a straight line to P1 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with all points on a line, and P0 between P1/P2, draws a straight line to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, -100, 25, 1); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 25); +ctx.arcTo(200, 25, 0, 25, 1); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(-100, 25); +ctx.arcTo(0, 25, -200, 25, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.html new file mode 100644 index 00000000000..8b54906377c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.ensuresubpath.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.ensuresubpath.1</h1> +<p class="desc">If there is no subpath, the first control point is added (and nothing is drawn up to it)</p> + + +<script> +var t = async_test("If there is no subpath, the first control point is added (and nothing is drawn up to it)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arcTo(100, 50, 200, 50, 0.1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.worker.js new file mode 100644 index 00000000000..cefcf11e8d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.ensuresubpath.1 +// Description:If there is no subpath, the first control point is added (and nothing is drawn up to it) +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the first control point is added (and nothing is drawn up to it)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.arcTo(100, 50, 200, 50, 0.1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.html new file mode 100644 index 00000000000..8056389a311 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.ensuresubpath.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.ensuresubpath.2</h1> +<p class="desc">If there is no subpath, the first control point is added</p> + + +<script> +var t = async_test("If there is no subpath, the first control point is added"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arcTo(0, 25, 50, 250, 0.1); // adds (x1,y1), draws nothing +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.worker.js new file mode 100644 index 00000000000..d6ab04e1d39 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.ensuresubpath.2.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.ensuresubpath.2 +// Description:If there is no subpath, the first control point is added +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the first control point is added"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.arcTo(0, 25, 50, 250, 0.1); // adds (x1,y1), draws nothing +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.negative.html new file mode 100644 index 00000000000..d258d0bd659 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.negative.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.negative</h1> +<p class="desc">arcTo() with negative radius throws an exception</p> + + +<script> +var t = async_test("arcTo() with negative radius throws an exception"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.arcTo(0, 0, 0, 0, -1); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.negative.worker.js new file mode 100644 index 00000000000..b95f4c5165a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.negative.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.negative +// Description:arcTo() with negative radius throws an exception +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with negative radius throws an exception"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.arcTo(0, 0, 0, 0, -1); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.html new file mode 100644 index 00000000000..2226f57139b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.nonfinite</h1> +<p class="desc">arcTo() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("arcTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.arcTo(Infinity, 50, 0, 50, 0); +ctx.arcTo(-Infinity, 50, 0, 50, 0); +ctx.arcTo(NaN, 50, 0, 50, 0); +ctx.arcTo(0, Infinity, 0, 50, 0); +ctx.arcTo(0, -Infinity, 0, 50, 0); +ctx.arcTo(0, NaN, 0, 50, 0); +ctx.arcTo(0, 50, Infinity, 50, 0); +ctx.arcTo(0, 50, -Infinity, 50, 0); +ctx.arcTo(0, 50, NaN, 50, 0); +ctx.arcTo(0, 50, 0, Infinity, 0); +ctx.arcTo(0, 50, 0, -Infinity, 0); +ctx.arcTo(0, 50, 0, NaN, 0); +ctx.arcTo(0, 50, 0, 50, Infinity); +ctx.arcTo(0, 50, 0, 50, -Infinity); +ctx.arcTo(0, 50, 0, 50, NaN); +ctx.arcTo(Infinity, Infinity, 0, 50, 0); +ctx.arcTo(Infinity, Infinity, Infinity, 50, 0); +ctx.arcTo(Infinity, Infinity, Infinity, Infinity, 0); +ctx.arcTo(Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.arcTo(Infinity, Infinity, Infinity, 50, Infinity); +ctx.arcTo(Infinity, Infinity, 0, Infinity, 0); +ctx.arcTo(Infinity, Infinity, 0, Infinity, Infinity); +ctx.arcTo(Infinity, Infinity, 0, 50, Infinity); +ctx.arcTo(Infinity, 50, Infinity, 50, 0); +ctx.arcTo(Infinity, 50, Infinity, Infinity, 0); +ctx.arcTo(Infinity, 50, Infinity, Infinity, Infinity); +ctx.arcTo(Infinity, 50, Infinity, 50, Infinity); +ctx.arcTo(Infinity, 50, 0, Infinity, 0); +ctx.arcTo(Infinity, 50, 0, Infinity, Infinity); +ctx.arcTo(Infinity, 50, 0, 50, Infinity); +ctx.arcTo(0, Infinity, Infinity, 50, 0); +ctx.arcTo(0, Infinity, Infinity, Infinity, 0); +ctx.arcTo(0, Infinity, Infinity, Infinity, Infinity); +ctx.arcTo(0, Infinity, Infinity, 50, Infinity); +ctx.arcTo(0, Infinity, 0, Infinity, 0); +ctx.arcTo(0, Infinity, 0, Infinity, Infinity); +ctx.arcTo(0, Infinity, 0, 50, Infinity); +ctx.arcTo(0, 50, Infinity, Infinity, 0); +ctx.arcTo(0, 50, Infinity, Infinity, Infinity); +ctx.arcTo(0, 50, Infinity, 50, Infinity); +ctx.arcTo(0, 50, 0, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.worker.js new file mode 100644 index 00000000000..c8b007591ce --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.nonfinite.worker.js @@ -0,0 +1,68 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.nonfinite +// Description:arcTo() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.arcTo(Infinity, 50, 0, 50, 0); +ctx.arcTo(-Infinity, 50, 0, 50, 0); +ctx.arcTo(NaN, 50, 0, 50, 0); +ctx.arcTo(0, Infinity, 0, 50, 0); +ctx.arcTo(0, -Infinity, 0, 50, 0); +ctx.arcTo(0, NaN, 0, 50, 0); +ctx.arcTo(0, 50, Infinity, 50, 0); +ctx.arcTo(0, 50, -Infinity, 50, 0); +ctx.arcTo(0, 50, NaN, 50, 0); +ctx.arcTo(0, 50, 0, Infinity, 0); +ctx.arcTo(0, 50, 0, -Infinity, 0); +ctx.arcTo(0, 50, 0, NaN, 0); +ctx.arcTo(0, 50, 0, 50, Infinity); +ctx.arcTo(0, 50, 0, 50, -Infinity); +ctx.arcTo(0, 50, 0, 50, NaN); +ctx.arcTo(Infinity, Infinity, 0, 50, 0); +ctx.arcTo(Infinity, Infinity, Infinity, 50, 0); +ctx.arcTo(Infinity, Infinity, Infinity, Infinity, 0); +ctx.arcTo(Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.arcTo(Infinity, Infinity, Infinity, 50, Infinity); +ctx.arcTo(Infinity, Infinity, 0, Infinity, 0); +ctx.arcTo(Infinity, Infinity, 0, Infinity, Infinity); +ctx.arcTo(Infinity, Infinity, 0, 50, Infinity); +ctx.arcTo(Infinity, 50, Infinity, 50, 0); +ctx.arcTo(Infinity, 50, Infinity, Infinity, 0); +ctx.arcTo(Infinity, 50, Infinity, Infinity, Infinity); +ctx.arcTo(Infinity, 50, Infinity, 50, Infinity); +ctx.arcTo(Infinity, 50, 0, Infinity, 0); +ctx.arcTo(Infinity, 50, 0, Infinity, Infinity); +ctx.arcTo(Infinity, 50, 0, 50, Infinity); +ctx.arcTo(0, Infinity, Infinity, 50, 0); +ctx.arcTo(0, Infinity, Infinity, Infinity, 0); +ctx.arcTo(0, Infinity, Infinity, Infinity, Infinity); +ctx.arcTo(0, Infinity, Infinity, 50, Infinity); +ctx.arcTo(0, Infinity, 0, Infinity, 0); +ctx.arcTo(0, Infinity, 0, Infinity, Infinity); +ctx.arcTo(0, Infinity, 0, 50, Infinity); +ctx.arcTo(0, 50, Infinity, Infinity, 0); +ctx.arcTo(0, 50, Infinity, Infinity, Infinity); +ctx.arcTo(0, 50, Infinity, 50, Infinity); +ctx.arcTo(0, 50, 0, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.scale.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.scale.html new file mode 100644 index 00000000000..69490ea5817 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.scale.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.scale</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.scale</h1> +<p class="desc">arcTo scales the curve, not just the control points</p> + + +<script> +var t = async_test("arcTo scales the curve, not just the control points"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 50); +ctx.translate(100, 0); +ctx.scale(0.1, 1); +ctx.arcTo(50, 50, 50, 0, 50); +ctx.lineTo(-1000, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.scale.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.scale.worker.js new file mode 100644 index 00000000000..80b3419f20d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.scale.worker.js @@ -0,0 +1,38 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.scale +// Description:arcTo scales the curve, not just the control points +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo scales the curve, not just the control points"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 50); +ctx.translate(100, 0); +ctx.scale(0.1, 1); +ctx.arcTo(50, 50, 50, 0, 50); +ctx.lineTo(-1000, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.html new file mode 100644 index 00000000000..fe944137cb2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.shape.curve1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.shape.curve1</h1> +<p class="desc">arcTo() curves in the right kind of shape</p> + + +<script> +var t = async_test("arcTo() curves in the right kind of shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1.5; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 10; +ctx.beginPath(); +ctx.moveTo(10, 25); +ctx.arcTo(75, 25, 75, 60, 20); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.rect(10, 20, 45, 10); +ctx.moveTo(80, 45); +ctx.arc(55, 45, 25+tol, 0, -Math.PI/2, true); +ctx.arc(55, 45, 15-tol, -Math.PI/2, 0, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,19, 0,255,0,255, "55,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,20, 0,255,0,255, "55,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,21, 0,255,0,255, "55,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,22, 0,255,0,255, "64,22", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,21, 0,255,0,255, "65,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 72,28, 0,255,0,255, "72,28", "0,255,0,255"); +_assertPixel(offscreenCanvas, 73,27, 0,255,0,255, "73,27", "0,255,0,255"); +_assertPixel(offscreenCanvas, 78,36, 0,255,0,255, "78,36", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,35, 0,255,0,255, "79,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,44, 0,255,0,255, "80,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,45, 0,255,0,255, "80,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,46, 0,255,0,255, "80,46", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,45, 0,255,0,255, "65,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.worker.js new file mode 100644 index 00000000000..2e7e3d9c118 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve1.worker.js @@ -0,0 +1,49 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.shape.curve1 +// Description:arcTo() curves in the right kind of shape +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() curves in the right kind of shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1.5; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 10; +ctx.beginPath(); +ctx.moveTo(10, 25); +ctx.arcTo(75, 25, 75, 60, 20); +ctx.stroke(); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.rect(10, 20, 45, 10); +ctx.moveTo(80, 45); +ctx.arc(55, 45, 25+tol, 0, -Math.PI/2, true); +ctx.arc(55, 45, 15-tol, -Math.PI/2, 0, false); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,19, 0,255,0,255, "55,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,20, 0,255,0,255, "55,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,21, 0,255,0,255, "55,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,22, 0,255,0,255, "64,22", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,21, 0,255,0,255, "65,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 72,28, 0,255,0,255, "72,28", "0,255,0,255"); +_assertPixel(offscreenCanvas, 73,27, 0,255,0,255, "73,27", "0,255,0,255"); +_assertPixel(offscreenCanvas, 78,36, 0,255,0,255, "78,36", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,35, 0,255,0,255, "79,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,44, 0,255,0,255, "80,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,45, 0,255,0,255, "80,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,46, 0,255,0,255, "80,46", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,45, 0,255,0,255, "65,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.html new file mode 100644 index 00000000000..926b043f651 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.shape.curve2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.shape.curve2</h1> +<p class="desc">arcTo() curves in the right kind of shape</p> + + +<script> +var t = async_test("arcTo() curves in the right kind of shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1.5; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.rect(10, 20, 45, 10); +ctx.moveTo(80, 45); +ctx.arc(55, 45, 25-tol, 0, -Math.PI/2, true); +ctx.arc(55, 45, 15+tol, -Math.PI/2, 0, false); +ctx.fill(); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 10; +ctx.beginPath(); +ctx.moveTo(10, 25); +ctx.arcTo(75, 25, 75, 60, 20); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,19, 0,255,0,255, "55,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,20, 0,255,0,255, "55,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,21, 0,255,0,255, "55,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,22, 0,255,0,255, "64,22", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,21, 0,255,0,255, "65,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 72,28, 0,255,0,255, "72,28", "0,255,0,255"); +_assertPixel(offscreenCanvas, 73,27, 0,255,0,255, "73,27", "0,255,0,255"); +_assertPixel(offscreenCanvas, 78,36, 0,255,0,255, "78,36", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,35, 0,255,0,255, "79,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,44, 0,255,0,255, "80,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,45, 0,255,0,255, "80,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,46, 0,255,0,255, "80,46", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.worker.js new file mode 100644 index 00000000000..f2fafb06474 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.curve2.worker.js @@ -0,0 +1,48 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.shape.curve2 +// Description:arcTo() curves in the right kind of shape +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() curves in the right kind of shape"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var tol = 1.5; // tolerance to avoid antialiasing artifacts +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.beginPath(); +ctx.rect(10, 20, 45, 10); +ctx.moveTo(80, 45); +ctx.arc(55, 45, 25-tol, 0, -Math.PI/2, true); +ctx.arc(55, 45, 15+tol, -Math.PI/2, 0, false); +ctx.fill(); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 10; +ctx.beginPath(); +ctx.moveTo(10, 25); +ctx.arcTo(75, 25, 75, 60, 20); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,19, 0,255,0,255, "55,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,20, 0,255,0,255, "55,20", "0,255,0,255"); +_assertPixel(offscreenCanvas, 55,21, 0,255,0,255, "55,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 64,22, 0,255,0,255, "64,22", "0,255,0,255"); +_assertPixel(offscreenCanvas, 65,21, 0,255,0,255, "65,21", "0,255,0,255"); +_assertPixel(offscreenCanvas, 72,28, 0,255,0,255, "72,28", "0,255,0,255"); +_assertPixel(offscreenCanvas, 73,27, 0,255,0,255, "73,27", "0,255,0,255"); +_assertPixel(offscreenCanvas, 78,36, 0,255,0,255, "78,36", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,35, 0,255,0,255, "79,35", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,44, 0,255,0,255, "80,44", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,45, 0,255,0,255, "80,45", "0,255,0,255"); +_assertPixel(offscreenCanvas, 80,46, 0,255,0,255, "80,46", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.html new file mode 100644 index 00000000000..a3341c04f1c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.shape.end</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.shape.end</h1> +<p class="desc">arcTo() does not draw anything from P1 to P2</p> + + +<script> +var t = async_test("arcTo() does not draw anything from P1 to P2"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(-100, -100); +ctx.arcTo(-100, 25, 200, 25, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.worker.js new file mode 100644 index 00000000000..52716753194 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.end.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.shape.end +// Description:arcTo() does not draw anything from P1 to P2 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() does not draw anything from P1 to P2"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(-100, -100); +ctx.arcTo(-100, 25, 200, 25, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.html new file mode 100644 index 00000000000..5071526e49c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.shape.start</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.shape.start</h1> +<p class="desc">arcTo() draws a straight line from P0 to P1</p> + + +<script> +var t = async_test("arcTo() draws a straight line from P0 to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(200, 25, 200, 50, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.worker.js new file mode 100644 index 00000000000..84835686d16 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.shape.start.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.shape.start +// Description:arcTo() draws a straight line from P0 to P1 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() draws a straight line from P0 to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(200, 25, 200, 50, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.transformation.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.transformation.html new file mode 100644 index 00000000000..a6989d0dfec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.transformation.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.transformation</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.transformation</h1> +<p class="desc">arcTo joins up to the last subpath point correctly</p> + + +<script> +var t = async_test("arcTo joins up to the last subpath point correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 50); +ctx.translate(100, 0); +ctx.arcTo(50, 50, 50, 0, 50); +ctx.lineTo(-100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.transformation.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.transformation.worker.js new file mode 100644 index 00000000000..a545bd3d51f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.transformation.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.transformation +// Description:arcTo joins up to the last subpath point correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo joins up to the last subpath point correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 50); +ctx.translate(100, 0); +ctx.arcTo(50, 50, 50, 0, 50); +ctx.lineTo(-100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.html new file mode 100644 index 00000000000..77f69f59358 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.zero.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.zero.1</h1> +<p class="desc">arcTo() with zero radius draws a straight line from P0 to P1</p> + + +<script> +var t = async_test("arcTo() with zero radius draws a straight line from P0 to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 100, 100, 0); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(0, -25); +ctx.arcTo(50, -25, 50, 50, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.worker.js new file mode 100644 index 00000000000..d1d2e87b4ca --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.1.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.zero.1 +// Description:arcTo() with zero radius draws a straight line from P0 to P1 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with zero radius draws a straight line from P0 to P1"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, 100, 100, 0); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(0, -25); +ctx.arcTo(50, -25, 50, 50, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.html new file mode 100644 index 00000000000..debe3d31482 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.arcTo.zero.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.arcTo.zero.2</h1> +<p class="desc">arcTo() with zero radius draws a straight line from P0 to P1, even when all points are collinear</p> + + +<script> +var t = async_test("arcTo() with zero radius draws a straight line from P0 to P1, even when all points are collinear"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, -100, 25, 0); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 25); +ctx.arcTo(200, 25, 50, 25, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.worker.js new file mode 100644 index 00000000000..3ff55ce50c9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.arcTo.zero.2.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.arcTo.zero.2 +// Description:arcTo() with zero radius draws a straight line from P0 to P1, even when all points are collinear +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("arcTo() with zero radius draws a straight line from P0 to P1, even when all points are collinear"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.strokeStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.arcTo(100, 25, -100, 25, 0); +ctx.stroke(); +ctx.strokeStyle = '#f00'; +ctx.beginPath(); +ctx.moveTo(100, 25); +ctx.arcTo(200, 25, 50, 25, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.beginPath.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.beginPath.html new file mode 100644 index 00000000000..46c47d74bdc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.beginPath.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.beginPath</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.beginPath</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.rect(0, 0, 100, 50); +ctx.beginPath(); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.beginPath.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.beginPath.worker.js new file mode 100644 index 00000000000..30069e36992 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.beginPath.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.beginPath +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.rect(0, 0, 100, 50); +ctx.beginPath(); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.html new file mode 100644 index 00000000000..42f2f046b0e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.bezierCurveTo.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.bezierCurveTo.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.bezierCurveTo(100, 25, 100, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.worker.js new file mode 100644 index 00000000000..57e10844fea --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.basic.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.bezierCurveTo.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.bezierCurveTo(100, 25, 100, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.html new file mode 100644 index 00000000000..29ceb0d5189 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.bezierCurveTo.ensuresubpath.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.bezierCurveTo.ensuresubpath.1</h1> +<p class="desc">If there is no subpath, the first control point is added (and nothing is drawn up to it)</p> + + +<script> +var t = async_test("If there is no subpath, the first control point is added (and nothing is drawn up to it)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.bezierCurveTo(100, 50, 200, 50, 200, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 95,45, 0,255,0,255, "95,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.worker.js new file mode 100644 index 00000000000..5c942267046 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.bezierCurveTo.ensuresubpath.1 +// Description:If there is no subpath, the first control point is added (and nothing is drawn up to it) +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the first control point is added (and nothing is drawn up to it)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.bezierCurveTo(100, 50, 200, 50, 200, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 95,45, 0,255,0,255, "95,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.html new file mode 100644 index 00000000000..937773b1763 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.bezierCurveTo.ensuresubpath.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.bezierCurveTo.ensuresubpath.2</h1> +<p class="desc">If there is no subpath, the first control point is added</p> + + +<script> +var t = async_test("If there is no subpath, the first control point is added"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.bezierCurveTo(0, 25, 100, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 5,45, 0,255,0,255, "5,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.worker.js new file mode 100644 index 00000000000..d4411450670 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.bezierCurveTo.ensuresubpath.2 +// Description:If there is no subpath, the first control point is added +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the first control point is added"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.bezierCurveTo(0, 25, 100, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 5,45, 0,255,0,255, "5,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.html new file mode 100644 index 00000000000..58de700726e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.bezierCurveTo.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.bezierCurveTo.nonfinite</h1> +<p class="desc">bezierCurveTo() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("bezierCurveTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.bezierCurveTo(Infinity, 50, 0, 50, 0, 50); +ctx.bezierCurveTo(-Infinity, 50, 0, 50, 0, 50); +ctx.bezierCurveTo(NaN, 50, 0, 50, 0, 50); +ctx.bezierCurveTo(0, Infinity, 0, 50, 0, 50); +ctx.bezierCurveTo(0, -Infinity, 0, 50, 0, 50); +ctx.bezierCurveTo(0, NaN, 0, 50, 0, 50); +ctx.bezierCurveTo(0, 50, Infinity, 50, 0, 50); +ctx.bezierCurveTo(0, 50, -Infinity, 50, 0, 50); +ctx.bezierCurveTo(0, 50, NaN, 50, 0, 50); +ctx.bezierCurveTo(0, 50, 0, Infinity, 0, 50); +ctx.bezierCurveTo(0, 50, 0, -Infinity, 0, 50); +ctx.bezierCurveTo(0, 50, 0, NaN, 0, 50); +ctx.bezierCurveTo(0, 50, 0, 50, Infinity, 50); +ctx.bezierCurveTo(0, 50, 0, 50, -Infinity, 50); +ctx.bezierCurveTo(0, 50, 0, 50, NaN, 50); +ctx.bezierCurveTo(0, 50, 0, 50, 0, Infinity); +ctx.bezierCurveTo(0, 50, 0, 50, 0, -Infinity); +ctx.bezierCurveTo(0, 50, 0, 50, 0, NaN); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, 0, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, 0, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, 50, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, 0, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, 0, 50); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, 50, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, 0, 50, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, 50, 0, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(0, 50, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(0, 50, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, 50, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, 50, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, 50, 0, 50, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.worker.js new file mode 100644 index 00000000000..6b199dde180 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.nonfinite.worker.js @@ -0,0 +1,102 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.bezierCurveTo.nonfinite +// Description:bezierCurveTo() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("bezierCurveTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.bezierCurveTo(Infinity, 50, 0, 50, 0, 50); +ctx.bezierCurveTo(-Infinity, 50, 0, 50, 0, 50); +ctx.bezierCurveTo(NaN, 50, 0, 50, 0, 50); +ctx.bezierCurveTo(0, Infinity, 0, 50, 0, 50); +ctx.bezierCurveTo(0, -Infinity, 0, 50, 0, 50); +ctx.bezierCurveTo(0, NaN, 0, 50, 0, 50); +ctx.bezierCurveTo(0, 50, Infinity, 50, 0, 50); +ctx.bezierCurveTo(0, 50, -Infinity, 50, 0, 50); +ctx.bezierCurveTo(0, 50, NaN, 50, 0, 50); +ctx.bezierCurveTo(0, 50, 0, Infinity, 0, 50); +ctx.bezierCurveTo(0, 50, 0, -Infinity, 0, 50); +ctx.bezierCurveTo(0, 50, 0, NaN, 0, 50); +ctx.bezierCurveTo(0, 50, 0, 50, Infinity, 50); +ctx.bezierCurveTo(0, 50, 0, 50, -Infinity, 50); +ctx.bezierCurveTo(0, 50, 0, 50, NaN, 50); +ctx.bezierCurveTo(0, 50, 0, 50, 0, Infinity); +ctx.bezierCurveTo(0, 50, 0, 50, 0, -Infinity); +ctx.bezierCurveTo(0, 50, 0, 50, 0, NaN); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, Infinity, 0, 50, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, 0, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, 0, 50); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, 50, Infinity, 50); +ctx.bezierCurveTo(Infinity, 50, 0, 50, Infinity, Infinity); +ctx.bezierCurveTo(Infinity, 50, 0, 50, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, 0, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, 0, 50); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, 50, Infinity, 50); +ctx.bezierCurveTo(0, Infinity, 0, 50, Infinity, Infinity); +ctx.bezierCurveTo(0, Infinity, 0, 50, 0, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, 0, 50); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, 50, Infinity, 50); +ctx.bezierCurveTo(0, 50, Infinity, 50, Infinity, Infinity); +ctx.bezierCurveTo(0, 50, Infinity, 50, 0, Infinity); +ctx.bezierCurveTo(0, 50, 0, Infinity, Infinity, 50); +ctx.bezierCurveTo(0, 50, 0, Infinity, Infinity, Infinity); +ctx.bezierCurveTo(0, 50, 0, Infinity, 0, Infinity); +ctx.bezierCurveTo(0, 50, 0, 50, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.html new file mode 100644 index 00000000000..2e9623584a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.bezierCurveTo.scaled</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.bezierCurveTo.scaled</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(1000, 1000); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 0.055; +ctx.beginPath(); +ctx.moveTo(-2, 3.1); +ctx.bezierCurveTo(-2, -1, 2.1, -1, 2.1, 3.1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.worker.js new file mode 100644 index 00000000000..7c05de12e6e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.scaled.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.bezierCurveTo.scaled +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(1000, 1000); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 0.055; +ctx.beginPath(); +ctx.moveTo(-2, 3.1); +ctx.bezierCurveTo(-2, -1, 2.1, -1, 2.1, 3.1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.html new file mode 100644 index 00000000000..c601b6ba567 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.bezierCurveTo.shape</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.bezierCurveTo.shape</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 55; +ctx.beginPath(); +ctx.moveTo(-2000, 3100); +ctx.bezierCurveTo(-2000, -1000, 2100, -1000, 2100, 3100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.worker.js new file mode 100644 index 00000000000..ebdeda14a27 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.bezierCurveTo.shape.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.bezierCurveTo.shape +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 55; +ctx.beginPath(); +ctx.moveTo(-2000, 3100); +ctx.bezierCurveTo(-2000, -1000, 2100, -1000, 2100, 3100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.1.html new file mode 100644 index 00000000000..4d61e3d8e84 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.basic.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.basic.1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.clip(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.1.worker.js new file mode 100644 index 00000000000..391d745f65e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.basic.1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 100, 50); +ctx.clip(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.2.html new file mode 100644 index 00000000000..4591f77457e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.basic.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.basic.2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(-100, 0, 100, 50); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.2.worker.js new file mode 100644 index 00000000000..965a328450f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.basic.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.basic.2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(-100, 0, 100, 50); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.empty.html new file mode 100644 index 00000000000..39555a97a77 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.empty.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.empty</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.empty.worker.js new file mode 100644 index 00000000000..d22b27ec22c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.empty.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.empty +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.intersect.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.intersect.html new file mode 100644 index 00000000000..d7bc3bd2459 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.intersect.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.intersect</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.intersect</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.beginPath(); +ctx.rect(50, 0, 50, 50) +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.intersect.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.intersect.worker.js new file mode 100644 index 00000000000..6dd021cdfa7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.intersect.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.intersect +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.beginPath(); +ctx.rect(50, 0, 50, 50) +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.unaffected.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.unaffected.html new file mode 100644 index 00000000000..bf5d541835b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.unaffected.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.unaffected</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.unaffected</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.clip(); +ctx.lineTo(0, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.unaffected.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.unaffected.worker.js new file mode 100644 index 00000000000..ce6bbd00e07 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.unaffected.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.unaffected +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.beginPath(); +ctx.moveTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.clip(); +ctx.lineTo(0, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.1.html new file mode 100644 index 00000000000..bae8e94cd37 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.1.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.winding.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.winding.1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.1.worker.js new file mode 100644 index 00000000000..5865147c09d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.1.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.winding.1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.2.html new file mode 100644 index 00000000000..ec2568970cf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.2.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.clip.winding.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.clip.winding.2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.clip(); +ctx.beginPath(); +ctx.moveTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.lineTo(0, 0); +ctx.clip(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.2.worker.js new file mode 100644 index 00000000000..649c4346ad0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.clip.winding.2.worker.js @@ -0,0 +1,38 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.clip.winding.2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.clip(); +ctx.beginPath(); +ctx.moveTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.lineTo(0, 0); +ctx.clip(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.empty.html new file mode 100644 index 00000000000..8cc5168d358 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.empty.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.closePath.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.closePath.empty</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.closePath(); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.empty.worker.js new file mode 100644 index 00000000000..be09fff5ebd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.empty.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.closePath.empty +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.closePath(); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.newline.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.newline.html new file mode 100644 index 00000000000..3f4f1839f7e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.newline.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.closePath.newline</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.closePath.newline</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-100, -100); +ctx.lineTo(200, -100); +ctx.lineTo(200, 25); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.newline.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.newline.worker.js new file mode 100644 index 00000000000..04f3392e688 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.newline.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.closePath.newline +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-100, -100); +ctx.lineTo(200, -100); +ctx.lineTo(200, 25); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.html new file mode 100644 index 00000000000..b30fbd69862 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.closePath.nextpoint</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.closePath.nextpoint</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-100, -1000); +ctx.closePath(); +ctx.lineTo(1000, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.worker.js new file mode 100644 index 00000000000..f590e76ffd5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.closePath.nextpoint.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.closePath.nextpoint +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-100, -1000); +ctx.closePath(); +ctx.lineTo(1000, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.basic.html new file mode 100644 index 00000000000..e13ea6f760e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.basic.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.closed.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.closed.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.basic.worker.js new file mode 100644 index 00000000000..3d3c3c72326 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.basic.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.closed.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.html new file mode 100644 index 00000000000..7fdbe47a946 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.closed.unaffected</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.closed.unaffected</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#00f'; +ctx.fillRect(0, 0, 100, 50); +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(100, 50); +ctx.fillStyle = '#f00'; +ctx.fill(); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 90,10, 0,255,0,255, "90,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 10,40, 0,255,0,255, "10,40", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.worker.js new file mode 100644 index 00000000000..473dad64af3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.closed.unaffected.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.closed.unaffected +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#00f'; +ctx.fillRect(0, 0, 100, 50); +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(100, 50); +ctx.fillStyle = '#f00'; +ctx.fill(); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 90,10, 0,255,0,255, "90,10", "0,255,0,255"); +_assertPixel(offscreenCanvas, 10,40, 0,255,0,255, "10,40", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.overlap.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.overlap.html new file mode 100644 index 00000000000..b8c6f2ad4a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.overlap.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.overlap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.overlap</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.rect(0, 0, 100, 50); +ctx.closePath(); +ctx.rect(10, 10, 80, 30); +ctx.fill(); +_assertPixelApprox(offscreenCanvas, 50,25, 0,127,0,255, "50,25", "0,127,0,255", 1); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.overlap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.overlap.worker.js new file mode 100644 index 00000000000..5e5301b8203 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.overlap.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.overlap +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.rect(0, 0, 100, 50); +ctx.closePath(); +ctx.rect(10, 10, 80, 30); +ctx.fill(); +_assertPixelApprox(offscreenCanvas, 50,25, 0,127,0,255, "50,25", "0,127,0,255", 1); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.add.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.add.html new file mode 100644 index 00000000000..d01c5df8f48 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.add.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.winding.add</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.winding.add</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.add.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.add.worker.js new file mode 100644 index 00000000000..37df3d5a9a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.add.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.winding.add +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.html new file mode 100644 index 00000000000..32afbf60327 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.winding.subtract.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.winding.subtract.1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.worker.js new file mode 100644 index 00000000000..37f6c71171b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.1.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.winding.subtract.1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.html new file mode 100644 index 00000000000..3742632f21a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.winding.subtract.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.winding.subtract.2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.moveTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.worker.js new file mode 100644 index 00000000000..864cfd5f3e8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.2.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.winding.subtract.2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.moveTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.html new file mode 100644 index 00000000000..693806a04d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.fill.winding.subtract.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.fill.winding.subtract.3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(-20, -20); +ctx.lineTo(120, -20); +ctx.lineTo(120, 70); +ctx.lineTo(-20, 70); +ctx.lineTo(-20, -20); +ctx.lineTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.worker.js new file mode 100644 index 00000000000..276b0cbc7c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.fill.winding.subtract.3.worker.js @@ -0,0 +1,38 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.fill.winding.subtract.3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(-10, -10); +ctx.lineTo(110, -10); +ctx.lineTo(110, 60); +ctx.lineTo(-10, 60); +ctx.lineTo(-10, -10); +ctx.lineTo(-20, -20); +ctx.lineTo(120, -20); +ctx.lineTo(120, 70); +ctx.lineTo(-20, 70); +ctx.lineTo(-20, -20); +ctx.lineTo(0, 0); +ctx.lineTo(0, 50); +ctx.lineTo(100, 50); +ctx.lineTo(100, 0); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.initial.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.initial.html new file mode 100644 index 00000000000..d46744d00ec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.initial.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.initial</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.initial</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.closePath(); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.initial.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.initial.worker.js new file mode 100644 index 00000000000..5856714876e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.initial.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.initial +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.closePath(); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.html new file mode 100644 index 00000000000..4558af168b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.arc</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.arc</h1> +<p class="desc">isPointInPath() works on arcs</p> + + +<script> +var t = async_test("isPointInPath() works on arcs"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.arc(50, 25, 10, 0, Math.PI, false); +_assertSame(ctx.isPointInPath(50, 10), false, "ctx.isPointInPath(50, 10)", "false"); +_assertSame(ctx.isPointInPath(50, 20), false, "ctx.isPointInPath(50, 20)", "false"); +_assertSame(ctx.isPointInPath(50, 30), true, "ctx.isPointInPath(50, 30)", "true"); +_assertSame(ctx.isPointInPath(50, 40), false, "ctx.isPointInPath(50, 40)", "false"); +_assertSame(ctx.isPointInPath(30, 20), false, "ctx.isPointInPath(30, 20)", "false"); +_assertSame(ctx.isPointInPath(70, 20), false, "ctx.isPointInPath(70, 20)", "false"); +_assertSame(ctx.isPointInPath(30, 30), false, "ctx.isPointInPath(30, 30)", "false"); +_assertSame(ctx.isPointInPath(70, 30), false, "ctx.isPointInPath(70, 30)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.worker.js new file mode 100644 index 00000000000..9a6e76e05bb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.arc.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.arc +// Description:isPointInPath() works on arcs +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() works on arcs"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.arc(50, 25, 10, 0, Math.PI, false); +_assertSame(ctx.isPointInPath(50, 10), false, "ctx.isPointInPath(50, 10)", "false"); +_assertSame(ctx.isPointInPath(50, 20), false, "ctx.isPointInPath(50, 20)", "false"); +_assertSame(ctx.isPointInPath(50, 30), true, "ctx.isPointInPath(50, 30)", "true"); +_assertSame(ctx.isPointInPath(50, 40), false, "ctx.isPointInPath(50, 40)", "false"); +_assertSame(ctx.isPointInPath(30, 20), false, "ctx.isPointInPath(30, 20)", "false"); +_assertSame(ctx.isPointInPath(70, 20), false, "ctx.isPointInPath(70, 20)", "false"); +_assertSame(ctx.isPointInPath(30, 30), false, "ctx.isPointInPath(30, 30)", "false"); +_assertSame(ctx.isPointInPath(70, 30), false, "ctx.isPointInPath(70, 30)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.html new file mode 100644 index 00000000000..774ef7664f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.basic.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.basic.1</h1> +<p class="desc">isPointInPath() detects whether the point is inside the path</p> + + +<script> +var t = async_test("isPointInPath() detects whether the point is inside the path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, 0, 20, 20); +_assertSame(ctx.isPointInPath(10, 10), true, "ctx.isPointInPath(10, 10)", "true"); +_assertSame(ctx.isPointInPath(30, 10), false, "ctx.isPointInPath(30, 10)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.worker.js new file mode 100644 index 00000000000..8e2fbee4960 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.1.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.basic.1 +// Description:isPointInPath() detects whether the point is inside the path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() detects whether the point is inside the path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, 0, 20, 20); +_assertSame(ctx.isPointInPath(10, 10), true, "ctx.isPointInPath(10, 10)", "true"); +_assertSame(ctx.isPointInPath(30, 10), false, "ctx.isPointInPath(30, 10)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.html new file mode 100644 index 00000000000..9216c73fd4d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.basic.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.basic.2</h1> +<p class="desc">isPointInPath() detects whether the point is inside the path</p> + + +<script> +var t = async_test("isPointInPath() detects whether the point is inside the path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(20, 0, 20, 20); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(30, 10), true, "ctx.isPointInPath(30, 10)", "true"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.worker.js new file mode 100644 index 00000000000..b2bf9410ba7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.basic.2.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.basic.2 +// Description:isPointInPath() detects whether the point is inside the path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() detects whether the point is inside the path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(20, 0, 20, 20); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(30, 10), true, "ctx.isPointInPath(30, 10)", "true"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.html new file mode 100644 index 00000000000..51901846622 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.bezier</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.bezier</h1> +<p class="desc">isPointInPath() works on Bezier curves</p> + + +<script> +var t = async_test("isPointInPath() works on Bezier curves"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(25, 25); +ctx.bezierCurveTo(50, -50, 50, 100, 75, 25); +_assertSame(ctx.isPointInPath(25, 20), false, "ctx.isPointInPath(25, 20)", "false"); +_assertSame(ctx.isPointInPath(25, 30), false, "ctx.isPointInPath(25, 30)", "false"); +_assertSame(ctx.isPointInPath(30, 20), true, "ctx.isPointInPath(30, 20)", "true"); +_assertSame(ctx.isPointInPath(30, 30), false, "ctx.isPointInPath(30, 30)", "false"); +_assertSame(ctx.isPointInPath(40, 2), false, "ctx.isPointInPath(40, 2)", "false"); +_assertSame(ctx.isPointInPath(40, 20), true, "ctx.isPointInPath(40, 20)", "true"); +_assertSame(ctx.isPointInPath(40, 30), false, "ctx.isPointInPath(40, 30)", "false"); +_assertSame(ctx.isPointInPath(40, 47), false, "ctx.isPointInPath(40, 47)", "false"); +_assertSame(ctx.isPointInPath(45, 20), true, "ctx.isPointInPath(45, 20)", "true"); +_assertSame(ctx.isPointInPath(45, 30), false, "ctx.isPointInPath(45, 30)", "false"); +_assertSame(ctx.isPointInPath(55, 20), false, "ctx.isPointInPath(55, 20)", "false"); +_assertSame(ctx.isPointInPath(55, 30), true, "ctx.isPointInPath(55, 30)", "true"); +_assertSame(ctx.isPointInPath(60, 2), false, "ctx.isPointInPath(60, 2)", "false"); +_assertSame(ctx.isPointInPath(60, 20), false, "ctx.isPointInPath(60, 20)", "false"); +_assertSame(ctx.isPointInPath(60, 30), true, "ctx.isPointInPath(60, 30)", "true"); +_assertSame(ctx.isPointInPath(60, 47), false, "ctx.isPointInPath(60, 47)", "false"); +_assertSame(ctx.isPointInPath(70, 20), false, "ctx.isPointInPath(70, 20)", "false"); +_assertSame(ctx.isPointInPath(70, 30), true, "ctx.isPointInPath(70, 30)", "true"); +_assertSame(ctx.isPointInPath(75, 20), false, "ctx.isPointInPath(75, 20)", "false"); +_assertSame(ctx.isPointInPath(75, 30), false, "ctx.isPointInPath(75, 30)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.worker.js new file mode 100644 index 00000000000..5d2f9e0089f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bezier.worker.js @@ -0,0 +1,41 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.bezier +// Description:isPointInPath() works on Bezier curves +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() works on Bezier curves"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(25, 25); +ctx.bezierCurveTo(50, -50, 50, 100, 75, 25); +_assertSame(ctx.isPointInPath(25, 20), false, "ctx.isPointInPath(25, 20)", "false"); +_assertSame(ctx.isPointInPath(25, 30), false, "ctx.isPointInPath(25, 30)", "false"); +_assertSame(ctx.isPointInPath(30, 20), true, "ctx.isPointInPath(30, 20)", "true"); +_assertSame(ctx.isPointInPath(30, 30), false, "ctx.isPointInPath(30, 30)", "false"); +_assertSame(ctx.isPointInPath(40, 2), false, "ctx.isPointInPath(40, 2)", "false"); +_assertSame(ctx.isPointInPath(40, 20), true, "ctx.isPointInPath(40, 20)", "true"); +_assertSame(ctx.isPointInPath(40, 30), false, "ctx.isPointInPath(40, 30)", "false"); +_assertSame(ctx.isPointInPath(40, 47), false, "ctx.isPointInPath(40, 47)", "false"); +_assertSame(ctx.isPointInPath(45, 20), true, "ctx.isPointInPath(45, 20)", "true"); +_assertSame(ctx.isPointInPath(45, 30), false, "ctx.isPointInPath(45, 30)", "false"); +_assertSame(ctx.isPointInPath(55, 20), false, "ctx.isPointInPath(55, 20)", "false"); +_assertSame(ctx.isPointInPath(55, 30), true, "ctx.isPointInPath(55, 30)", "true"); +_assertSame(ctx.isPointInPath(60, 2), false, "ctx.isPointInPath(60, 2)", "false"); +_assertSame(ctx.isPointInPath(60, 20), false, "ctx.isPointInPath(60, 20)", "false"); +_assertSame(ctx.isPointInPath(60, 30), true, "ctx.isPointInPath(60, 30)", "true"); +_assertSame(ctx.isPointInPath(60, 47), false, "ctx.isPointInPath(60, 47)", "false"); +_assertSame(ctx.isPointInPath(70, 20), false, "ctx.isPointInPath(70, 20)", "false"); +_assertSame(ctx.isPointInPath(70, 30), true, "ctx.isPointInPath(70, 30)", "true"); +_assertSame(ctx.isPointInPath(75, 20), false, "ctx.isPointInPath(75, 20)", "false"); +_assertSame(ctx.isPointInPath(75, 30), false, "ctx.isPointInPath(75, 30)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.html new file mode 100644 index 00000000000..8703eeffe50 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.bigarc</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.bigarc</h1> +<p class="desc">isPointInPath() works on unclosed arcs larger than 2pi</p> + + +<script> +var t = async_test("isPointInPath() works on unclosed arcs larger than 2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.arc(50, 25, 10, 0, 7, false); +_assertSame(ctx.isPointInPath(50, 10), false, "ctx.isPointInPath(50, 10)", "false"); +_assertSame(ctx.isPointInPath(50, 20), true, "ctx.isPointInPath(50, 20)", "true"); +_assertSame(ctx.isPointInPath(50, 30), true, "ctx.isPointInPath(50, 30)", "true"); +_assertSame(ctx.isPointInPath(50, 40), false, "ctx.isPointInPath(50, 40)", "false"); +_assertSame(ctx.isPointInPath(30, 20), false, "ctx.isPointInPath(30, 20)", "false"); +_assertSame(ctx.isPointInPath(70, 20), false, "ctx.isPointInPath(70, 20)", "false"); +_assertSame(ctx.isPointInPath(30, 30), false, "ctx.isPointInPath(30, 30)", "false"); +_assertSame(ctx.isPointInPath(70, 30), false, "ctx.isPointInPath(70, 30)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.worker.js new file mode 100644 index 00000000000..974ff759234 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.bigarc.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.bigarc +// Description:isPointInPath() works on unclosed arcs larger than 2pi +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() works on unclosed arcs larger than 2pi"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.arc(50, 25, 10, 0, 7, false); +_assertSame(ctx.isPointInPath(50, 10), false, "ctx.isPointInPath(50, 10)", "false"); +_assertSame(ctx.isPointInPath(50, 20), true, "ctx.isPointInPath(50, 20)", "true"); +_assertSame(ctx.isPointInPath(50, 30), true, "ctx.isPointInPath(50, 30)", "true"); +_assertSame(ctx.isPointInPath(50, 40), false, "ctx.isPointInPath(50, 40)", "false"); +_assertSame(ctx.isPointInPath(30, 20), false, "ctx.isPointInPath(30, 20)", "false"); +_assertSame(ctx.isPointInPath(70, 20), false, "ctx.isPointInPath(70, 20)", "false"); +_assertSame(ctx.isPointInPath(30, 30), false, "ctx.isPointInPath(30, 30)", "false"); +_assertSame(ctx.isPointInPath(70, 30), false, "ctx.isPointInPath(70, 30)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.html new file mode 100644 index 00000000000..6d6d87d001f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.edge</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.edge</h1> +<p class="desc">isPointInPath() counts points on the path as being inside</p> + + +<script> +var t = async_test("isPointInPath() counts points on the path as being inside"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, 0, 20, 20); +_assertSame(ctx.isPointInPath(0, 0), true, "ctx.isPointInPath(0, 0)", "true"); +_assertSame(ctx.isPointInPath(10, 0), true, "ctx.isPointInPath(10, 0)", "true"); +_assertSame(ctx.isPointInPath(20, 0), true, "ctx.isPointInPath(20, 0)", "true"); +_assertSame(ctx.isPointInPath(20, 10), true, "ctx.isPointInPath(20, 10)", "true"); +_assertSame(ctx.isPointInPath(20, 20), true, "ctx.isPointInPath(20, 20)", "true"); +_assertSame(ctx.isPointInPath(10, 20), true, "ctx.isPointInPath(10, 20)", "true"); +_assertSame(ctx.isPointInPath(0, 20), true, "ctx.isPointInPath(0, 20)", "true"); +_assertSame(ctx.isPointInPath(0, 10), true, "ctx.isPointInPath(0, 10)", "true"); +_assertSame(ctx.isPointInPath(10, -0.01), false, "ctx.isPointInPath(10, -0.01)", "false"); +_assertSame(ctx.isPointInPath(10, 20.01), false, "ctx.isPointInPath(10, 20.01)", "false"); +_assertSame(ctx.isPointInPath(-0.01, 10), false, "ctx.isPointInPath(-0.01, 10)", "false"); +_assertSame(ctx.isPointInPath(20.01, 10), false, "ctx.isPointInPath(20.01, 10)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.worker.js new file mode 100644 index 00000000000..8bf9b19b2a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.edge.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.edge +// Description:isPointInPath() counts points on the path as being inside +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() counts points on the path as being inside"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, 0, 20, 20); +_assertSame(ctx.isPointInPath(0, 0), true, "ctx.isPointInPath(0, 0)", "true"); +_assertSame(ctx.isPointInPath(10, 0), true, "ctx.isPointInPath(10, 0)", "true"); +_assertSame(ctx.isPointInPath(20, 0), true, "ctx.isPointInPath(20, 0)", "true"); +_assertSame(ctx.isPointInPath(20, 10), true, "ctx.isPointInPath(20, 10)", "true"); +_assertSame(ctx.isPointInPath(20, 20), true, "ctx.isPointInPath(20, 20)", "true"); +_assertSame(ctx.isPointInPath(10, 20), true, "ctx.isPointInPath(10, 20)", "true"); +_assertSame(ctx.isPointInPath(0, 20), true, "ctx.isPointInPath(0, 20)", "true"); +_assertSame(ctx.isPointInPath(0, 10), true, "ctx.isPointInPath(0, 10)", "true"); +_assertSame(ctx.isPointInPath(10, -0.01), false, "ctx.isPointInPath(10, -0.01)", "false"); +_assertSame(ctx.isPointInPath(10, 20.01), false, "ctx.isPointInPath(10, 20.01)", "false"); +_assertSame(ctx.isPointInPath(-0.01, 10), false, "ctx.isPointInPath(-0.01, 10)", "false"); +_assertSame(ctx.isPointInPath(20.01, 10), false, "ctx.isPointInPath(20.01, 10)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.html new file mode 100644 index 00000000000..9219d50dd0d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.empty</h1> +<p class="desc">isPointInPath() works when there is no path</p> + + +<script> +var t = async_test("isPointInPath() works when there is no path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.isPointInPath(0, 0), false, "ctx.isPointInPath(0, 0)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.worker.js new file mode 100644 index 00000000000..822838400b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.empty.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.empty +// Description:isPointInPath() works when there is no path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() works when there is no path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.isPointInPath(0, 0), false, "ctx.isPointInPath(0, 0)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.html new file mode 100644 index 00000000000..6e6bd2ef36f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.nonfinite</h1> +<p class="desc">isPointInPath() returns false for non-finite arguments</p> + + +<script> +var t = async_test("isPointInPath() returns false for non-finite arguments"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(-100, -50, 200, 100); +_assertSame(ctx.isPointInPath(Infinity, 0), false, "ctx.isPointInPath(Infinity, 0)", "false"); +_assertSame(ctx.isPointInPath(-Infinity, 0), false, "ctx.isPointInPath(-Infinity, 0)", "false"); +_assertSame(ctx.isPointInPath(NaN, 0), false, "ctx.isPointInPath(NaN, 0)", "false"); +_assertSame(ctx.isPointInPath(0, Infinity), false, "ctx.isPointInPath(0, Infinity)", "false"); +_assertSame(ctx.isPointInPath(0, -Infinity), false, "ctx.isPointInPath(0, -Infinity)", "false"); +_assertSame(ctx.isPointInPath(0, NaN), false, "ctx.isPointInPath(0, NaN)", "false"); +_assertSame(ctx.isPointInPath(NaN, NaN), false, "ctx.isPointInPath(NaN, NaN)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.worker.js new file mode 100644 index 00000000000..91c2d36c5a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.nonfinite.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.nonfinite +// Description:isPointInPath() returns false for non-finite arguments +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() returns false for non-finite arguments"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(-100, -50, 200, 100); +_assertSame(ctx.isPointInPath(Infinity, 0), false, "ctx.isPointInPath(Infinity, 0)", "false"); +_assertSame(ctx.isPointInPath(-Infinity, 0), false, "ctx.isPointInPath(-Infinity, 0)", "false"); +_assertSame(ctx.isPointInPath(NaN, 0), false, "ctx.isPointInPath(NaN, 0)", "false"); +_assertSame(ctx.isPointInPath(0, Infinity), false, "ctx.isPointInPath(0, Infinity)", "false"); +_assertSame(ctx.isPointInPath(0, -Infinity), false, "ctx.isPointInPath(0, -Infinity)", "false"); +_assertSame(ctx.isPointInPath(0, NaN), false, "ctx.isPointInPath(0, NaN)", "false"); +_assertSame(ctx.isPointInPath(NaN, NaN), false, "ctx.isPointInPath(NaN, NaN)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.html new file mode 100644 index 00000000000..c3175989b6d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.outside</h1> +<p class="desc">isPointInPath() works on paths outside the canvas</p> + + +<script> +var t = async_test("isPointInPath() works on paths outside the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, -100, 20, 20); +ctx.rect(20, -10, 20, 20); +_assertSame(ctx.isPointInPath(10, -110), false, "ctx.isPointInPath(10, -110)", "false"); +_assertSame(ctx.isPointInPath(10, -90), true, "ctx.isPointInPath(10, -90)", "true"); +_assertSame(ctx.isPointInPath(10, -70), false, "ctx.isPointInPath(10, -70)", "false"); +_assertSame(ctx.isPointInPath(30, -20), false, "ctx.isPointInPath(30, -20)", "false"); +_assertSame(ctx.isPointInPath(30, 0), true, "ctx.isPointInPath(30, 0)", "true"); +_assertSame(ctx.isPointInPath(30, 20), false, "ctx.isPointInPath(30, 20)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.worker.js new file mode 100644 index 00000000000..11b81d215ca --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.outside.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.outside +// Description:isPointInPath() works on paths outside the canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() works on paths outside the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, -100, 20, 20); +ctx.rect(20, -10, 20, 20); +_assertSame(ctx.isPointInPath(10, -110), false, "ctx.isPointInPath(10, -110)", "false"); +_assertSame(ctx.isPointInPath(10, -90), true, "ctx.isPointInPath(10, -90)", "true"); +_assertSame(ctx.isPointInPath(10, -70), false, "ctx.isPointInPath(10, -70)", "false"); +_assertSame(ctx.isPointInPath(30, -20), false, "ctx.isPointInPath(30, -20)", "false"); +_assertSame(ctx.isPointInPath(30, 0), true, "ctx.isPointInPath(30, 0)", "true"); +_assertSame(ctx.isPointInPath(30, 20), false, "ctx.isPointInPath(30, 20)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.html new file mode 100644 index 00000000000..ddf7b2793f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.subpath</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.subpath</h1> +<p class="desc">isPointInPath() uses the current path, not just the subpath</p> + + +<script> +var t = async_test("isPointInPath() uses the current path, not just the subpath"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, 0, 20, 20); +ctx.beginPath(); +ctx.rect(20, 0, 20, 20); +ctx.closePath(); +ctx.rect(40, 0, 20, 20); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(30, 10), true, "ctx.isPointInPath(30, 10)", "true"); +_assertSame(ctx.isPointInPath(50, 10), true, "ctx.isPointInPath(50, 10)", "true"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.worker.js new file mode 100644 index 00000000000..a453c805db8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.subpath.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.subpath +// Description:isPointInPath() uses the current path, not just the subpath +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() uses the current path, not just the subpath"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(0, 0, 20, 20); +ctx.beginPath(); +ctx.rect(20, 0, 20, 20); +ctx.closePath(); +ctx.rect(40, 0, 20, 20); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(30, 10), true, "ctx.isPointInPath(30, 10)", "true"); +_assertSame(ctx.isPointInPath(50, 10), true, "ctx.isPointInPath(50, 10)", "true"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.html new file mode 100644 index 00000000000..a1e87660db7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.transform.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.transform.1</h1> +<p class="desc">isPointInPath() handles transformations correctly</p> + + +<script> +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(50, 0); +ctx.rect(0, 0, 20, 20); +_assertSame(ctx.isPointInPath(-40, 10), false, "ctx.isPointInPath(-40, 10)", "false"); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(49, 10), false, "ctx.isPointInPath(49, 10)", "false"); +_assertSame(ctx.isPointInPath(51, 10), true, "ctx.isPointInPath(51, 10)", "true"); +_assertSame(ctx.isPointInPath(69, 10), true, "ctx.isPointInPath(69, 10)", "true"); +_assertSame(ctx.isPointInPath(71, 10), false, "ctx.isPointInPath(71, 10)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.worker.js new file mode 100644 index 00000000000..bebc6d63955 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.transform.1 +// Description:isPointInPath() handles transformations correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(50, 0); +ctx.rect(0, 0, 20, 20); +_assertSame(ctx.isPointInPath(-40, 10), false, "ctx.isPointInPath(-40, 10)", "false"); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(49, 10), false, "ctx.isPointInPath(49, 10)", "false"); +_assertSame(ctx.isPointInPath(51, 10), true, "ctx.isPointInPath(51, 10)", "true"); +_assertSame(ctx.isPointInPath(69, 10), true, "ctx.isPointInPath(69, 10)", "true"); +_assertSame(ctx.isPointInPath(71, 10), false, "ctx.isPointInPath(71, 10)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.html new file mode 100644 index 00000000000..1995295fab2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.transform.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.transform.2</h1> +<p class="desc">isPointInPath() handles transformations correctly</p> + + +<script> +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(50, 0, 20, 20); +ctx.translate(50, 0); +_assertSame(ctx.isPointInPath(-40, 10), false, "ctx.isPointInPath(-40, 10)", "false"); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(49, 10), false, "ctx.isPointInPath(49, 10)", "false"); +_assertSame(ctx.isPointInPath(51, 10), true, "ctx.isPointInPath(51, 10)", "true"); +_assertSame(ctx.isPointInPath(69, 10), true, "ctx.isPointInPath(69, 10)", "true"); +_assertSame(ctx.isPointInPath(71, 10), false, "ctx.isPointInPath(71, 10)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.worker.js new file mode 100644 index 00000000000..a092cb9a673 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.transform.2 +// Description:isPointInPath() handles transformations correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.rect(50, 0, 20, 20); +ctx.translate(50, 0); +_assertSame(ctx.isPointInPath(-40, 10), false, "ctx.isPointInPath(-40, 10)", "false"); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(49, 10), false, "ctx.isPointInPath(49, 10)", "false"); +_assertSame(ctx.isPointInPath(51, 10), true, "ctx.isPointInPath(51, 10)", "true"); +_assertSame(ctx.isPointInPath(69, 10), true, "ctx.isPointInPath(69, 10)", "true"); +_assertSame(ctx.isPointInPath(71, 10), false, "ctx.isPointInPath(71, 10)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.html new file mode 100644 index 00000000000..b43e1042dd8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.transform.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.transform.3</h1> +<p class="desc">isPointInPath() handles transformations correctly</p> + + +<script> +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.scale(-1, 1); +ctx.rect(-70, 0, 20, 20); +_assertSame(ctx.isPointInPath(-40, 10), false, "ctx.isPointInPath(-40, 10)", "false"); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(49, 10), false, "ctx.isPointInPath(49, 10)", "false"); +_assertSame(ctx.isPointInPath(51, 10), true, "ctx.isPointInPath(51, 10)", "true"); +_assertSame(ctx.isPointInPath(69, 10), true, "ctx.isPointInPath(69, 10)", "true"); +_assertSame(ctx.isPointInPath(71, 10), false, "ctx.isPointInPath(71, 10)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.worker.js new file mode 100644 index 00000000000..cd244a68b2d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.3.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.transform.3 +// Description:isPointInPath() handles transformations correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.scale(-1, 1); +ctx.rect(-70, 0, 20, 20); +_assertSame(ctx.isPointInPath(-40, 10), false, "ctx.isPointInPath(-40, 10)", "false"); +_assertSame(ctx.isPointInPath(10, 10), false, "ctx.isPointInPath(10, 10)", "false"); +_assertSame(ctx.isPointInPath(49, 10), false, "ctx.isPointInPath(49, 10)", "false"); +_assertSame(ctx.isPointInPath(51, 10), true, "ctx.isPointInPath(51, 10)", "true"); +_assertSame(ctx.isPointInPath(69, 10), true, "ctx.isPointInPath(69, 10)", "true"); +_assertSame(ctx.isPointInPath(71, 10), false, "ctx.isPointInPath(71, 10)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.html new file mode 100644 index 00000000000..e79562400b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.transform.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.transform.4</h1> +<p class="desc">isPointInPath() handles transformations correctly</p> + + +<script> +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(50, 0); +ctx.rect(50, 0, 20, 20); +ctx.translate(0, 50); +_assertSame(ctx.isPointInPath(60, 10), false, "ctx.isPointInPath(60, 10)", "false"); +_assertSame(ctx.isPointInPath(110, 10), true, "ctx.isPointInPath(110, 10)", "true"); +_assertSame(ctx.isPointInPath(110, 60), false, "ctx.isPointInPath(110, 60)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.worker.js new file mode 100644 index 00000000000..6ec20136161 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.transform.4.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.transform.4 +// Description:isPointInPath() handles transformations correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() handles transformations correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.translate(50, 0); +ctx.rect(50, 0, 20, 20); +ctx.translate(0, 50); +_assertSame(ctx.isPointInPath(60, 10), false, "ctx.isPointInPath(60, 10)", "false"); +_assertSame(ctx.isPointInPath(110, 10), true, "ctx.isPointInPath(110, 10)", "true"); +_assertSame(ctx.isPointInPath(110, 60), false, "ctx.isPointInPath(110, 60)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.html new file mode 100644 index 00000000000..f05a39d7ad6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.unclosed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.unclosed</h1> +<p class="desc">isPointInPath() works on unclosed subpaths</p> + + +<script> +var t = async_test("isPointInPath() works on unclosed subpaths"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(20, 0); +ctx.lineTo(20, 20); +ctx.lineTo(0, 20); +_assertSame(ctx.isPointInPath(10, 10), true, "ctx.isPointInPath(10, 10)", "true"); +_assertSame(ctx.isPointInPath(30, 10), false, "ctx.isPointInPath(30, 10)", "false"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.worker.js new file mode 100644 index 00000000000..316e791b2f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.unclosed.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.unclosed +// Description:isPointInPath() works on unclosed subpaths +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() works on unclosed subpaths"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(20, 0); +ctx.lineTo(20, 20); +ctx.lineTo(0, 20); +_assertSame(ctx.isPointInPath(10, 10), true, "ctx.isPointInPath(10, 10)", "true"); +_assertSame(ctx.isPointInPath(30, 10), false, "ctx.isPointInPath(30, 10)", "false"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.html new file mode 100644 index 00000000000..8b0e07f101e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.isPointInPath.winding</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.isPointInPath.winding</h1> +<p class="desc">isPointInPath() uses the non-zero winding number rule</p> + + +<script> +var t = async_test("isPointInPath() uses the non-zero winding number rule"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Create a square ring, using opposite windings to make a hole in the centre +ctx.moveTo(0, 0); +ctx.lineTo(50, 0); +ctx.lineTo(50, 50); +ctx.lineTo(0, 50); +ctx.lineTo(0, 0); +ctx.lineTo(10, 10); +ctx.lineTo(10, 40); +ctx.lineTo(40, 40); +ctx.lineTo(40, 10); +ctx.lineTo(10, 10); +_assertSame(ctx.isPointInPath(5, 5), true, "ctx.isPointInPath(5, 5)", "true"); +_assertSame(ctx.isPointInPath(25, 5), true, "ctx.isPointInPath(25, 5)", "true"); +_assertSame(ctx.isPointInPath(45, 5), true, "ctx.isPointInPath(45, 5)", "true"); +_assertSame(ctx.isPointInPath(5, 25), true, "ctx.isPointInPath(5, 25)", "true"); +_assertSame(ctx.isPointInPath(25, 25), false, "ctx.isPointInPath(25, 25)", "false"); +_assertSame(ctx.isPointInPath(45, 25), true, "ctx.isPointInPath(45, 25)", "true"); +_assertSame(ctx.isPointInPath(5, 45), true, "ctx.isPointInPath(5, 45)", "true"); +_assertSame(ctx.isPointInPath(25, 45), true, "ctx.isPointInPath(25, 45)", "true"); +_assertSame(ctx.isPointInPath(45, 45), true, "ctx.isPointInPath(45, 45)", "true"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.worker.js new file mode 100644 index 00000000000..fde0a17edd6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.isPointInPath.winding.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.isPointInPath.winding +// Description:isPointInPath() uses the non-zero winding number rule +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("isPointInPath() uses the non-zero winding number rule"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Create a square ring, using opposite windings to make a hole in the centre +ctx.moveTo(0, 0); +ctx.lineTo(50, 0); +ctx.lineTo(50, 50); +ctx.lineTo(0, 50); +ctx.lineTo(0, 0); +ctx.lineTo(10, 10); +ctx.lineTo(10, 40); +ctx.lineTo(40, 40); +ctx.lineTo(40, 10); +ctx.lineTo(10, 10); +_assertSame(ctx.isPointInPath(5, 5), true, "ctx.isPointInPath(5, 5)", "true"); +_assertSame(ctx.isPointInPath(25, 5), true, "ctx.isPointInPath(25, 5)", "true"); +_assertSame(ctx.isPointInPath(45, 5), true, "ctx.isPointInPath(45, 5)", "true"); +_assertSame(ctx.isPointInPath(5, 25), true, "ctx.isPointInPath(5, 25)", "true"); +_assertSame(ctx.isPointInPath(25, 25), false, "ctx.isPointInPath(25, 25)", "false"); +_assertSame(ctx.isPointInPath(45, 25), true, "ctx.isPointInPath(45, 25)", "true"); +_assertSame(ctx.isPointInPath(5, 45), true, "ctx.isPointInPath(5, 45)", "true"); +_assertSame(ctx.isPointInPath(25, 45), true, "ctx.isPointInPath(25, 45)", "true"); +_assertSame(ctx.isPointInPath(45, 45), true, "ctx.isPointInPath(45, 45)", "true"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.basic.html new file mode 100644 index 00000000000..fe4ffec3fe8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.basic.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.lineTo.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.lineTo.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.basic.worker.js new file mode 100644 index 00000000000..c070975b21d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.basic.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.lineTo.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.html new file mode 100644 index 00000000000..9216819a54c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.lineTo.ensuresubpath.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.lineTo.ensuresubpath.1</h1> +<p class="desc">If there is no subpath, the point is added and nothing is drawn</p> + + +<script> +var t = async_test("If there is no subpath, the point is added and nothing is drawn"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.lineTo(100, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.worker.js new file mode 100644 index 00000000000..701ffdd41d2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.lineTo.ensuresubpath.1 +// Description:If there is no subpath, the point is added and nothing is drawn +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the point is added and nothing is drawn"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.lineTo(100, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.html new file mode 100644 index 00000000000..fb9b04d5a5d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.lineTo.ensuresubpath.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.lineTo.ensuresubpath.2</h1> +<p class="desc">If there is no subpath, the point is added and used for subsequent drawing</p> + + +<script> +var t = async_test("If there is no subpath, the point is added and used for subsequent drawing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.lineTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.worker.js new file mode 100644 index 00000000000..699e44048cb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.ensuresubpath.2.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.lineTo.ensuresubpath.2 +// Description:If there is no subpath, the point is added and used for subsequent drawing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the point is added and used for subsequent drawing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.lineTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.html new file mode 100644 index 00000000000..05768c0cd85 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.lineTo.nextpoint</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.lineTo.nextpoint</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(-100, -100); +ctx.lineTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.worker.js new file mode 100644 index 00000000000..2262b8bc102 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nextpoint.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.lineTo.nextpoint +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(-100, -100); +ctx.lineTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.html new file mode 100644 index 00000000000..4ea20937954 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.lineTo.nonfinite.details</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.lineTo.nonfinite.details</h1> +<p class="desc">lineTo() with Infinity/NaN for first arg still converts the second arg</p> + + +<script> +var t = async_test("lineTo() with Infinity/NaN for first arg still converts the second arg"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +for (var arg1 of [Infinity, -Infinity, NaN]) { + var converted = false; + ctx.lineTo(arg1, { valueOf: function() { converted = true; return 0; } }); + _assert(converted, "converted"); +} + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.worker.js new file mode 100644 index 00000000000..13d615306ce --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.details.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.lineTo.nonfinite.details +// Description:lineTo() with Infinity/NaN for first arg still converts the second arg +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineTo() with Infinity/NaN for first arg still converts the second arg"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +for (var arg1 of [Infinity, -Infinity, NaN]) { + var converted = false; + ctx.lineTo(arg1, { valueOf: function() { converted = true; return 0; } }); + _assert(converted, "converted"); +} + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.html new file mode 100644 index 00000000000..8dd773e8207 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.lineTo.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.lineTo.nonfinite</h1> +<p class="desc">lineTo() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("lineTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(Infinity, 50); +ctx.lineTo(-Infinity, 50); +ctx.lineTo(NaN, 50); +ctx.lineTo(0, Infinity); +ctx.lineTo(0, -Infinity); +ctx.lineTo(0, NaN); +ctx.lineTo(Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.worker.js new file mode 100644 index 00000000000..4f97b9b2da2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.lineTo.nonfinite.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.lineTo.nonfinite +// Description:lineTo() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("lineTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.lineTo(Infinity, 50); +ctx.lineTo(-Infinity, 50); +ctx.lineTo(NaN, 50); +ctx.lineTo(0, Infinity); +ctx.lineTo(0, -Infinity); +ctx.lineTo(0, NaN); +ctx.lineTo(Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.basic.html new file mode 100644 index 00000000000..36e14ac114b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.basic.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.moveTo.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.moveTo.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rect(0, 0, 10, 50); +ctx.moveTo(100, 0); +ctx.lineTo(10, 0); +ctx.lineTo(10, 50); +ctx.lineTo(100, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 90,25, 0,255,0,255, "90,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.basic.worker.js new file mode 100644 index 00000000000..d4b928a66c9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.basic.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.moveTo.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rect(0, 0, 10, 50); +ctx.moveTo(100, 0); +ctx.lineTo(10, 0); +ctx.lineTo(10, 50); +ctx.lineTo(100, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 90,25, 0,255,0,255, "90,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.multiple.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.multiple.html new file mode 100644 index 00000000000..41f45143869 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.multiple.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.moveTo.multiple</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.moveTo.multiple</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.moveTo(0, 25); +ctx.moveTo(100, 25); +ctx.moveTo(0, 25); +ctx.lineTo(100, 25); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.multiple.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.multiple.worker.js new file mode 100644 index 00000000000..7d64884961a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.multiple.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.moveTo.multiple +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.moveTo(0, 25); +ctx.moveTo(100, 25); +ctx.moveTo(0, 25); +ctx.lineTo(100, 25); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.html new file mode 100644 index 00000000000..390a26154a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.moveTo.newsubpath</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.moveTo.newsubpath</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.moveTo(0, 0); +ctx.moveTo(100, 0); +ctx.moveTo(100, 50); +ctx.moveTo(0, 50); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.worker.js new file mode 100644 index 00000000000..3dac6081120 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.newsubpath.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.moveTo.newsubpath +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.moveTo(0, 0); +ctx.moveTo(100, 0); +ctx.moveTo(100, 50); +ctx.moveTo(0, 50); +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.html new file mode 100644 index 00000000000..100259a4a40 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.moveTo.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.moveTo.nonfinite</h1> +<p class="desc">moveTo() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("moveTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.moveTo(Infinity, 50); +ctx.moveTo(-Infinity, 50); +ctx.moveTo(NaN, 50); +ctx.moveTo(0, Infinity); +ctx.moveTo(0, -Infinity); +ctx.moveTo(0, NaN); +ctx.moveTo(Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.worker.js new file mode 100644 index 00000000000..84d89720767 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.moveTo.nonfinite.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.moveTo.nonfinite +// Description:moveTo() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("moveTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.moveTo(Infinity, 50); +ctx.moveTo(-Infinity, 50); +ctx.moveTo(NaN, 50); +ctx.moveTo(0, Infinity); +ctx.moveTo(0, -Infinity); +ctx.moveTo(0, NaN); +ctx.moveTo(Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.html new file mode 100644 index 00000000000..957b890137e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.quadraticCurveTo.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.quadraticCurveTo.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.quadraticCurveTo(100, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.worker.js new file mode 100644 index 00000000000..d074dfa57c6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.basic.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.quadraticCurveTo.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.moveTo(0, 25); +ctx.quadraticCurveTo(100, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.html new file mode 100644 index 00000000000..8f3c10f90c2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.quadraticCurveTo.ensuresubpath.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.quadraticCurveTo.ensuresubpath.1</h1> +<p class="desc">If there is no subpath, the first control point is added (and nothing is drawn up to it)</p> + + +<script> +var t = async_test("If there is no subpath, the first control point is added (and nothing is drawn up to it)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.quadraticCurveTo(100, 50, 200, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 95,45, 0,255,0,255, "95,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.worker.js new file mode 100644 index 00000000000..67b0bb22289 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.quadraticCurveTo.ensuresubpath.1 +// Description:If there is no subpath, the first control point is added (and nothing is drawn up to it) +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the first control point is added (and nothing is drawn up to it)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.quadraticCurveTo(100, 50, 200, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 95,45, 0,255,0,255, "95,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.html new file mode 100644 index 00000000000..0a61ecd83c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.quadraticCurveTo.ensuresubpath.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.quadraticCurveTo.ensuresubpath.2</h1> +<p class="desc">If there is no subpath, the first control point is added</p> + + +<script> +var t = async_test("If there is no subpath, the first control point is added"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.quadraticCurveTo(0, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 5,45, 0,255,0,255, "5,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.worker.js new file mode 100644 index 00000000000..a8b87cccc84 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.quadraticCurveTo.ensuresubpath.2 +// Description:If there is no subpath, the first control point is added +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("If there is no subpath, the first control point is added"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.beginPath(); +ctx.quadraticCurveTo(0, 25, 100, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 5,45, 0,255,0,255, "5,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.html new file mode 100644 index 00000000000..9806ca08c6d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.quadraticCurveTo.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.quadraticCurveTo.nonfinite</h1> +<p class="desc">quadraticCurveTo() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("quadraticCurveTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.quadraticCurveTo(Infinity, 50, 0, 50); +ctx.quadraticCurveTo(-Infinity, 50, 0, 50); +ctx.quadraticCurveTo(NaN, 50, 0, 50); +ctx.quadraticCurveTo(0, Infinity, 0, 50); +ctx.quadraticCurveTo(0, -Infinity, 0, 50); +ctx.quadraticCurveTo(0, NaN, 0, 50); +ctx.quadraticCurveTo(0, 50, Infinity, 50); +ctx.quadraticCurveTo(0, 50, -Infinity, 50); +ctx.quadraticCurveTo(0, 50, NaN, 50); +ctx.quadraticCurveTo(0, 50, 0, Infinity); +ctx.quadraticCurveTo(0, 50, 0, -Infinity); +ctx.quadraticCurveTo(0, 50, 0, NaN); +ctx.quadraticCurveTo(Infinity, Infinity, 0, 50); +ctx.quadraticCurveTo(Infinity, Infinity, Infinity, 50); +ctx.quadraticCurveTo(Infinity, Infinity, Infinity, Infinity); +ctx.quadraticCurveTo(Infinity, Infinity, 0, Infinity); +ctx.quadraticCurveTo(Infinity, 50, Infinity, 50); +ctx.quadraticCurveTo(Infinity, 50, Infinity, Infinity); +ctx.quadraticCurveTo(Infinity, 50, 0, Infinity); +ctx.quadraticCurveTo(0, Infinity, Infinity, 50); +ctx.quadraticCurveTo(0, Infinity, Infinity, Infinity); +ctx.quadraticCurveTo(0, Infinity, 0, Infinity); +ctx.quadraticCurveTo(0, 50, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.worker.js new file mode 100644 index 00000000000..48410532555 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.nonfinite.worker.js @@ -0,0 +1,50 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.quadraticCurveTo.nonfinite +// Description:quadraticCurveTo() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("quadraticCurveTo() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.quadraticCurveTo(Infinity, 50, 0, 50); +ctx.quadraticCurveTo(-Infinity, 50, 0, 50); +ctx.quadraticCurveTo(NaN, 50, 0, 50); +ctx.quadraticCurveTo(0, Infinity, 0, 50); +ctx.quadraticCurveTo(0, -Infinity, 0, 50); +ctx.quadraticCurveTo(0, NaN, 0, 50); +ctx.quadraticCurveTo(0, 50, Infinity, 50); +ctx.quadraticCurveTo(0, 50, -Infinity, 50); +ctx.quadraticCurveTo(0, 50, NaN, 50); +ctx.quadraticCurveTo(0, 50, 0, Infinity); +ctx.quadraticCurveTo(0, 50, 0, -Infinity); +ctx.quadraticCurveTo(0, 50, 0, NaN); +ctx.quadraticCurveTo(Infinity, Infinity, 0, 50); +ctx.quadraticCurveTo(Infinity, Infinity, Infinity, 50); +ctx.quadraticCurveTo(Infinity, Infinity, Infinity, Infinity); +ctx.quadraticCurveTo(Infinity, Infinity, 0, Infinity); +ctx.quadraticCurveTo(Infinity, 50, Infinity, 50); +ctx.quadraticCurveTo(Infinity, 50, Infinity, Infinity); +ctx.quadraticCurveTo(Infinity, 50, 0, Infinity); +ctx.quadraticCurveTo(0, Infinity, Infinity, 50); +ctx.quadraticCurveTo(0, Infinity, Infinity, Infinity); +ctx.quadraticCurveTo(0, Infinity, 0, Infinity); +ctx.quadraticCurveTo(0, 50, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.html new file mode 100644 index 00000000000..9d1ec4fd4bc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.quadraticCurveTo.scaled</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.quadraticCurveTo.scaled</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(1000, 1000); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 0.055; +ctx.beginPath(); +ctx.moveTo(-1, 1.05); +ctx.quadraticCurveTo(0, -1, 1.2, 1.05); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.worker.js new file mode 100644 index 00000000000..2e4106ed9c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.scaled.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.quadraticCurveTo.scaled +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(1000, 1000); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 0.055; +ctx.beginPath(); +ctx.moveTo(-1, 1.05); +ctx.quadraticCurveTo(0, -1, 1.2, 1.05); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.html new file mode 100644 index 00000000000..40e454a7e41 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.quadraticCurveTo.shape</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.quadraticCurveTo.shape</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 55; +ctx.beginPath(); +ctx.moveTo(-1000, 1050); +ctx.quadraticCurveTo(0, -1000, 1200, 1050); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.worker.js new file mode 100644 index 00000000000..e8710f9adb0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.quadraticCurveTo.shape.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.quadraticCurveTo.shape +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 55; +ctx.beginPath(); +ctx.moveTo(-1000, 1050); +ctx.quadraticCurveTo(0, -1000, 1200, 1050); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.basic.html new file mode 100644 index 00000000000..059668ab9db --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.basic.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.rect(0, 0, 100, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.basic.worker.js new file mode 100644 index 00000000000..abcacad5bfb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.basic.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.rect(0, 0, 100, 50); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.closed.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.closed.html new file mode 100644 index 00000000000..943d7c91938 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.closed.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.closed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.closed</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.rect(100, 50, 100, 100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.closed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.closed.worker.js new file mode 100644 index 00000000000..9a2b7e5623c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.closed.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.closed +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.rect(100, 50, 100, 100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.1.html new file mode 100644 index 00000000000..b44c6a84a31 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.end.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.end.1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.rect(200, 100, 400, 1000); +ctx.lineTo(-2000, -1000); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.1.worker.js new file mode 100644 index 00000000000..72b2d8aff1c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.end.1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.rect(200, 100, 400, 1000); +ctx.lineTo(-2000, -1000); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.2.html new file mode 100644 index 00000000000..a48b27d61b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.2.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.end.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.end.2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 450; +ctx.lineCap = 'round'; +ctx.lineJoin = 'bevel'; +ctx.rect(150, 150, 2000, 2000); +ctx.lineTo(160, 160); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.2.worker.js new file mode 100644 index 00000000000..a9718745a39 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.end.2.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.end.2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 450; +ctx.lineCap = 'round'; +ctx.lineJoin = 'bevel'; +ctx.rect(150, 150, 2000, 2000); +ctx.lineTo(160, 160); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.negative.html new file mode 100644 index 00000000000..55edbabd31e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.negative.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.negative</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.fillStyle = '#0f0'; +ctx.rect(0, 0, 50, 25); +ctx.rect(100, 0, -50, 25); +ctx.rect(0, 50, 50, -25); +ctx.rect(100, 50, -50, -25); +ctx.fill(); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.negative.worker.js new file mode 100644 index 00000000000..4ee0b730fd2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.negative.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.negative +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.fillStyle = '#0f0'; +ctx.rect(0, 0, 50, 25); +ctx.rect(100, 0, -50, 25); +ctx.rect(0, 50, 50, -25); +ctx.rect(100, 50, -50, -25); +ctx.fill(); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.newsubpath.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.newsubpath.html new file mode 100644 index 00000000000..982e8b9c189 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.newsubpath.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.newsubpath</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.newsubpath</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-50, 25); +ctx.rect(200, 25, 1, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.newsubpath.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.newsubpath.worker.js new file mode 100644 index 00000000000..1bacdaad0c6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.newsubpath.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.newsubpath +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-50, 25); +ctx.rect(200, 25, 1, 1); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.nonfinite.html new file mode 100644 index 00000000000..d3c62e5e692 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.nonfinite.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.nonfinite</h1> +<p class="desc">rect() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("rect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.rect(Infinity, 50, 1, 1); +ctx.rect(-Infinity, 50, 1, 1); +ctx.rect(NaN, 50, 1, 1); +ctx.rect(0, Infinity, 1, 1); +ctx.rect(0, -Infinity, 1, 1); +ctx.rect(0, NaN, 1, 1); +ctx.rect(0, 50, Infinity, 1); +ctx.rect(0, 50, -Infinity, 1); +ctx.rect(0, 50, NaN, 1); +ctx.rect(0, 50, 1, Infinity); +ctx.rect(0, 50, 1, -Infinity); +ctx.rect(0, 50, 1, NaN); +ctx.rect(Infinity, Infinity, 1, 1); +ctx.rect(Infinity, Infinity, Infinity, 1); +ctx.rect(Infinity, Infinity, Infinity, Infinity); +ctx.rect(Infinity, Infinity, 1, Infinity); +ctx.rect(Infinity, 50, Infinity, 1); +ctx.rect(Infinity, 50, Infinity, Infinity); +ctx.rect(Infinity, 50, 1, Infinity); +ctx.rect(0, Infinity, Infinity, 1); +ctx.rect(0, Infinity, Infinity, Infinity); +ctx.rect(0, Infinity, 1, Infinity); +ctx.rect(0, 50, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.nonfinite.worker.js new file mode 100644 index 00000000000..35582fd664b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.nonfinite.worker.js @@ -0,0 +1,50 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.nonfinite +// Description:rect() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rect() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.moveTo(0, 0); +ctx.lineTo(100, 0); +ctx.rect(Infinity, 50, 1, 1); +ctx.rect(-Infinity, 50, 1, 1); +ctx.rect(NaN, 50, 1, 1); +ctx.rect(0, Infinity, 1, 1); +ctx.rect(0, -Infinity, 1, 1); +ctx.rect(0, NaN, 1, 1); +ctx.rect(0, 50, Infinity, 1); +ctx.rect(0, 50, -Infinity, 1); +ctx.rect(0, 50, NaN, 1); +ctx.rect(0, 50, 1, Infinity); +ctx.rect(0, 50, 1, -Infinity); +ctx.rect(0, 50, 1, NaN); +ctx.rect(Infinity, Infinity, 1, 1); +ctx.rect(Infinity, Infinity, Infinity, 1); +ctx.rect(Infinity, Infinity, Infinity, Infinity); +ctx.rect(Infinity, Infinity, 1, Infinity); +ctx.rect(Infinity, 50, Infinity, 1); +ctx.rect(Infinity, 50, Infinity, Infinity); +ctx.rect(Infinity, 50, 1, Infinity); +ctx.rect(0, Infinity, Infinity, 1); +ctx.rect(0, Infinity, Infinity, Infinity); +ctx.rect(0, Infinity, 1, Infinity); +ctx.rect(0, 50, Infinity, Infinity); +ctx.lineTo(100, 50); +ctx.lineTo(0, 50); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 90,45, 0,255,0,255, "90,45", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.selfintersect.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.selfintersect.html new file mode 100644 index 00000000000..7ca1af59d50 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.selfintersect.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.selfintersect</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.selfintersect</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 90; +ctx.beginPath(); +ctx.rect(45, 20, 10, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.selfintersect.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.selfintersect.worker.js new file mode 100644 index 00000000000..0c261b643d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.selfintersect.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.selfintersect +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 90; +ctx.beginPath(); +ctx.rect(45, 20, 10, 10); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.winding.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.winding.html new file mode 100644 index 00000000000..4532ddb9edf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.winding.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.winding</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.winding</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.fillStyle = '#f00'; +ctx.rect(0, 0, 50, 50); +ctx.rect(100, 50, -50, -50); +ctx.rect(0, 25, 100, -25); +ctx.rect(100, 25, -100, 25); +ctx.fill(); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.winding.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.winding.worker.js new file mode 100644 index 00000000000..72f3e3a019e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.winding.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.winding +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.fillStyle = '#f00'; +ctx.rect(0, 0, 50, 50); +ctx.rect(100, 50, -50, -50); +ctx.rect(0, 25, 100, -25); +ctx.rect(100, 25, -100, 25); +ctx.fill(); +_assertPixel(offscreenCanvas, 25,12, 0,255,0,255, "25,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,12, 0,255,0,255, "75,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 25,37, 0,255,0,255, "25,37", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,37, 0,255,0,255, "75,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.1.html new file mode 100644 index 00000000000..2873a528958 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.zero.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.zero.1</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.rect(0, 50, 100, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.1.worker.js new file mode 100644 index 00000000000..7ad6404b1ca --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.zero.1 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.rect(0, 50, 100, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.2.html new file mode 100644 index 00000000000..0bdead070d3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.zero.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.zero.2</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.rect(50, -100, 0, 250); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.2.worker.js new file mode 100644 index 00000000000..cd43701ab49 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.zero.2 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.rect(50, -100, 0, 250); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.3.html new file mode 100644 index 00000000000..02a84e3e840 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.3.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.zero.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.zero.3</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.rect(50, 25, 0, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.3.worker.js new file mode 100644 index 00000000000..19176838d52 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.3.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.zero.3 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.beginPath(); +ctx.rect(50, 25, 0, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.4.html new file mode 100644 index 00000000000..7c80780588f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.4.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.zero.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.zero.4</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.rect(100, 25, 0, 0); +ctx.lineTo(0, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.4.worker.js new file mode 100644 index 00000000000..7c91236c748 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.4.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.zero.4 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 50; +ctx.rect(100, 25, 0, 0); +ctx.lineTo(0, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.5.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.5.html new file mode 100644 index 00000000000..3fc634577a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.5.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.zero.5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.zero.5</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.moveTo(0, 0); +ctx.rect(100, 25, 0, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.5.worker.js new file mode 100644 index 00000000000..1e839016f26 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.5.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.zero.5 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.moveTo(0, 0); +ctx.rect(100, 25, 0, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.6.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.6.html new file mode 100644 index 00000000000..450ef3c3668 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.6.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.rect.zero.6</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.rect.zero.6</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 1.5; +ctx.lineWidth = 200; +ctx.beginPath(); +ctx.rect(100, 25, 1000, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.6.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.6.worker.js new file mode 100644 index 00000000000..44bda7ee71f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.rect.zero.6.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.rect.zero.6 +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 1.5; +ctx.lineWidth = 200; +ctx.beginPath(); +ctx.rect(100, 25, 1000, 0); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.empty.html new file mode 100644 index 00000000000..14e489abf53 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.empty.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.empty</h1> +<p class="desc">Empty subpaths are not stroked</p> + + +<script> +var t = async_test("Empty subpaths are not stroked"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(40, 25); +ctx.moveTo(60, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.empty.worker.js new file mode 100644 index 00000000000..d6db2a01b6d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.empty.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.empty +// Description:Empty subpaths are not stroked +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Empty subpaths are not stroked"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(40, 25); +ctx.moveTo(60, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.overlap.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.overlap.html new file mode 100644 index 00000000000..c7277b91cad --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.overlap.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.overlap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.overlap</h1> +<p class="desc">Stroked subpaths are combined before being drawn</p> + + +<script> +var t = async_test("Stroked subpaths are combined before being drawn"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.lineWidth = 50; +ctx.moveTo(0, 20); +ctx.lineTo(100, 20); +ctx.moveTo(0, 30); +ctx.lineTo(100, 30); +ctx.stroke(); +_assertPixelApprox(offscreenCanvas, 50,25, 0,127,0,255, "50,25", "0,127,0,255", 1); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.overlap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.overlap.worker.js new file mode 100644 index 00000000000..516084791c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.overlap.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.overlap +// Description:Stroked subpaths are combined before being drawn +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Stroked subpaths are combined before being drawn"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = 'rgba(0, 255, 0, 0.5)'; +ctx.lineWidth = 50; +ctx.moveTo(0, 20); +ctx.lineTo(100, 20); +ctx.moveTo(0, 30); +ctx.lineTo(100, 30); +ctx.stroke(); +_assertPixelApprox(offscreenCanvas, 50,25, 0,127,0,255, "50,25", "0,127,0,255", 1); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.html new file mode 100644 index 00000000000..065314e8205 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.prune.arc</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.prune.arc</h1> +<p class="desc">Zero-length line segments from arcTo and arc are removed before stroking</p> + + +<script> +var t = async_test("Zero-length line segments from arcTo and arc are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arcTo(50, 25, 150, 25, 10); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(60, 25); +ctx.arc(50, 25, 10, 0, 0, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.worker.js new file mode 100644 index 00000000000..eba5233522f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.prune.arc +// Description:Zero-length line segments from arcTo and arc are removed before stroking +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Zero-length line segments from arcTo and arc are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.arcTo(50, 25, 150, 25, 10); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(60, 25); +ctx.arc(50, 25, 10, 0, 0, false); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.html new file mode 100644 index 00000000000..7c8ffe127d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.prune.closed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.prune.closed</h1> +<p class="desc">Zero-length line segments from closed paths are removed before stroking</p> + + +<script> +var t = async_test("Zero-length line segments from closed paths are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.lineTo(50, 25); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.worker.js new file mode 100644 index 00000000000..8b2e920e7f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.closed.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.prune.closed +// Description:Zero-length line segments from closed paths are removed before stroking +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Zero-length line segments from closed paths are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.lineTo(50, 25); +ctx.closePath(); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.html new file mode 100644 index 00000000000..ef0919634b7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.prune.corner</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.prune.corner</h1> +<p class="desc">Zero-length line segments are removed before stroking with miters</p> + + +<script> +var t = async_test("Zero-length line segments are removed before stroking with miters"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 1.4; +ctx.beginPath(); +ctx.moveTo(-1000, 200); +ctx.lineTo(-100, 200); +ctx.lineTo(-100, 200); +ctx.lineTo(-100, 200); +ctx.lineTo(-100, 1000); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.worker.js new file mode 100644 index 00000000000..e0b0ad5567e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.corner.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.prune.corner +// Description:Zero-length line segments are removed before stroking with miters +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Zero-length line segments are removed before stroking with miters"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 400; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 1.4; +ctx.beginPath(); +ctx.moveTo(-1000, 200); +ctx.lineTo(-100, 200); +ctx.lineTo(-100, 200); +ctx.lineTo(-100, 200); +ctx.lineTo(-100, 1000); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.html new file mode 100644 index 00000000000..2f0dd1e658b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.prune.curve</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.prune.curve</h1> +<p class="desc">Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking</p> + + +<script> +var t = async_test("Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.quadraticCurveTo(50, 25, 50, 25); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.bezierCurveTo(50, 25, 50, 25, 50, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.worker.js new file mode 100644 index 00000000000..54d6955c353 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.prune.curve +// Description:Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.quadraticCurveTo(50, 25, 50, 25); +ctx.stroke(); +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.bezierCurveTo(50, 25, 50, 25, 50, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.line.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.line.html new file mode 100644 index 00000000000..2a659eabe0a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.line.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.prune.line</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.prune.line</h1> +<p class="desc">Zero-length line segments from lineTo are removed before stroking</p> + + +<script> +var t = async_test("Zero-length line segments from lineTo are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.lineTo(50, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.line.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.line.worker.js new file mode 100644 index 00000000000..8229f3417a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.line.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.prune.line +// Description:Zero-length line segments from lineTo are removed before stroking +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Zero-length line segments from lineTo are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.moveTo(50, 25); +ctx.lineTo(50, 25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.html new file mode 100644 index 00000000000..b4b4aeb0b65 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.prune.rect</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.prune.rect</h1> +<p class="desc">Zero-length line segments from rect and strokeRect are removed before stroking</p> + + +<script> +var t = async_test("Zero-length line segments from rect and strokeRect are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.rect(50, 25, 0, 0); +ctx.stroke(); +ctx.strokeRect(50, 25, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.worker.js new file mode 100644 index 00000000000..e3b2ff8372f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.prune.rect.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.prune.rect +// Description:Zero-length line segments from rect and strokeRect are removed before stroking +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Zero-length line segments from rect and strokeRect are removed before stroking"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 100; +ctx.lineCap = 'round'; +ctx.lineJoin = 'round'; +ctx.beginPath(); +ctx.rect(50, 25, 0, 0); +ctx.stroke(); +ctx.strokeRect(50, 25, 0, 0); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale1.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale1.html new file mode 100644 index 00000000000..61e9a7ea821 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale1.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.scale1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.scale1</h1> +<p class="desc">Stroke line widths are scaled by the current transformation matrix</p> + + +<script> +var t = async_test("Stroke line widths are scaled by the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(25, 12.5, 50, 25); +ctx.save(); +ctx.scale(50, 25); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +ctx.restore(); +ctx.beginPath(); +ctx.rect(-25, -12.5, 150, 75); +ctx.save(); +ctx.scale(50, 25); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale1.worker.js new file mode 100644 index 00000000000..e5fc8bcc923 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale1.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.scale1 +// Description:Stroke line widths are scaled by the current transformation matrix +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Stroke line widths are scaled by the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(25, 12.5, 50, 25); +ctx.save(); +ctx.scale(50, 25); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +ctx.restore(); +ctx.beginPath(); +ctx.rect(-25, -12.5, 150, 75); +ctx.save(); +ctx.scale(50, 25); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale2.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale2.html new file mode 100644 index 00000000000..0bc4c26d040 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale2.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.scale2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.scale2</h1> +<p class="desc">Stroke line widths are scaled by the current transformation matrix</p> + + +<script> +var t = async_test("Stroke line widths are scaled by the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(25, 12.5, 50, 25); +ctx.save(); +ctx.rotate(Math.PI/2); +ctx.scale(25, 50); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +ctx.restore(); +ctx.beginPath(); +ctx.rect(-25, -12.5, 150, 75); +ctx.save(); +ctx.rotate(Math.PI/2); +ctx.scale(25, 50); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale2.worker.js new file mode 100644 index 00000000000..b532fb7a3d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.scale2.worker.js @@ -0,0 +1,46 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.scale2 +// Description:Stroke line widths are scaled by the current transformation matrix +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Stroke line widths are scaled by the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.beginPath(); +ctx.rect(25, 12.5, 50, 25); +ctx.save(); +ctx.rotate(Math.PI/2); +ctx.scale(25, 50); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +ctx.restore(); +ctx.beginPath(); +ctx.rect(-25, -12.5, 150, 75); +ctx.save(); +ctx.rotate(Math.PI/2); +ctx.scale(25, 50); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.skew.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.skew.html new file mode 100644 index 00000000000..6220e7c54fc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.skew.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.skew</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.skew</h1> +<p class="desc">Strokes lines are skewed by the current transformation matrix</p> + + +<script> +var t = async_test("Strokes lines are skewed by the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.beginPath(); +ctx.moveTo(49, -50); +ctx.lineTo(201, -50); +ctx.rotate(Math.PI/4); +ctx.scale(1, 283); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +ctx.restore(); +ctx.save(); +ctx.beginPath(); +ctx.translate(-150, 0); +ctx.moveTo(49, -50); +ctx.lineTo(199, -50); +ctx.rotate(Math.PI/4); +ctx.scale(1, 142); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +ctx.save(); +ctx.beginPath(); +ctx.translate(-150, 0); +ctx.moveTo(49, -50); +ctx.lineTo(199, -50); +ctx.rotate(Math.PI/4); +ctx.scale(1, 142); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.skew.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.skew.worker.js new file mode 100644 index 00000000000..125c70c8edd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.skew.worker.js @@ -0,0 +1,59 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.skew +// Description:Strokes lines are skewed by the current transformation matrix +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Strokes lines are skewed by the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.beginPath(); +ctx.moveTo(49, -50); +ctx.lineTo(201, -50); +ctx.rotate(Math.PI/4); +ctx.scale(1, 283); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +ctx.restore(); +ctx.save(); +ctx.beginPath(); +ctx.translate(-150, 0); +ctx.moveTo(49, -50); +ctx.lineTo(199, -50); +ctx.rotate(Math.PI/4); +ctx.scale(1, 142); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +ctx.save(); +ctx.beginPath(); +ctx.translate(-150, 0); +ctx.moveTo(49, -50); +ctx.lineTo(199, -50); +ctx.rotate(Math.PI/4); +ctx.scale(1, 142); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.restore(); +_assertPixel(offscreenCanvas, 0,0, 0,255,0,255, "0,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,0, 0,255,0,255, "50,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,0, 0,255,0,255, "99,0", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,25, 0,255,0,255, "0,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,25, 0,255,0,255, "99,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 0,49, 0,255,0,255, "0,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,49, 0,255,0,255, "50,49", "0,255,0,255"); +_assertPixel(offscreenCanvas, 99,49, 0,255,0,255, "99,49", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.unaffected.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.unaffected.html new file mode 100644 index 00000000000..fc2dff941ba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.unaffected.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.unaffected</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.unaffected</h1> +<p class="desc">Stroking does not start a new path or subpath</p> + + +<script> +var t = async_test("Stroking does not start a new path or subpath"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-100, -100); +ctx.lineTo(200, -100); +ctx.lineTo(200, 25); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.closePath(); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.unaffected.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.unaffected.worker.js new file mode 100644 index 00000000000..6c3c16559b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.unaffected.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.unaffected +// Description:Stroking does not start a new path or subpath +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Stroking does not start a new path or subpath"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.lineWidth = 50; +ctx.moveTo(-100, 25); +ctx.lineTo(-100, -100); +ctx.lineTo(200, -100); +ctx.lineTo(200, 25); +ctx.strokeStyle = '#f00'; +ctx.stroke(); +ctx.closePath(); +ctx.strokeStyle = '#0f0'; +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.union.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.union.html new file mode 100644 index 00000000000..76884ca5467 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.union.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.stroke.union</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.stroke.union</h1> +<p class="desc">Strokes in opposite directions are unioned, not subtracted</p> + + +<script> +var t = async_test("Strokes in opposite directions are unioned, not subtracted"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 40; +ctx.moveTo(0, 10); +ctx.lineTo(100, 10); +ctx.moveTo(100, 40); +ctx.lineTo(0, 40); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.union.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.union.worker.js new file mode 100644 index 00000000000..0594b28cbf6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.stroke.union.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.stroke.union +// Description:Strokes in opposite directions are unioned, not subtracted +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Strokes in opposite directions are unioned, not subtracted"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#0f0'; +ctx.lineWidth = 40; +ctx.moveTo(0, 10); +ctx.lineTo(100, 10); +ctx.moveTo(100, 40); +ctx.lineTo(0, 40); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.basic.html new file mode 100644 index 00000000000..e7cb8ece4f1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.basic.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.transformation.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.transformation.basic</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(-100, 0); +ctx.rect(100, 0, 100, 50); +ctx.translate(0, -100); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.basic.worker.js new file mode 100644 index 00000000000..ac9bc1bb16a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.basic.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.transformation.basic +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(-100, 0); +ctx.rect(100, 0, 100, 50); +ctx.translate(0, -100); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.changing.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.changing.html new file mode 100644 index 00000000000..aba546b867e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.changing.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.transformation.changing</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.transformation.changing</h1> +<p class="desc">Transformations are applied while building paths, not when drawing</p> + + +<script> +var t = async_test("Transformations are applied while building paths, not when drawing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(0, 0); +ctx.translate(100, 0); +ctx.lineTo(0, 0); +ctx.translate(0, 50); +ctx.lineTo(0, 0); +ctx.translate(-100, 0); +ctx.lineTo(0, 0); +ctx.translate(1000, 1000); +ctx.rotate(Math.PI/2); +ctx.scale(0.1, 0.1); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.changing.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.changing.worker.js new file mode 100644 index 00000000000..2f8418dbedf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.changing.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.transformation.changing +// Description:Transformations are applied while building paths, not when drawing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Transformations are applied while building paths, not when drawing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.moveTo(0, 0); +ctx.translate(100, 0); +ctx.lineTo(0, 0); +ctx.translate(0, 50); +ctx.lineTo(0, 0); +ctx.translate(-100, 0); +ctx.lineTo(0, 0); +ctx.translate(1000, 1000); +ctx.rotate(Math.PI/2); +ctx.scale(0.1, 0.1); +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.multiple.html b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.multiple.html new file mode 100644 index 00000000000..7f38daed8a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.multiple.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.path.transformation.multiple</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.path.transformation.multiple</h1> +<p class="desc">Transformations are applied while building paths, not when drawing</p> + + +<script> +var t = async_test("Transformations are applied while building paths, not when drawing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.translate(-100, 0); +ctx.rect(0, 0, 100, 50); +ctx.fill(); +ctx.translate(100, 0); +ctx.fill(); +ctx.beginPath(); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.translate(0, -50); +ctx.moveTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +ctx.translate(0, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.multiple.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.multiple.worker.js new file mode 100644 index 00000000000..62bde63e915 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/path-objects/2d.path.transformation.multiple.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.path.transformation.multiple +// Description:Transformations are applied while building paths, not when drawing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Transformations are applied while building paths, not when drawing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.translate(-100, 0); +ctx.rect(0, 0, 100, 50); +ctx.fill(); +ctx.translate(100, 0); +ctx.fill(); +ctx.beginPath(); +ctx.strokeStyle = '#f00'; +ctx.lineWidth = 50; +ctx.translate(0, -50); +ctx.moveTo(0, 25); +ctx.lineTo(100, 25); +ctx.stroke(); +ctx.translate(0, 50); +ctx.stroke(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.html new file mode 100644 index 00000000000..8152cfc9732 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create1.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create1.basic</h1> +<p class="desc">createImageData(imgdata) exists and returns something</p> + + +<script> +var t = async_test("createImageData(imgdata) exists and returns something"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertDifferent(ctx.createImageData(ctx.createImageData(1, 1)), null, "ctx.createImageData(ctx.createImageData(1, 1))", "null"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.worker.js new file mode 100644 index 00000000000..250a161f322 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.basic.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create1.basic +// Description:createImageData(imgdata) exists and returns something +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(imgdata) exists and returns something"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertDifferent(ctx.createImageData(ctx.createImageData(1, 1)), null, "ctx.createImageData(ctx.createImageData(1, 1))", "null"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.html new file mode 100644 index 00000000000..a385d72e397 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create1.initial</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create1.initial</h1> +<p class="desc">createImageData(imgdata) returns transparent black data of the right size</p> + + +<script> +var t = async_test("createImageData(imgdata) returns transparent black data of the right size"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var imgdata1 = ctx.getImageData(0, 0, 10, 20); +var imgdata2 = ctx.createImageData(imgdata1); +_assertSame(imgdata2.data.length, imgdata1.data.length, "imgdata2.data.length", "imgdata1.data.length"); +_assertSame(imgdata2.width, imgdata1.width, "imgdata2.width", "imgdata1.width"); +_assertSame(imgdata2.height, imgdata1.height, "imgdata2.height", "imgdata1.height"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata2.data.length; ++i) + if (imgdata2.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.worker.js new file mode 100644 index 00000000000..da0543c4495 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.initial.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create1.initial +// Description:createImageData(imgdata) returns transparent black data of the right size +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(imgdata) returns transparent black data of the right size"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +var imgdata1 = ctx.getImageData(0, 0, 10, 20); +var imgdata2 = ctx.createImageData(imgdata1); +_assertSame(imgdata2.data.length, imgdata1.data.length, "imgdata2.data.length", "imgdata1.data.length"); +_assertSame(imgdata2.width, imgdata1.width, "imgdata2.width", "imgdata1.width"); +_assertSame(imgdata2.height, imgdata1.height, "imgdata2.height", "imgdata1.height"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata2.data.length; ++i) + if (imgdata2.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.html new file mode 100644 index 00000000000..bbcadad31c5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create1.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create1.zero</h1> +<p class="desc">createImageData(null) throws TypeError</p> + + +<script> +var t = async_test("createImageData(null) throws TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createImageData(null); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.worker.js new file mode 100644 index 00000000000..f3bed8488e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create1.zero.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create1.zero +// Description:createImageData(null) throws TypeError +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(null) throws TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createImageData(null); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.html new file mode 100644 index 00000000000..13cb5de4ccd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.basic</h1> +<p class="desc">createImageData(sw, sh) exists and returns something</p> + + +<script> +var t = async_test("createImageData(sw, sh) exists and returns something"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertDifferent(ctx.createImageData(1, 1), null, "ctx.createImageData(1, 1)", "null"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.worker.js new file mode 100644 index 00000000000..82190d6cb0b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.basic.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.basic +// Description:createImageData(sw, sh) exists and returns something +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(sw, sh) exists and returns something"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertDifferent(ctx.createImageData(1, 1), null, "ctx.createImageData(1, 1)", "null"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.html new file mode 100644 index 00000000000..e7ced9d2166 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.initial</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.initial</h1> +<p class="desc">createImageData(sw, sh) returns transparent black data of the right size</p> + + +<script> +var t = async_test("createImageData(sw, sh) returns transparent black data of the right size"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(10, 20); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assert(imgdata.width < imgdata.height, "imgdata.width < imgdata.height"); +_assert(imgdata.width > 0, "imgdata.width > 0"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata.data.length; ++i) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.worker.js new file mode 100644 index 00000000000..d3fea24d586 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.initial.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.initial +// Description:createImageData(sw, sh) returns transparent black data of the right size +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(sw, sh) returns transparent black data of the right size"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(10, 20); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assert(imgdata.width < imgdata.height, "imgdata.width < imgdata.height"); +_assert(imgdata.width > 0, "imgdata.width > 0"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata.data.length; ++i) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.html new file mode 100644 index 00000000000..25d49052bb4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.large</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.large</h1> +<p class="desc">createImageData(sw, sh) works for sizes much larger than the canvas</p> + + +<script> +var t = async_test("createImageData(sw, sh) works for sizes much larger than the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(1000, 2000); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assert(imgdata.width < imgdata.height, "imgdata.width < imgdata.height"); +_assert(imgdata.width > 0, "imgdata.width > 0"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata.data.length; i += 7813) // check ~1024 points (assuming normal scaling) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.worker.js new file mode 100644 index 00000000000..d8ae14cf4b2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.large.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.large +// Description:createImageData(sw, sh) works for sizes much larger than the canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(sw, sh) works for sizes much larger than the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(1000, 2000); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assert(imgdata.width < imgdata.height, "imgdata.width < imgdata.height"); +_assert(imgdata.width > 0, "imgdata.width > 0"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata.data.length; i += 7813) // check ~1024 points (assuming normal scaling) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.html new file mode 100644 index 00000000000..d5c42efea7b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.negative</h1> +<p class="desc">createImageData(sw, sh) takes the absolute magnitude of the size arguments</p> + + +<script> +var t = async_test("createImageData(sw, sh) takes the absolute magnitude of the size arguments"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata1 = ctx.createImageData(10, 20); +var imgdata2 = ctx.createImageData(-10, 20); +var imgdata3 = ctx.createImageData(10, -20); +var imgdata4 = ctx.createImageData(-10, -20); +_assertSame(imgdata1.data.length, imgdata2.data.length, "imgdata1.data.length", "imgdata2.data.length"); +_assertSame(imgdata2.data.length, imgdata3.data.length, "imgdata2.data.length", "imgdata3.data.length"); +_assertSame(imgdata3.data.length, imgdata4.data.length, "imgdata3.data.length", "imgdata4.data.length"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.worker.js new file mode 100644 index 00000000000..11f1641ab59 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.negative.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.negative +// Description:createImageData(sw, sh) takes the absolute magnitude of the size arguments +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(sw, sh) takes the absolute magnitude of the size arguments"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata1 = ctx.createImageData(10, 20); +var imgdata2 = ctx.createImageData(-10, 20); +var imgdata3 = ctx.createImageData(10, -20); +var imgdata4 = ctx.createImageData(-10, -20); +_assertSame(imgdata1.data.length, imgdata2.data.length, "imgdata1.data.length", "imgdata2.data.length"); +_assertSame(imgdata2.data.length, imgdata3.data.length, "imgdata2.data.length", "imgdata3.data.length"); +_assertSame(imgdata3.data.length, imgdata4.data.length, "imgdata3.data.length", "imgdata4.data.length"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.html new file mode 100644 index 00000000000..ae36fc72aa4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.nonfinite</h1> +<p class="desc">createImageData() throws TypeError if arguments are not finite</p> + + +<script> +var t = async_test("createImageData() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createImageData(Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(-Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, NaN); }); +assert_throws(new TypeError(), function() { ctx.createImageData(Infinity, Infinity); }); +var posinfobj = { valueOf: function() { return Infinity; } }, + neginfobj = { valueOf: function() { return -Infinity; } }, + nanobj = { valueOf: function() { return -Infinity; } }; +assert_throws(new TypeError(), function() { ctx.createImageData(posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(neginfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(nanobj, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, neginfobj); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, nanobj); }); +assert_throws(new TypeError(), function() { ctx.createImageData(posinfobj, posinfobj); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.worker.js new file mode 100644 index 00000000000..0609d05951d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.nonfinite +// Description:createImageData() throws TypeError if arguments are not finite +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.createImageData(Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(-Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, NaN); }); +assert_throws(new TypeError(), function() { ctx.createImageData(Infinity, Infinity); }); +var posinfobj = { valueOf: function() { return Infinity; } }, + neginfobj = { valueOf: function() { return -Infinity; } }, + nanobj = { valueOf: function() { return -Infinity; } }; +assert_throws(new TypeError(), function() { ctx.createImageData(posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(neginfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(nanobj, 10); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, neginfobj); }); +assert_throws(new TypeError(), function() { ctx.createImageData(10, nanobj); }); +assert_throws(new TypeError(), function() { ctx.createImageData(posinfobj, posinfobj); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.html new file mode 100644 index 00000000000..2d59eff38b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.round</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.round</h1> +<p class="desc">createImageData(w, h) is rounded the same as getImageData(0, 0, w, h)</p> + + +<script> +var t = async_test("createImageData(w, h) is rounded the same as getImageData(0, 0, w, h)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata1 = ctx.createImageData(10.01, 10.99); +var imgdata2 = ctx.getImageData(0, 0, 10.01, 10.99); +_assertSame(imgdata1.width, imgdata2.width, "imgdata1.width", "imgdata2.width"); +_assertSame(imgdata1.height, imgdata2.height, "imgdata1.height", "imgdata2.height"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.worker.js new file mode 100644 index 00000000000..b0c4a03ccb6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.round.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.round +// Description:createImageData(w, h) is rounded the same as getImageData(0, 0, w, h) +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(w, h) is rounded the same as getImageData(0, 0, w, h)"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata1 = ctx.createImageData(10.01, 10.99); +var imgdata2 = ctx.getImageData(0, 0, 10.01, 10.99); +_assertSame(imgdata1.width, imgdata2.width, "imgdata1.width", "imgdata2.width"); +_assertSame(imgdata1.height, imgdata2.height, "imgdata1.height", "imgdata2.height"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.html new file mode 100644 index 00000000000..5f5f0eda6a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.tiny</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.tiny</h1> +<p class="desc">createImageData(sw, sh) works for sizes smaller than one pixel</p> + + +<script> +var t = async_test("createImageData(sw, sh) works for sizes smaller than one pixel"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(0.0001, 0.0001); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assertSame(imgdata.width, 1, "imgdata.width", "1"); +_assertSame(imgdata.height, 1, "imgdata.height", "1"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata.data.length; ++i) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.worker.js new file mode 100644 index 00000000000..c6c74d7abac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.tiny.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.tiny +// Description:createImageData(sw, sh) works for sizes smaller than one pixel +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(sw, sh) works for sizes smaller than one pixel"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(0.0001, 0.0001); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assertSame(imgdata.width, 1, "imgdata.width", "1"); +_assertSame(imgdata.height, 1, "imgdata.height", "1"); +var isTransparentBlack = true; +for (var i = 0; i < imgdata.data.length; ++i) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; +_assert(isTransparentBlack, "isTransparentBlack"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.html new file mode 100644 index 00000000000..8c88cc9b6fb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.create2.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.create2.zero</h1> +<p class="desc">createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero</p> + + +<script> +var t = async_test("createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.createImageData(10, 0); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createImageData(0, 10); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createImageData(0, 0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.worker.js new file mode 100644 index 00000000000..cf54b3c6efb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.create2.zero.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.create2.zero +// Description:createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.createImageData(10, 0); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createImageData(0, 10); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.createImageData(0, 0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.html new file mode 100644 index 00000000000..cfb5e3c2ba5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.basic</h1> +<p class="desc">getImageData() exists and returns something</p> + + +<script> +var t = async_test("getImageData() exists and returns something"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertDifferent(ctx.getImageData(0, 0, 100, 50), null, "ctx.getImageData(0, 0, 100, 50)", "null"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.worker.js new file mode 100644 index 00000000000..6824945d9f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.basic.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.basic +// Description:getImageData() exists and returns something +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() exists and returns something"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertDifferent(ctx.getImageData(0, 0, 100, 50), null, "ctx.getImageData(0, 0, 100, 50)", "null"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.html new file mode 100644 index 00000000000..c5e189b7bf5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.clamp</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.clamp</h1> +<p class="desc">getImageData() clamps colours to the range [0, 255]</p> + + +<script> +var t = async_test("getImageData() clamps colours to the range [0, 255]"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgb(-100, -200, -300)'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = 'rgb(256, 300, 400)'; +ctx.fillRect(20, 10, 60, 10); +var imgdata1 = ctx.getImageData(10, 5, 1, 1); +_assertSame(imgdata1.data[0], 0, "imgdata1.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata1.data[1], 0, "imgdata1.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata1.data[2], 0, "imgdata1.data[\""+(2)+"\"]", "0"); +var imgdata2 = ctx.getImageData(30, 15, 1, 1); +_assertSame(imgdata2.data[0], 255, "imgdata2.data[\""+(0)+"\"]", "255"); +_assertSame(imgdata2.data[1], 255, "imgdata2.data[\""+(1)+"\"]", "255"); +_assertSame(imgdata2.data[2], 255, "imgdata2.data[\""+(2)+"\"]", "255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.worker.js new file mode 100644 index 00000000000..97a2a147776 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.clamp.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.clamp +// Description:getImageData() clamps colours to the range [0, 255] +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() clamps colours to the range [0, 255]"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgb(-100, -200, -300)'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = 'rgb(256, 300, 400)'; +ctx.fillRect(20, 10, 60, 10); +var imgdata1 = ctx.getImageData(10, 5, 1, 1); +_assertSame(imgdata1.data[0], 0, "imgdata1.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata1.data[1], 0, "imgdata1.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata1.data[2], 0, "imgdata1.data[\""+(2)+"\"]", "0"); +var imgdata2 = ctx.getImageData(30, 15, 1, 1); +_assertSame(imgdata2.data[0], 255, "imgdata2.data[\""+(0)+"\"]", "255"); +_assertSame(imgdata2.data[1], 255, "imgdata2.data[\""+(1)+"\"]", "255"); +_assertSame(imgdata2.data[2], 255, "imgdata2.data[\""+(2)+"\"]", "255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.html new file mode 100644 index 00000000000..c9516d7a735 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.length</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.length</h1> +<p class="desc">getImageData() returns a correctly-sized Uint8ClampedArray</p> + + +<script> +var t = async_test("getImageData() returns a correctly-sized Uint8ClampedArray"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.worker.js new file mode 100644 index 00000000000..f8a08e28642 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.length.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.length +// Description:getImageData() returns a correctly-sized Uint8ClampedArray +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns a correctly-sized Uint8ClampedArray"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.html new file mode 100644 index 00000000000..ab90a831f9c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.nonfinite</h1> +<p class="desc">getImageData() throws TypeError if arguments are not finite</p> + + +<script> +var t = async_test("getImageData() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(-Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(NaN, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, -Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, NaN, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, -Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, NaN); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, Infinity, Infinity); }); +var posinfobj = { valueOf: function() { return Infinity; } }, + neginfobj = { valueOf: function() { return -Infinity; } }, + nanobj = { valueOf: function() { return -Infinity; } }; +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(neginfobj, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(nanobj, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, neginfobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, nanobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, neginfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, nanobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, neginfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, nanobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, posinfobj, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, posinfobj, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, posinfobj, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, posinfobj, posinfobj); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.worker.js new file mode 100644 index 00000000000..bfd5fb038af --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonfinite.worker.js @@ -0,0 +1,68 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.nonfinite +// Description:getImageData() throws TypeError if arguments are not finite +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(-Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(NaN, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, -Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, NaN, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, -Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, NaN); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, Infinity, Infinity); }); +var posinfobj = { valueOf: function() { return Infinity; } }, + neginfobj = { valueOf: function() { return -Infinity; } }, + nanobj = { valueOf: function() { return -Infinity; } }; +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(neginfobj, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(nanobj, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, neginfobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, nanobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, neginfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, nanobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, neginfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, 10, nanobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, posinfobj, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, posinfobj, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, posinfobj, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(posinfobj, 10, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, posinfobj, 10); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, posinfobj, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, posinfobj, 10, posinfobj); }); +assert_throws(new TypeError(), function() { ctx.getImageData(10, 10, posinfobj, posinfobj); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.html new file mode 100644 index 00000000000..473d6f6efaa --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.nonpremul</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.nonpremul</h1> +<p class="desc">getImageData() returns non-premultiplied colours</p> + + +<script> +var t = async_test("getImageData() returns non-premultiplied colours"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +var imgdata = ctx.getImageData(10, 10, 10, 10); +_assert(imgdata.data[0] > 200, "imgdata.data[\""+(0)+"\"] > 200"); +_assert(imgdata.data[1] > 200, "imgdata.data[\""+(1)+"\"] > 200"); +_assert(imgdata.data[2] > 200, "imgdata.data[\""+(2)+"\"] > 200"); +_assert(imgdata.data[3] > 100, "imgdata.data[\""+(3)+"\"] > 100"); +_assert(imgdata.data[3] < 200, "imgdata.data[\""+(3)+"\"] < 200"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.worker.js new file mode 100644 index 00000000000..6d85a5c128e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.nonpremul.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.nonpremul +// Description:getImageData() returns non-premultiplied colours +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns non-premultiplied colours"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +var imgdata = ctx.getImageData(10, 10, 10, 10); +_assert(imgdata.data[0] > 200, "imgdata.data[\""+(0)+"\"] > 200"); +_assert(imgdata.data[1] > 200, "imgdata.data[\""+(1)+"\"] > 200"); +_assert(imgdata.data[2] > 200, "imgdata.data[\""+(2)+"\"] > 200"); +_assert(imgdata.data[3] > 100, "imgdata.data[\""+(3)+"\"] > 100"); +_assert(imgdata.data[3] < 200, "imgdata.data[\""+(3)+"\"] < 200"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.html new file mode 100644 index 00000000000..4bf30c08df4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.order.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.order.alpha</h1> +<p class="desc">getImageData() returns A in the fourth component</p> + + +<script> +var t = async_test("getImageData() returns A in the fourth component"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assert(imgdata.data[3] < 200, "imgdata.data[\""+(3)+"\"] < 200"); +_assert(imgdata.data[3] > 100, "imgdata.data[\""+(3)+"\"] > 100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.worker.js new file mode 100644 index 00000000000..611a9c7781f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.alpha.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.order.alpha +// Description:getImageData() returns A in the fourth component +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns A in the fourth component"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; +ctx.fillRect(0, 0, 100, 50); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assert(imgdata.data[3] < 200, "imgdata.data[\""+(3)+"\"] < 200"); +_assert(imgdata.data[3] > 100, "imgdata.data[\""+(3)+"\"] > 100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.html new file mode 100644 index 00000000000..d3abec38a24 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.order.cols</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.order.cols</h1> +<p class="desc">getImageData() returns leftmost columns first</p> + + +<script> +var t = async_test("getImageData() returns leftmost columns first"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#fff'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 2, 50); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata.data[Math.round(imgdata.width/2*4)], 255, "imgdata.data[Math.round(imgdata.width/2*4)]", "255"); +_assertSame(imgdata.data[Math.round((imgdata.height/2)*imgdata.width*4)], 0, "imgdata.data[Math.round((imgdata.height/2)*imgdata.width*4)]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.worker.js new file mode 100644 index 00000000000..c3a7d250464 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.cols.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.order.cols +// Description:getImageData() returns leftmost columns first +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns leftmost columns first"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#fff'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 2, 50); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata.data[Math.round(imgdata.width/2*4)], 255, "imgdata.data[Math.round(imgdata.width/2*4)]", "255"); +_assertSame(imgdata.data[Math.round((imgdata.height/2)*imgdata.width*4)], 0, "imgdata.data[Math.round((imgdata.height/2)*imgdata.width*4)]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.html new file mode 100644 index 00000000000..ce81521bccc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.order.rgb</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.order.rgb</h1> +<p class="desc">getImageData() returns R then G then B</p> + + +<script> +var t = async_test("getImageData() returns R then G then B"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#48c'; +ctx.fillRect(0, 0, 100, 50); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data[0], 0x44, "imgdata.data[\""+(0)+"\"]", "0x44"); +_assertSame(imgdata.data[1], 0x88, "imgdata.data[\""+(1)+"\"]", "0x88"); +_assertSame(imgdata.data[2], 0xCC, "imgdata.data[\""+(2)+"\"]", "0xCC"); +_assertSame(imgdata.data[3], 255, "imgdata.data[\""+(3)+"\"]", "255"); +_assertSame(imgdata.data[4], 0x44, "imgdata.data[\""+(4)+"\"]", "0x44"); +_assertSame(imgdata.data[5], 0x88, "imgdata.data[\""+(5)+"\"]", "0x88"); +_assertSame(imgdata.data[6], 0xCC, "imgdata.data[\""+(6)+"\"]", "0xCC"); +_assertSame(imgdata.data[7], 255, "imgdata.data[\""+(7)+"\"]", "255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.worker.js new file mode 100644 index 00000000000..654ea19f6dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rgb.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.order.rgb +// Description:getImageData() returns R then G then B +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns R then G then B"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#48c'; +ctx.fillRect(0, 0, 100, 50); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data[0], 0x44, "imgdata.data[\""+(0)+"\"]", "0x44"); +_assertSame(imgdata.data[1], 0x88, "imgdata.data[\""+(1)+"\"]", "0x88"); +_assertSame(imgdata.data[2], 0xCC, "imgdata.data[\""+(2)+"\"]", "0xCC"); +_assertSame(imgdata.data[3], 255, "imgdata.data[\""+(3)+"\"]", "255"); +_assertSame(imgdata.data[4], 0x44, "imgdata.data[\""+(4)+"\"]", "0x44"); +_assertSame(imgdata.data[5], 0x88, "imgdata.data[\""+(5)+"\"]", "0x88"); +_assertSame(imgdata.data[6], 0xCC, "imgdata.data[\""+(6)+"\"]", "0xCC"); +_assertSame(imgdata.data[7], 255, "imgdata.data[\""+(7)+"\"]", "255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.html new file mode 100644 index 00000000000..ba8a740cf49 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.order.rows</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.order.rows</h1> +<p class="desc">getImageData() returns topmost rows first</p> + + +<script> +var t = async_test("getImageData() returns topmost rows first"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#fff'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 2); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata.data[Math.floor(imgdata.width/2*4)], 0, "imgdata.data[Math.floor(imgdata.width/2*4)]", "0"); +_assertSame(imgdata.data[(imgdata.height/2)*imgdata.width*4], 255, "imgdata.data[(imgdata.height/2)*imgdata.width*4]", "255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.worker.js new file mode 100644 index 00000000000..9fb23e6a046 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.order.rows.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.order.rows +// Description:getImageData() returns topmost rows first +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns topmost rows first"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#fff'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 2); +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata.data[Math.floor(imgdata.width/2*4)], 0, "imgdata.data[Math.floor(imgdata.width/2*4)]", "0"); +_assertSame(imgdata.data[(imgdata.height/2)*imgdata.width*4], 255, "imgdata.data[(imgdata.height/2)*imgdata.width*4]", "255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.html new file mode 100644 index 00000000000..9a19b651f7a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.range</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.range</h1> +<p class="desc">getImageData() returns values in the range [0, 255]</p> + + +<script> +var t = async_test("getImageData() returns values in the range [0, 255]"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#fff'; +ctx.fillRect(20, 10, 60, 10); +var imgdata1 = ctx.getImageData(10, 5, 1, 1); +_assertSame(imgdata1.data[0], 0, "imgdata1.data[\""+(0)+"\"]", "0"); +var imgdata2 = ctx.getImageData(30, 15, 1, 1); +_assertSame(imgdata2.data[0], 255, "imgdata2.data[\""+(0)+"\"]", "255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.worker.js new file mode 100644 index 00000000000..5cac707ac96 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.range.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.range +// Description:getImageData() returns values in the range [0, 255] +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns values in the range [0, 255]"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#fff'; +ctx.fillRect(20, 10, 60, 10); +var imgdata1 = ctx.getImageData(10, 5, 1, 1); +_assertSame(imgdata1.data[0], 0, "imgdata1.data[\""+(0)+"\"]", "0"); +var imgdata2 = ctx.getImageData(30, 15, 1, 1); +_assertSame(imgdata2.data[0], 255, "imgdata2.data[\""+(0)+"\"]", "255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.html new file mode 100644 index 00000000000..b6d47a228e7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.source.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.source.negative</h1> +<p class="desc">getImageData() works with negative width and height, and returns top-to-bottom left-to-right</p> + + +<script> +var t = async_test("getImageData() works with negative width and height, and returns top-to-bottom left-to-right"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#fff'; +ctx.fillRect(20, 10, 60, 10); +var imgdata1 = ctx.getImageData(85, 25, -10, -10); +_assertSame(imgdata1.data[0], 255, "imgdata1.data[\""+(0)+"\"]", "255"); +_assertSame(imgdata1.data[1], 255, "imgdata1.data[\""+(1)+"\"]", "255"); +_assertSame(imgdata1.data[2], 255, "imgdata1.data[\""+(2)+"\"]", "255"); +_assertSame(imgdata1.data[3], 255, "imgdata1.data[\""+(3)+"\"]", "255"); +_assertSame(imgdata1.data[imgdata1.data.length-4+0], 0, "imgdata1.data[imgdata1.data.length-4+0]", "0"); +_assertSame(imgdata1.data[imgdata1.data.length-4+1], 0, "imgdata1.data[imgdata1.data.length-4+1]", "0"); +_assertSame(imgdata1.data[imgdata1.data.length-4+2], 0, "imgdata1.data[imgdata1.data.length-4+2]", "0"); +_assertSame(imgdata1.data[imgdata1.data.length-4+3], 255, "imgdata1.data[imgdata1.data.length-4+3]", "255"); +var imgdata2 = ctx.getImageData(0, 0, -1, -1); +_assertSame(imgdata2.data[0], 0, "imgdata2.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata2.data[1], 0, "imgdata2.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata2.data[2], 0, "imgdata2.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata2.data[3], 0, "imgdata2.data[\""+(3)+"\"]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.worker.js new file mode 100644 index 00000000000..ed83ee57082 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.negative.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.source.negative +// Description:getImageData() works with negative width and height, and returns top-to-bottom left-to-right +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() works with negative width and height, and returns top-to-bottom left-to-right"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#000'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#fff'; +ctx.fillRect(20, 10, 60, 10); +var imgdata1 = ctx.getImageData(85, 25, -10, -10); +_assertSame(imgdata1.data[0], 255, "imgdata1.data[\""+(0)+"\"]", "255"); +_assertSame(imgdata1.data[1], 255, "imgdata1.data[\""+(1)+"\"]", "255"); +_assertSame(imgdata1.data[2], 255, "imgdata1.data[\""+(2)+"\"]", "255"); +_assertSame(imgdata1.data[3], 255, "imgdata1.data[\""+(3)+"\"]", "255"); +_assertSame(imgdata1.data[imgdata1.data.length-4+0], 0, "imgdata1.data[imgdata1.data.length-4+0]", "0"); +_assertSame(imgdata1.data[imgdata1.data.length-4+1], 0, "imgdata1.data[imgdata1.data.length-4+1]", "0"); +_assertSame(imgdata1.data[imgdata1.data.length-4+2], 0, "imgdata1.data[imgdata1.data.length-4+2]", "0"); +_assertSame(imgdata1.data[imgdata1.data.length-4+3], 255, "imgdata1.data[imgdata1.data.length-4+3]", "255"); +var imgdata2 = ctx.getImageData(0, 0, -1, -1); +_assertSame(imgdata2.data[0], 0, "imgdata2.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata2.data[1], 0, "imgdata2.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata2.data[2], 0, "imgdata2.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata2.data[3], 0, "imgdata2.data[\""+(3)+"\"]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.html new file mode 100644 index 00000000000..0190a1f22c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.html @@ -0,0 +1,76 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.source.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.source.outside</h1> +<p class="desc">getImageData() returns transparent black outside the canvas</p> + + +<script> +var t = async_test("getImageData() returns transparent black outside the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#08f'; +ctx.fillRect(0, 0, 100, 50); +var imgdata1 = ctx.getImageData(-10, 5, 1, 1); +_assertSame(imgdata1.data[0], 0, "imgdata1.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata1.data[1], 0, "imgdata1.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata1.data[2], 0, "imgdata1.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata1.data[3], 0, "imgdata1.data[\""+(3)+"\"]", "0"); +var imgdata2 = ctx.getImageData(10, -5, 1, 1); +_assertSame(imgdata2.data[0], 0, "imgdata2.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata2.data[1], 0, "imgdata2.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata2.data[2], 0, "imgdata2.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata2.data[3], 0, "imgdata2.data[\""+(3)+"\"]", "0"); +var imgdata3 = ctx.getImageData(200, 5, 1, 1); +_assertSame(imgdata3.data[0], 0, "imgdata3.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata3.data[1], 0, "imgdata3.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata3.data[2], 0, "imgdata3.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata3.data[3], 0, "imgdata3.data[\""+(3)+"\"]", "0"); +var imgdata4 = ctx.getImageData(10, 60, 1, 1); +_assertSame(imgdata4.data[0], 0, "imgdata4.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata4.data[1], 0, "imgdata4.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata4.data[2], 0, "imgdata4.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata4.data[3], 0, "imgdata4.data[\""+(3)+"\"]", "0"); +var imgdata5 = ctx.getImageData(100, 10, 1, 1); +_assertSame(imgdata5.data[0], 0, "imgdata5.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata5.data[1], 0, "imgdata5.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata5.data[2], 0, "imgdata5.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata5.data[3], 0, "imgdata5.data[\""+(3)+"\"]", "0"); +var imgdata6 = ctx.getImageData(0, 10, 1, 1); +_assertSame(imgdata6.data[0], 0, "imgdata6.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata6.data[1], 136, "imgdata6.data[\""+(1)+"\"]", "136"); +_assertSame(imgdata6.data[2], 255, "imgdata6.data[\""+(2)+"\"]", "255"); +_assertSame(imgdata6.data[3], 255, "imgdata6.data[\""+(3)+"\"]", "255"); +var imgdata7 = ctx.getImageData(-10, 10, 20, 20); +_assertSame(imgdata7.data[ 0*4+0], 0, "imgdata7.data[ 0*4+0]", "0"); +_assertSame(imgdata7.data[ 0*4+1], 0, "imgdata7.data[ 0*4+1]", "0"); +_assertSame(imgdata7.data[ 0*4+2], 0, "imgdata7.data[ 0*4+2]", "0"); +_assertSame(imgdata7.data[ 0*4+3], 0, "imgdata7.data[ 0*4+3]", "0"); +_assertSame(imgdata7.data[ 9*4+0], 0, "imgdata7.data[ 9*4+0]", "0"); +_assertSame(imgdata7.data[ 9*4+1], 0, "imgdata7.data[ 9*4+1]", "0"); +_assertSame(imgdata7.data[ 9*4+2], 0, "imgdata7.data[ 9*4+2]", "0"); +_assertSame(imgdata7.data[ 9*4+3], 0, "imgdata7.data[ 9*4+3]", "0"); +_assertSame(imgdata7.data[10*4+0], 0, "imgdata7.data[10*4+0]", "0"); +_assertSame(imgdata7.data[10*4+1], 136, "imgdata7.data[10*4+1]", "136"); +_assertSame(imgdata7.data[10*4+2], 255, "imgdata7.data[10*4+2]", "255"); +_assertSame(imgdata7.data[10*4+3], 255, "imgdata7.data[10*4+3]", "255"); +_assertSame(imgdata7.data[19*4+0], 0, "imgdata7.data[19*4+0]", "0"); +_assertSame(imgdata7.data[19*4+1], 136, "imgdata7.data[19*4+1]", "136"); +_assertSame(imgdata7.data[19*4+2], 255, "imgdata7.data[19*4+2]", "255"); +_assertSame(imgdata7.data[19*4+3], 255, "imgdata7.data[19*4+3]", "255"); +_assertSame(imgdata7.data[20*4+0], 0, "imgdata7.data[20*4+0]", "0"); +_assertSame(imgdata7.data[20*4+1], 0, "imgdata7.data[20*4+1]", "0"); +_assertSame(imgdata7.data[20*4+2], 0, "imgdata7.data[20*4+2]", "0"); +_assertSame(imgdata7.data[20*4+3], 0, "imgdata7.data[20*4+3]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.worker.js new file mode 100644 index 00000000000..0cc5fd4a24e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.outside.worker.js @@ -0,0 +1,72 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.source.outside +// Description:getImageData() returns transparent black outside the canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns transparent black outside the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#08f'; +ctx.fillRect(0, 0, 100, 50); +var imgdata1 = ctx.getImageData(-10, 5, 1, 1); +_assertSame(imgdata1.data[0], 0, "imgdata1.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata1.data[1], 0, "imgdata1.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata1.data[2], 0, "imgdata1.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata1.data[3], 0, "imgdata1.data[\""+(3)+"\"]", "0"); +var imgdata2 = ctx.getImageData(10, -5, 1, 1); +_assertSame(imgdata2.data[0], 0, "imgdata2.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata2.data[1], 0, "imgdata2.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata2.data[2], 0, "imgdata2.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata2.data[3], 0, "imgdata2.data[\""+(3)+"\"]", "0"); +var imgdata3 = ctx.getImageData(200, 5, 1, 1); +_assertSame(imgdata3.data[0], 0, "imgdata3.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata3.data[1], 0, "imgdata3.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata3.data[2], 0, "imgdata3.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata3.data[3], 0, "imgdata3.data[\""+(3)+"\"]", "0"); +var imgdata4 = ctx.getImageData(10, 60, 1, 1); +_assertSame(imgdata4.data[0], 0, "imgdata4.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata4.data[1], 0, "imgdata4.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata4.data[2], 0, "imgdata4.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata4.data[3], 0, "imgdata4.data[\""+(3)+"\"]", "0"); +var imgdata5 = ctx.getImageData(100, 10, 1, 1); +_assertSame(imgdata5.data[0], 0, "imgdata5.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata5.data[1], 0, "imgdata5.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata5.data[2], 0, "imgdata5.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata5.data[3], 0, "imgdata5.data[\""+(3)+"\"]", "0"); +var imgdata6 = ctx.getImageData(0, 10, 1, 1); +_assertSame(imgdata6.data[0], 0, "imgdata6.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata6.data[1], 136, "imgdata6.data[\""+(1)+"\"]", "136"); +_assertSame(imgdata6.data[2], 255, "imgdata6.data[\""+(2)+"\"]", "255"); +_assertSame(imgdata6.data[3], 255, "imgdata6.data[\""+(3)+"\"]", "255"); +var imgdata7 = ctx.getImageData(-10, 10, 20, 20); +_assertSame(imgdata7.data[ 0*4+0], 0, "imgdata7.data[ 0*4+0]", "0"); +_assertSame(imgdata7.data[ 0*4+1], 0, "imgdata7.data[ 0*4+1]", "0"); +_assertSame(imgdata7.data[ 0*4+2], 0, "imgdata7.data[ 0*4+2]", "0"); +_assertSame(imgdata7.data[ 0*4+3], 0, "imgdata7.data[ 0*4+3]", "0"); +_assertSame(imgdata7.data[ 9*4+0], 0, "imgdata7.data[ 9*4+0]", "0"); +_assertSame(imgdata7.data[ 9*4+1], 0, "imgdata7.data[ 9*4+1]", "0"); +_assertSame(imgdata7.data[ 9*4+2], 0, "imgdata7.data[ 9*4+2]", "0"); +_assertSame(imgdata7.data[ 9*4+3], 0, "imgdata7.data[ 9*4+3]", "0"); +_assertSame(imgdata7.data[10*4+0], 0, "imgdata7.data[10*4+0]", "0"); +_assertSame(imgdata7.data[10*4+1], 136, "imgdata7.data[10*4+1]", "136"); +_assertSame(imgdata7.data[10*4+2], 255, "imgdata7.data[10*4+2]", "255"); +_assertSame(imgdata7.data[10*4+3], 255, "imgdata7.data[10*4+3]", "255"); +_assertSame(imgdata7.data[19*4+0], 0, "imgdata7.data[19*4+0]", "0"); +_assertSame(imgdata7.data[19*4+1], 136, "imgdata7.data[19*4+1]", "136"); +_assertSame(imgdata7.data[19*4+2], 255, "imgdata7.data[19*4+2]", "255"); +_assertSame(imgdata7.data[19*4+3], 255, "imgdata7.data[19*4+3]", "255"); +_assertSame(imgdata7.data[20*4+0], 0, "imgdata7.data[20*4+0]", "0"); +_assertSame(imgdata7.data[20*4+1], 0, "imgdata7.data[20*4+1]", "0"); +_assertSame(imgdata7.data[20*4+2], 0, "imgdata7.data[20*4+2]", "0"); +_assertSame(imgdata7.data[20*4+3], 0, "imgdata7.data[20*4+3]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.html new file mode 100644 index 00000000000..e95dd5565eb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.source.size</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.source.size</h1> +<p class="desc">getImageData() returns bigger ImageData for bigger source rectangle</p> + + +<script> +var t = async_test("getImageData() returns bigger ImageData for bigger source rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata1 = ctx.getImageData(0, 0, 10, 10); +var imgdata2 = ctx.getImageData(0, 0, 20, 20); +_assert(imgdata2.width > imgdata1.width, "imgdata2.width > imgdata1.width"); +_assert(imgdata2.height > imgdata1.height, "imgdata2.height > imgdata1.height"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.worker.js new file mode 100644 index 00000000000..bb8c105a685 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.source.size.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.source.size +// Description:getImageData() returns bigger ImageData for bigger source rectangle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() returns bigger ImageData for bigger source rectangle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata1 = ctx.getImageData(0, 0, 10, 10); +var imgdata2 = ctx.getImageData(0, 0, 20, 20); +_assert(imgdata2.width > imgdata1.width, "imgdata2.width > imgdata1.width"); +_assert(imgdata2.height > imgdata1.height, "imgdata2.height > imgdata1.height"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.html new file mode 100644 index 00000000000..ac9563b5f31 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.tiny</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.tiny</h1> +<p class="desc">getImageData() works for sizes smaller than one pixel</p> + + +<script> +var t = async_test("getImageData() works for sizes smaller than one pixel"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 0.0001, 0.0001); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assertSame(imgdata.width, 1, "imgdata.width", "1"); +_assertSame(imgdata.height, 1, "imgdata.height", "1"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.worker.js new file mode 100644 index 00000000000..3167e465d69 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.tiny.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.tiny +// Description:getImageData() works for sizes smaller than one pixel +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() works for sizes smaller than one pixel"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 0.0001, 0.0001); +_assertSame(imgdata.data.length, imgdata.width*imgdata.height*4, "imgdata.data.length", "imgdata.width*imgdata.height*4"); +_assertSame(imgdata.width, 1, "imgdata.width", "1"); +_assertSame(imgdata.height, 1, "imgdata.height", "1"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.html new file mode 100644 index 00000000000..afd759b5da5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.unaffected</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.unaffected</h1> +<p class="desc">getImageData() is not affected by context state</p> + + +<script> +var t = async_test("getImageData() is not affected by context state"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50) +ctx.save(); +ctx.translate(50, 0); +ctx.globalAlpha = 0.1; +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#f00'; +ctx.rect(0, 0, 5, 5); +ctx.clip(); +var imgdata = ctx.getImageData(0, 0, 50, 50); +ctx.restore(); +ctx.putImageData(imgdata, 50, 0); +_assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.worker.js new file mode 100644 index 00000000000..049042f5d5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.unaffected.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.unaffected +// Description:getImageData() is not affected by context state +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() is not affected by context state"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50) +ctx.save(); +ctx.translate(50, 0); +ctx.globalAlpha = 0.1; +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#f00'; +ctx.rect(0, 0, 5, 5); +ctx.clip(); +var imgdata = ctx.getImageData(0, 0, 50, 50); +ctx.restore(); +ctx.putImageData(imgdata, 50, 0); +_assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.html new file mode 100644 index 00000000000..42d71fc9642 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.get.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.get.zero</h1> +<p class="desc">getImageData() throws INDEX_SIZE_ERR if size is zero</p> + + +<script> +var t = async_test("getImageData() throws INDEX_SIZE_ERR if size is zero"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.getImageData(1, 1, 10, 0); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.getImageData(1, 1, 0, 10); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.getImageData(1, 1, 0, 0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.worker.js new file mode 100644 index 00000000000..5886b88e873 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.get.zero.worker.js @@ -0,0 +1,22 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.get.zero +// Description:getImageData() throws INDEX_SIZE_ERR if size is zero +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getImageData() throws INDEX_SIZE_ERR if size is zero"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws("INDEX_SIZE_ERR", function() { ctx.getImageData(1, 1, 10, 0); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.getImageData(1, 1, 0, 10); }); +assert_throws("INDEX_SIZE_ERR", function() { ctx.getImageData(1, 1, 0, 0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.html new file mode 100644 index 00000000000..b367821c2ce --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.clamp</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.clamp</h1> +<p class="desc">ImageData.data clamps numbers to [0, 255]</p> + + +<script> +var t = async_test("ImageData.data clamps numbers to [0, 255]"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = 300; +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = 100; +imgdata.data[0] = -100; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = 200+Math.pow(2, 32); +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = 100; +imgdata.data[0] = -200-Math.pow(2, 32); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = Math.pow(10, 39); +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = 100; +imgdata.data[0] = -Math.pow(10, 39); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = -Infinity; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = Infinity; +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.worker.js new file mode 100644 index 00000000000..00400bf4546 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.clamp.worker.js @@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.clamp +// Description:ImageData.data clamps numbers to [0, 255] +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData.data clamps numbers to [0, 255]"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = 300; +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = 100; +imgdata.data[0] = -100; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = 200+Math.pow(2, 32); +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = 100; +imgdata.data[0] = -200-Math.pow(2, 32); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = Math.pow(10, 39); +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = 100; +imgdata.data[0] = -Math.pow(10, 39); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = -Infinity; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = Infinity; +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.html new file mode 100644 index 00000000000..31224baac94 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.nan</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.nan</h1> +<p class="desc">ImageData.data converts NaN to 0</p> + + +<script> +var t = async_test("ImageData.data converts NaN to 0"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = NaN; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = "cheese"; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.worker.js new file mode 100644 index 00000000000..ef665e706ac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.nan.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.nan +// Description:ImageData.data converts NaN to 0 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData.data converts NaN to 0"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = NaN; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 100; +imgdata.data[0] = "cheese"; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.html new file mode 100644 index 00000000000..04b9b02cefc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.properties</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.properties</h1> +<p class="desc">ImageData objects have the right properties</p> + + +<script> +var t = async_test("ImageData objects have the right properties"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(typeof(imgdata.width), 'number', "typeof(imgdata.width)", "'number'"); +_assertSame(typeof(imgdata.height), 'number', "typeof(imgdata.height)", "'number'"); +_assertSame(typeof(imgdata.data), 'object', "typeof(imgdata.data)", "'object'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.worker.js new file mode 100644 index 00000000000..1094c660fcb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.properties.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.properties +// Description:ImageData objects have the right properties +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData objects have the right properties"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +_assertSame(typeof(imgdata.width), 'number', "typeof(imgdata.width)", "'number'"); +_assertSame(typeof(imgdata.height), 'number', "typeof(imgdata.height)", "'number'"); +_assertSame(typeof(imgdata.data), 'object', "typeof(imgdata.data)", "'object'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.html new file mode 100644 index 00000000000..7ad3b6b1a7c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.readonly</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.readonly</h1> +<p class="desc">ImageData objects properties are read-only</p> + + +<script> +var t = async_test("ImageData objects properties are read-only"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +var w = imgdata.width; +var h = imgdata.height; +var d = imgdata.data; +imgdata.width = 123; +imgdata.height = 123; +imgdata.data = [100,100,100,100]; +_assertSame(imgdata.width, w, "imgdata.width", "w"); +_assertSame(imgdata.height, h, "imgdata.height", "h"); +_assertSame(imgdata.data, d, "imgdata.data", "d"); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata.data[1], 0, "imgdata.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata.data[2], 0, "imgdata.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata.data[3], 0, "imgdata.data[\""+(3)+"\"]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.worker.js new file mode 100644 index 00000000000..770df898083 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.readonly.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.readonly +// Description:ImageData objects properties are read-only +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData objects properties are read-only"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +var w = imgdata.width; +var h = imgdata.height; +var d = imgdata.data; +imgdata.width = 123; +imgdata.height = 123; +imgdata.data = [100,100,100,100]; +_assertSame(imgdata.width, w, "imgdata.width", "w"); +_assertSame(imgdata.height, h, "imgdata.height", "h"); +_assertSame(imgdata.data, d, "imgdata.data", "d"); +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +_assertSame(imgdata.data[1], 0, "imgdata.data[\""+(1)+"\"]", "0"); +_assertSame(imgdata.data[2], 0, "imgdata.data[\""+(2)+"\"]", "0"); +_assertSame(imgdata.data[3], 0, "imgdata.data[\""+(3)+"\"]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.html new file mode 100644 index 00000000000..cbb7519a61a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.round</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.round</h1> +<p class="desc">ImageData.data rounds numbers with round-to-zero</p> + + +<script> +var t = async_test("ImageData.data rounds numbers with round-to-zero"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 0.499; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 0.5; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 0.501; +_assertSame(imgdata.data[0], 1, "imgdata.data[\""+(0)+"\"]", "1"); +imgdata.data[0] = 1.499; +_assertSame(imgdata.data[0], 1, "imgdata.data[\""+(0)+"\"]", "1"); +imgdata.data[0] = 1.5; +_assertSame(imgdata.data[0], 2, "imgdata.data[\""+(0)+"\"]", "2"); +imgdata.data[0] = 1.501; +_assertSame(imgdata.data[0], 2, "imgdata.data[\""+(0)+"\"]", "2"); +imgdata.data[0] = 2.5; +_assertSame(imgdata.data[0], 2, "imgdata.data[\""+(0)+"\"]", "2"); +imgdata.data[0] = 3.5; +_assertSame(imgdata.data[0], 4, "imgdata.data[\""+(0)+"\"]", "4"); +imgdata.data[0] = 252.5; +_assertSame(imgdata.data[0], 252, "imgdata.data[\""+(0)+"\"]", "252"); +imgdata.data[0] = 253.5; +_assertSame(imgdata.data[0], 254, "imgdata.data[\""+(0)+"\"]", "254"); +imgdata.data[0] = 254.5; +_assertSame(imgdata.data[0], 254, "imgdata.data[\""+(0)+"\"]", "254"); +imgdata.data[0] = 256.5; +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = -0.5; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = -1.5; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.worker.js new file mode 100644 index 00000000000..6924e6c114d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.round.worker.js @@ -0,0 +1,48 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.round +// Description:ImageData.data rounds numbers with round-to-zero +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData.data rounds numbers with round-to-zero"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 0.499; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 0.5; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = 0.501; +_assertSame(imgdata.data[0], 1, "imgdata.data[\""+(0)+"\"]", "1"); +imgdata.data[0] = 1.499; +_assertSame(imgdata.data[0], 1, "imgdata.data[\""+(0)+"\"]", "1"); +imgdata.data[0] = 1.5; +_assertSame(imgdata.data[0], 2, "imgdata.data[\""+(0)+"\"]", "2"); +imgdata.data[0] = 1.501; +_assertSame(imgdata.data[0], 2, "imgdata.data[\""+(0)+"\"]", "2"); +imgdata.data[0] = 2.5; +_assertSame(imgdata.data[0], 2, "imgdata.data[\""+(0)+"\"]", "2"); +imgdata.data[0] = 3.5; +_assertSame(imgdata.data[0], 4, "imgdata.data[\""+(0)+"\"]", "4"); +imgdata.data[0] = 252.5; +_assertSame(imgdata.data[0], 252, "imgdata.data[\""+(0)+"\"]", "252"); +imgdata.data[0] = 253.5; +_assertSame(imgdata.data[0], 254, "imgdata.data[\""+(0)+"\"]", "254"); +imgdata.data[0] = 254.5; +_assertSame(imgdata.data[0], 254, "imgdata.data[\""+(0)+"\"]", "254"); +imgdata.data[0] = 256.5; +_assertSame(imgdata.data[0], 255, "imgdata.data[\""+(0)+"\"]", "255"); +imgdata.data[0] = -0.5; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); +imgdata.data[0] = -1.5; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.html new file mode 100644 index 00000000000..f39240e7275 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.set</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.set</h1> +<p class="desc">ImageData.data can be modified</p> + + +<script> +var t = async_test("ImageData.data can be modified"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +_assertSame(imgdata.data[0], 100, "imgdata.data[\""+(0)+"\"]", "100"); +imgdata.data[0] = 200; +_assertSame(imgdata.data[0], 200, "imgdata.data[\""+(0)+"\"]", "200"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.worker.js new file mode 100644 index 00000000000..6ab6fe16e8d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.set.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.set +// Description:ImageData.data can be modified +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData.data can be modified"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +_assertSame(imgdata.data[0], 100, "imgdata.data[\""+(0)+"\"]", "100"); +imgdata.data[0] = 200; +_assertSame(imgdata.data[0], 200, "imgdata.data[\""+(0)+"\"]", "200"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.html new file mode 100644 index 00000000000..7d944d003c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.string</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.string</h1> +<p class="desc">ImageData.data converts strings to numbers with ToNumber</p> + + +<script> +var t = async_test("ImageData.data converts strings to numbers with ToNumber"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = "110"; +_assertSame(imgdata.data[0], 110, "imgdata.data[\""+(0)+"\"]", "110"); +imgdata.data[0] = 100; +imgdata.data[0] = "0x78"; +_assertSame(imgdata.data[0], 120, "imgdata.data[\""+(0)+"\"]", "120"); +imgdata.data[0] = 100; +imgdata.data[0] = " +130e0 "; +_assertSame(imgdata.data[0], 130, "imgdata.data[\""+(0)+"\"]", "130"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.worker.js new file mode 100644 index 00000000000..41a38395257 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.string.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.string +// Description:ImageData.data converts strings to numbers with ToNumber +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData.data converts strings to numbers with ToNumber"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = "110"; +_assertSame(imgdata.data[0], 110, "imgdata.data[\""+(0)+"\"]", "110"); +imgdata.data[0] = 100; +imgdata.data[0] = "0x78"; +_assertSame(imgdata.data[0], 120, "imgdata.data[\""+(0)+"\"]", "120"); +imgdata.data[0] = 100; +imgdata.data[0] = " +130e0 "; +_assertSame(imgdata.data[0], 130, "imgdata.data[\""+(0)+"\"]", "130"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.html new file mode 100644 index 00000000000..81c2959a0b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.object.undefined</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.object.undefined</h1> +<p class="desc">ImageData.data converts undefined to 0</p> + + +<script> +var t = async_test("ImageData.data converts undefined to 0"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = undefined; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.worker.js new file mode 100644 index 00000000000..bcded33dd82 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.object.undefined.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.object.undefined +// Description:ImageData.data converts undefined to 0 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("ImageData.data converts undefined to 0"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +imgdata.data[0] = 100; +imgdata.data[0] = undefined; +_assertSame(imgdata.data[0], 0, "imgdata.data[\""+(0)+"\"]", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.html new file mode 100644 index 00000000000..5236717e5bc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.alpha</h1> +<p class="desc">putImageData() puts non-solid image data correctly</p> + + +<script> +var t = async_test("putImageData() puts non-solid image data correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(0, 255, 0, 0.25)'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,64, "50,25", "0,255,0,64", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.worker.js new file mode 100644 index 00000000000..a1020fd8b86 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.alpha.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.alpha +// Description:putImageData() puts non-solid image data correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() puts non-solid image data correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = 'rgba(0, 255, 0, 0.25)'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,64, "50,25", "0,255,0,64", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.html new file mode 100644 index 00000000000..9123460c23f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.basic</h1> +<p class="desc">putImageData() puts image data from getImageData() onto the canvas</p> + + +<script> +var t = async_test("putImageData() puts image data from getImageData() onto the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.worker.js new file mode 100644 index 00000000000..3959348b935 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.basic.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.basic +// Description:putImageData() puts image data from getImageData() onto the canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() puts image data from getImageData() onto the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.html new file mode 100644 index 00000000000..3df65e00530 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.clip</h1> +<p class="desc">putImageData() is not affected by clipping regions</p> + + +<script> +var t = async_test("putImageData() is not affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.worker.js new file mode 100644 index 00000000000..e038e41efec --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.clip.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.clip +// Description:putImageData() is not affected by clipping regions +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() is not affected by clipping regions"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.html new file mode 100644 index 00000000000..7f55f1752fc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.created</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.created</h1> +<p class="desc">putImageData() puts image data from createImageData() onto the canvas</p> + + +<script> +var t = async_test("putImageData() puts image data from createImageData() onto the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(100, 50); +for (var i = 0; i < imgdata.data.length; i += 4) { + imgdata.data[i] = 0; + imgdata.data[i+1] = 255; + imgdata.data[i+2] = 0; + imgdata.data[i+3] = 255; +} +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.worker.js new file mode 100644 index 00000000000..aede851c487 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.created.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.created +// Description:putImageData() puts image data from createImageData() onto the canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() puts image data from createImageData() onto the canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.createImageData(100, 50); +for (var i = 0; i < imgdata.data.length; i += 4) { + imgdata.data[i] = 0; + imgdata.data[i+1] = 255; + imgdata.data[i+2] = 0; + imgdata.data[i+3] = 255; +} +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.html new file mode 100644 index 00000000000..a7af5f29f6f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.cross</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.cross</h1> +<p class="desc">putImageData() accepts image data got from a different canvas</p> + + +<script> +var t = async_test("putImageData() accepts image data got from a different canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50) +var imgdata = ctx2.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.worker.js new file mode 100644 index 00000000000..d81156068a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.cross.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.cross +// Description:putImageData() accepts image data got from a different canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() accepts image data got from a different canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#0f0'; +ctx2.fillRect(0, 0, 100, 50) +var imgdata = ctx2.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.html new file mode 100644 index 00000000000..3b5f437e441 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.dirty.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.dirty.negative</h1> +<p class="desc">putImageData() handles negative-sized dirty rectangles correctly</p> + + +<script> +var t = async_test("putImageData() handles negative-sized dirty rectangles correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 20, 20) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(40, 20, 20, 20) +ctx.putImageData(imgdata, 40, 20, 20, 20, -20, -20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,15, 0,255,0,255, "50,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.worker.js new file mode 100644 index 00000000000..460e7977140 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.negative.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.dirty.negative +// Description:putImageData() handles negative-sized dirty rectangles correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() handles negative-sized dirty rectangles correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 20, 20) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(40, 20, 20, 20) +ctx.putImageData(imgdata, 40, 20, 20, 20, -20, -20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,15, 0,255,0,255, "50,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.html new file mode 100644 index 00000000000..1ada85bdec1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.dirty.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.dirty.outside</h1> +<p class="desc">putImageData() handles dirty rectangles outside the canvas correctly</p> + + +<script> +var t = async_test("putImageData() handles dirty rectangles outside the canvas correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 100, 20, 20, 20, -20, -20); +ctx.putImageData(imgdata, 200, 200, 0, 0, 100, 50); +ctx.putImageData(imgdata, 40, 20, -30, -20, 30, 20); +ctx.putImageData(imgdata, -30, 20, 0, 0, 30, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 98,15, 0,255,0,255, "98,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 98,45, 0,255,0,255, "98,45", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 1,5, 0,255,0,255, "1,5", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 1,45, 0,255,0,255, "1,45", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.worker.js new file mode 100644 index 00000000000..7a194f9c15c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.outside.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.dirty.outside +// Description:putImageData() handles dirty rectangles outside the canvas correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() handles dirty rectangles outside the canvas correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 100, 20, 20, 20, -20, -20); +ctx.putImageData(imgdata, 200, 200, 0, 0, 100, 50); +ctx.putImageData(imgdata, 40, 20, -30, -20, 30, 20); +ctx.putImageData(imgdata, -30, 20, 0, 0, 30, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 98,15, 0,255,0,255, "98,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 98,45, 0,255,0,255, "98,45", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 1,5, 0,255,0,255, "1,5", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 1,45, 0,255,0,255, "1,45", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.html new file mode 100644 index 00000000000..5e132d693ca --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.dirty.rect1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.dirty.rect1</h1> +<p class="desc">putImageData() only modifies areas inside the dirty rectangle, using width and height</p> + + +<script> +var t = async_test("putImageData() only modifies areas inside the dirty rectangle, using width and height"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 20, 20) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(40, 20, 20, 20) +ctx.putImageData(imgdata, 40, 20, 0, 0, 20, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,15, 0,255,0,255, "50,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.worker.js new file mode 100644 index 00000000000..7d9ca465f3e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect1.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.dirty.rect1 +// Description:putImageData() only modifies areas inside the dirty rectangle, using width and height +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() only modifies areas inside the dirty rectangle, using width and height"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 20, 20) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(40, 20, 20, 20) +ctx.putImageData(imgdata, 40, 20, 0, 0, 20, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,15, 0,255,0,255, "50,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.html new file mode 100644 index 00000000000..96056d19083 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.dirty.rect2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.dirty.rect2</h1> +<p class="desc">putImageData() only modifies areas inside the dirty rectangle, using x and y</p> + + +<script> +var t = async_test("putImageData() only modifies areas inside the dirty rectangle, using x and y"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#0f0'; +ctx.fillRect(60, 30, 20, 20) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(40, 20, 20, 20) +ctx.putImageData(imgdata, -20, -10, 60, 30, 20, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,15, 0,255,0,255, "50,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.worker.js new file mode 100644 index 00000000000..524a6d7769d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.rect2.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.dirty.rect2 +// Description:putImageData() only modifies areas inside the dirty rectangle, using x and y +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() only modifies areas inside the dirty rectangle, using x and y"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#0f0'; +ctx.fillRect(60, 30, 20, 20) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(40, 20, 20, 20) +ctx.putImageData(imgdata, -20, -10, 60, 30, 20, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 35,25, 0,255,0,255, "35,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 65,25, 0,255,0,255, "65,25", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,15, 0,255,0,255, "50,15", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,45, 0,255,0,255, "50,45", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.html new file mode 100644 index 00000000000..c17df92de4b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.dirty.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.dirty.zero</h1> +<p class="desc">putImageData() with zero-sized dirty rectangle puts nothing</p> + + +<script> +var t = async_test("putImageData() with zero-sized dirty rectangle puts nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0, 0, 0, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.worker.js new file mode 100644 index 00000000000..e9bb4ac60b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.dirty.zero.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.dirty.zero +// Description:putImageData() with zero-sized dirty rectangle puts nothing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() with zero-sized dirty rectangle puts nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.putImageData(imgdata, 0, 0, 0, 0, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.html new file mode 100644 index 00000000000..ddfe634f1b2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.modified</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.modified</h1> +<p class="desc">putImageData() puts modified image data correctly</p> + + +<script> +var t = async_test("putImageData() puts modified image data correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(45, 20, 10, 10) +var imgdata = ctx.getImageData(45, 20, 10, 10); +for (var i = 0, len = imgdata.width*imgdata.height*4; i < len; i += 4) +{ + imgdata.data[i] = 0; + imgdata.data[i+1] = 255; +} +ctx.putImageData(imgdata, 45, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.worker.js new file mode 100644 index 00000000000..d22588dca6a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.modified.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.modified +// Description:putImageData() puts modified image data correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() puts modified image data correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +ctx.fillStyle = '#f00'; +ctx.fillRect(45, 20, 10, 10) +var imgdata = ctx.getImageData(45, 20, 10, 10); +for (var i = 0, len = imgdata.width*imgdata.height*4; i < len; i += 4) +{ + imgdata.data[i] = 0; + imgdata.data[i+1] = 255; +} +ctx.putImageData(imgdata, 45, 20); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.html new file mode 100644 index 00000000000..d2f174af0bb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.nonfinite</h1> +<p class="desc">putImageData() throws TypeError if arguments are not finite</p> + + +<script> +var t = async_test("putImageData() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, -Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, NaN); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, -Infinity, 10, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, NaN, 10, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, -Infinity, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, NaN, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, -Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, NaN, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, -Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, NaN, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, -Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, 10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, 10, NaN); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, Infinity, Infinity); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.worker.js new file mode 100644 index 00000000000..5ba39d6b28d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.nonfinite.worker.js @@ -0,0 +1,102 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.nonfinite +// Description:putImageData() throws TypeError if arguments are not finite +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() throws TypeError if arguments are not finite"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = ctx.getImageData(0, 0, 10, 10); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, -Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, NaN); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, -Infinity, 10, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, NaN, 10, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, -Infinity, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, NaN, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, -Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, NaN, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, -Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, NaN, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, -Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, NaN, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, 10, -Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, 10, NaN); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, Infinity, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, Infinity, 10, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, Infinity, 10, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, 10, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, Infinity, 10, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, Infinity, 10); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, Infinity, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, Infinity, 10, Infinity); }); +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 10, 10, 10, 10, Infinity, Infinity); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.html new file mode 100644 index 00000000000..a0f70171186 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.null</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.null</h1> +<p class="desc">putImageData() with null imagedata throws TypeError</p> + + +<script> +var t = async_test("putImageData() with null imagedata throws TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.putImageData(null, 0, 0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.worker.js new file mode 100644 index 00000000000..253508fc91b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.null.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.null +// Description:putImageData() with null imagedata throws TypeError +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() with null imagedata throws TypeError"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +assert_throws(new TypeError(), function() { ctx.putImageData(null, 0, 0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.html new file mode 100644 index 00000000000..47ae20a2996 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.path</h1> +<p class="desc">putImageData() does not affect the current path</p> + + +<script> +var t = async_test("putImageData() does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.rect(0, 0, 100, 50); +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.putImageData(imgdata, 0, 0); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.worker.js new file mode 100644 index 00000000000..c2ef1451cf9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.path.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.path +// Description:putImageData() does not affect the current path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.rect(0, 0, 100, 50); +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.putImageData(imgdata, 0, 0); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.html new file mode 100644 index 00000000000..3f80709c6a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.unaffected</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.unaffected</h1> +<p class="desc">putImageData() is not affected by context state</p> + + +<script> +var t = async_test("putImageData() is not affected by context state"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.globalAlpha = 0.1; +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 1; +ctx.translate(100, 50); +ctx.scale(0.1, 0.1); +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.worker.js new file mode 100644 index 00000000000..23e4cea1eee --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unaffected.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.unaffected +// Description:putImageData() is not affected by context state +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() is not affected by context state"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50) +var imgdata = ctx.getImageData(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50) +ctx.globalAlpha = 0.1; +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 1; +ctx.translate(100, 50); +ctx.scale(0.1, 0.1); +ctx.putImageData(imgdata, 0, 0); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.html new file mode 100644 index 00000000000..72640bfb2d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.unchanged</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.unchanged</h1> +<p class="desc">putImageData(getImageData(...), ...) has no effect</p> + + +<script> +var t = async_test("putImageData(getImageData(...), ...) has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var i = 0; +for (var y = 0; y < 16; ++y) { + for (var x = 0; x < 16; ++x, ++i) { + ctx.fillStyle = 'rgba(' + i + ',' + (Math.floor(i*1.5) % 256) + ',' + (Math.floor(i*23.3) % 256) + ',' + (i/256) + ')'; + ctx.fillRect(x, y, 1, 1); + } +} +var imgdata1 = ctx.getImageData(0.1, 0.2, 15.8, 15.9); +var olddata = []; +for (var i = 0; i < imgdata1.data.length; ++i) + olddata[i] = imgdata1.data[i]; +ctx.putImageData(imgdata1, 0.1, 0.2); +var imgdata2 = ctx.getImageData(0.1, 0.2, 15.8, 15.9); +for (var i = 0; i < imgdata2.data.length; ++i) { + _assertSame(olddata[i], imgdata2.data[i], "olddata[\""+(i)+"\"]", "imgdata2.data[\""+(i)+"\"]"); +} + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.worker.js new file mode 100644 index 00000000000..418e46ccf87 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.unchanged.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.unchanged +// Description:putImageData(getImageData(...), ...) has no effect +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData(getImageData(...), ...) has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var i = 0; +for (var y = 0; y < 16; ++y) { + for (var x = 0; x < 16; ++x, ++i) { + ctx.fillStyle = 'rgba(' + i + ',' + (Math.floor(i*1.5) % 256) + ',' + (Math.floor(i*23.3) % 256) + ',' + (i/256) + ')'; + ctx.fillRect(x, y, 1, 1); + } +} +var imgdata1 = ctx.getImageData(0.1, 0.2, 15.8, 15.9); +var olddata = []; +for (var i = 0; i < imgdata1.data.length; ++i) + olddata[i] = imgdata1.data[i]; +ctx.putImageData(imgdata1, 0.1, 0.2); +var imgdata2 = ctx.getImageData(0.1, 0.2, 15.8, 15.9); +for (var i = 0; i < imgdata2.data.length; ++i) { + _assertSame(olddata[i], imgdata2.data[i], "olddata[\""+(i)+"\"]", "imgdata2.data[\""+(i)+"\"]"); +} + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.html b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.html new file mode 100644 index 00000000000..1a31879f069 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.imageData.put.wrongtype</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.imageData.put.wrongtype</h1> +<p class="desc">putImageData() does not accept non-ImageData objects</p> + + +<script> +var t = async_test("putImageData() does not accept non-ImageData objects"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = { width: 1, height: 1, data: [255, 0, 0, 255] }; +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.putImageData("cheese", 0, 0); }); +assert_throws(new TypeError(), function() { ctx.putImageData(42, 0, 0); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.worker.js new file mode 100644 index 00000000000..18d737c7072 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/pixel-manipulation/2d.imageData.put.wrongtype.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.imageData.put.wrongtype +// Description:putImageData() does not accept non-ImageData objects +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("putImageData() does not accept non-ImageData objects"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var imgdata = { width: 1, height: 1, data: [255, 0, 0, 255] }; +assert_throws(new TypeError(), function() { ctx.putImageData(imgdata, 0, 0); }); +assert_throws(new TypeError(), function() { ctx.putImageData("cheese", 0, 0); }); +assert_throws(new TypeError(), function() { ctx.putImageData(42, 0, 0); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.1.html new file mode 100644 index 00000000000..c223e25090a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.1.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.alpha.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.alpha.1</h1> +<p class="desc">Shadow colour alpha components are used</p> + + +<script> +var t = async_test("Shadow colour alpha components are used"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = 'rgba(255, 0, 0, 0.01)'; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 4); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.1.worker.js new file mode 100644 index 00000000000..9852033eed7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.1.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.alpha.1 +// Description:Shadow colour alpha components are used +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadow colour alpha components are used"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = 'rgba(255, 0, 0, 0.01)'; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 4); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.2.html new file mode 100644 index 00000000000..53dd015230c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.2.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.alpha.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.alpha.2</h1> +<p class="desc">Shadow colour alpha components are used</p> + + +<script> +var t = async_test("Shadow colour alpha components are used"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = 'rgba(0, 0, 255, 0.5)'; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.2.worker.js new file mode 100644 index 00000000000..491397a8a1a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.2.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.alpha.2 +// Description:Shadow colour alpha components are used +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadow colour alpha components are used"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = 'rgba(0, 0, 255, 0.5)'; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.3.html new file mode 100644 index 00000000000..5cac64d8dd6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.3.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.alpha.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.alpha.3</h1> +<p class="desc">Shadows are affected by globalAlpha</p> + + +<script> +var t = async_test("Shadows are affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; // (work around broken Firefox globalAlpha caching) +ctx.shadowColor = '#00f'; +ctx.shadowOffsetY = 50; +ctx.globalAlpha = 0.5; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.3.worker.js new file mode 100644 index 00000000000..f30cba20147 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.3.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.alpha.3 +// Description:Shadows are affected by globalAlpha +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; // (work around broken Firefox globalAlpha caching) +ctx.shadowColor = '#00f'; +ctx.shadowOffsetY = 50; +ctx.globalAlpha = 0.5; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.4.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.4.html new file mode 100644 index 00000000000..e7aad4f3e08 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.4.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.alpha.4</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.alpha.4</h1> +<p class="desc">Shadows with alpha components are correctly affected by globalAlpha</p> + + +<script> +var t = async_test("Shadows with alpha components are correctly affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; // (work around broken Firefox globalAlpha caching) +ctx.shadowColor = 'rgba(0, 0, 255, 0.707)'; +ctx.shadowOffsetY = 50; +ctx.globalAlpha = 0.707; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.4.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.4.worker.js new file mode 100644 index 00000000000..1c1b619eccc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.4.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.alpha.4 +// Description:Shadows with alpha components are correctly affected by globalAlpha +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows with alpha components are correctly affected by globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; // (work around broken Firefox globalAlpha caching) +ctx.shadowColor = 'rgba(0, 0, 255, 0.707)'; +ctx.shadowOffsetY = 50; +ctx.globalAlpha = 0.707; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.5.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.5.html new file mode 100644 index 00000000000..db31f7119ab --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.5.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.alpha.5</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.alpha.5</h1> +<p class="desc">Shadows of shapes with alpha components are drawn correctly</p> + + +<script> +var t = async_test("Shadows of shapes with alpha components are drawn correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = 'rgba(64, 0, 0, 0.5)'; +ctx.shadowColor = '#00f'; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.5.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.5.worker.js new file mode 100644 index 00000000000..dd7699fbe21 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.alpha.5.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.alpha.5 +// Description:Shadows of shapes with alpha components are drawn correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows of shapes with alpha components are drawn correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = 'rgba(64, 0, 0, 0.5)'; +ctx.shadowColor = '#00f'; +ctx.shadowOffsetY = 50; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.html new file mode 100644 index 00000000000..290ffbbe8f6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowBlur.initial</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowBlur.initial</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.shadowBlur, 0, "ctx.shadowBlur", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.worker.js new file mode 100644 index 00000000000..0406e5f9c7b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.initial.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowBlur.initial +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.shadowBlur, 0, "ctx.shadowBlur", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.html new file mode 100644 index 00000000000..108c0d0da40 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowBlur.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowBlur.invalid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowBlur = 1; +ctx.shadowBlur = -2; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 1; +ctx.shadowBlur = Infinity; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 1; +ctx.shadowBlur = -Infinity; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 1; +ctx.shadowBlur = NaN; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.worker.js new file mode 100644 index 00000000000..d4e37a1ccda --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.invalid.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowBlur.invalid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowBlur = 1; +ctx.shadowBlur = -2; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 1; +ctx.shadowBlur = Infinity; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 1; +ctx.shadowBlur = -Infinity; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 1; +ctx.shadowBlur = NaN; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.html new file mode 100644 index 00000000000..45a8395c854 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowBlur.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowBlur.valid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowBlur = 1; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 0.5; +_assertSame(ctx.shadowBlur, 0.5, "ctx.shadowBlur", "0.5"); +ctx.shadowBlur = 1e6; +_assertSame(ctx.shadowBlur, 1e6, "ctx.shadowBlur", "1e6"); +ctx.shadowBlur = 0; +_assertSame(ctx.shadowBlur, 0, "ctx.shadowBlur", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.worker.js new file mode 100644 index 00000000000..aada60824de --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowBlur.valid.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowBlur.valid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowBlur = 1; +_assertSame(ctx.shadowBlur, 1, "ctx.shadowBlur", "1"); +ctx.shadowBlur = 0.5; +_assertSame(ctx.shadowBlur, 0.5, "ctx.shadowBlur", "0.5"); +ctx.shadowBlur = 1e6; +_assertSame(ctx.shadowBlur, 1e6, "ctx.shadowBlur", "1e6"); +ctx.shadowBlur = 0; +_assertSame(ctx.shadowBlur, 0, "ctx.shadowBlur", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.html new file mode 100644 index 00000000000..83c7628df99 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowColor.initial</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowColor.initial</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.shadowColor, 'rgba(0, 0, 0, 0)', "ctx.shadowColor", "'rgba(0, 0, 0, 0)'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.worker.js new file mode 100644 index 00000000000..5e13b9b3575 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.initial.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowColor.initial +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.shadowColor, 'rgba(0, 0, 0, 0)', "ctx.shadowColor", "'rgba(0, 0, 0, 0)'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.html new file mode 100644 index 00000000000..b4d661df837 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowColor.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowColor.invalid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = 'bogus'; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = 'red bogus'; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = ctx; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = undefined; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.worker.js new file mode 100644 index 00000000000..aad23bd79b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.invalid.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowColor.invalid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = 'bogus'; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = 'red bogus'; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = ctx; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = '#00ff00'; +ctx.shadowColor = undefined; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.html new file mode 100644 index 00000000000..318a4ec88cd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowColor.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowColor.valid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowColor = 'lime'; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = 'RGBA(0,255, 0,0)'; +_assertSame(ctx.shadowColor, 'rgba(0, 255, 0, 0)', "ctx.shadowColor", "'rgba(0, 255, 0, 0)'"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.worker.js new file mode 100644 index 00000000000..b5a711fa9a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowColor.valid.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowColor.valid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowColor = 'lime'; +_assertSame(ctx.shadowColor, '#00ff00', "ctx.shadowColor", "'#00ff00'"); +ctx.shadowColor = 'RGBA(0,255, 0,0)'; +_assertSame(ctx.shadowColor, 'rgba(0, 255, 0, 0)', "ctx.shadowColor", "'rgba(0, 255, 0, 0)'"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.html new file mode 100644 index 00000000000..7efd45e08f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.initial</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowOffset.initial</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.shadowOffsetX, 0, "ctx.shadowOffsetX", "0"); +_assertSame(ctx.shadowOffsetY, 0, "ctx.shadowOffsetY", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.worker.js new file mode 100644 index 00000000000..08e2bf409b5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.initial.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowOffset.initial +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.shadowOffsetX, 0, "ctx.shadowOffsetX", "0"); +_assertSame(ctx.shadowOffsetY, 0, "ctx.shadowOffsetY", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.html new file mode 100644 index 00000000000..8db0cd556f9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowOffset.invalid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +ctx.shadowOffsetX = Infinity; +ctx.shadowOffsetY = Infinity; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +ctx.shadowOffsetX = -Infinity; +ctx.shadowOffsetY = -Infinity; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +ctx.shadowOffsetX = NaN; +ctx.shadowOffsetY = NaN; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.worker.js new file mode 100644 index 00000000000..2b02e946b9f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.invalid.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowOffset.invalid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +ctx.shadowOffsetX = Infinity; +ctx.shadowOffsetY = Infinity; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +ctx.shadowOffsetX = -Infinity; +ctx.shadowOffsetY = -Infinity; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +ctx.shadowOffsetX = NaN; +ctx.shadowOffsetY = NaN; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.html new file mode 100644 index 00000000000..19fde85664f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.attributes.shadowOffset.valid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.attributes.shadowOffset.valid</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); +ctx.shadowOffsetX = 0.5; +ctx.shadowOffsetY = 0.25; +_assertSame(ctx.shadowOffsetX, 0.5, "ctx.shadowOffsetX", "0.5"); +_assertSame(ctx.shadowOffsetY, 0.25, "ctx.shadowOffsetY", "0.25"); +ctx.shadowOffsetX = -0.5; +ctx.shadowOffsetY = -0.25; +_assertSame(ctx.shadowOffsetX, -0.5, "ctx.shadowOffsetX", "-0.5"); +_assertSame(ctx.shadowOffsetY, -0.25, "ctx.shadowOffsetY", "-0.25"); +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 0; +_assertSame(ctx.shadowOffsetX, 0, "ctx.shadowOffsetX", "0"); +_assertSame(ctx.shadowOffsetY, 0, "ctx.shadowOffsetY", "0"); +ctx.shadowOffsetX = 1e6; +ctx.shadowOffsetY = 1e6; +_assertSame(ctx.shadowOffsetX, 1e6, "ctx.shadowOffsetX", "1e6"); +_assertSame(ctx.shadowOffsetY, 1e6, "ctx.shadowOffsetY", "1e6"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.worker.js new file mode 100644 index 00000000000..b6dacb4e16b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.attributes.shadowOffset.valid.worker.js @@ -0,0 +1,39 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.attributes.shadowOffset.valid +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowOffsetX = 1; +ctx.shadowOffsetY = 2; +_assertSame(ctx.shadowOffsetX, 1, "ctx.shadowOffsetX", "1"); +_assertSame(ctx.shadowOffsetY, 2, "ctx.shadowOffsetY", "2"); +ctx.shadowOffsetX = 0.5; +ctx.shadowOffsetY = 0.25; +_assertSame(ctx.shadowOffsetX, 0.5, "ctx.shadowOffsetX", "0.5"); +_assertSame(ctx.shadowOffsetY, 0.25, "ctx.shadowOffsetY", "0.25"); +ctx.shadowOffsetX = -0.5; +ctx.shadowOffsetY = -0.25; +_assertSame(ctx.shadowOffsetX, -0.5, "ctx.shadowOffsetX", "-0.5"); +_assertSame(ctx.shadowOffsetY, -0.25, "ctx.shadowOffsetY", "-0.25"); +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 0; +_assertSame(ctx.shadowOffsetX, 0, "ctx.shadowOffsetX", "0"); +_assertSame(ctx.shadowOffsetY, 0, "ctx.shadowOffsetY", "0"); +ctx.shadowOffsetX = 1e6; +ctx.shadowOffsetY = 1e6; +_assertSame(ctx.shadowOffsetX, 1e6, "ctx.shadowOffsetX", "1e6"); +_assertSame(ctx.shadowOffsetY, 1e6, "ctx.shadowOffsetY", "1e6"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.alpha.html new file mode 100644 index 00000000000..9f6dafb3df4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.alpha.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.canvas.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.canvas.alpha</h1> +<p class="desc">Shadows are drawn correctly for partially-transparent canvases</p> + + +<script> +var t = async_test("Shadows are drawn correctly for partially-transparent canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = 'rgba(255, 0, 0, 0.5)'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#00f'; +ctx.drawImage(offscreenCanvas2, 0, -50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.alpha.worker.js new file mode 100644 index 00000000000..a0b9eeed713 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.alpha.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.canvas.alpha +// Description:Shadows are drawn correctly for partially-transparent canvases +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn correctly for partially-transparent canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = 'rgba(255, 0, 0, 0.5)'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#00f'; +ctx.drawImage(offscreenCanvas2, 0, -50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.basic.html new file mode 100644 index 00000000000..c372ef4c108 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.basic.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.canvas.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.canvas.basic</h1> +<p class="desc">Shadows are drawn for canvases</p> + + +<script> +var t = async_test("Shadows are drawn for canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.drawImage(offscreenCanvas2, 0, -50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.basic.worker.js new file mode 100644 index 00000000000..3d95499f395 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.basic.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.canvas.basic +// Description:Shadows are drawn for canvases +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.drawImage(offscreenCanvas2, 0, -50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.html new file mode 100644 index 00000000000..4350516eeef --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.canvas.transparent.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.canvas.transparent.1</h1> +<p class="desc">Shadows are not drawn for transparent canvases</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +ctx.drawImage(offscreenCanvas2, 0, -50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.worker.js new file mode 100644 index 00000000000..7ba697b5f4c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.canvas.transparent.1 +// Description:Shadows are not drawn for transparent canvases +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +ctx.drawImage(offscreenCanvas2, 0, -50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.html new file mode 100644 index 00000000000..ded18f76977 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.canvas.transparent.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.canvas.transparent.2</h1> +<p class="desc">Shadows are not drawn for transparent parts of canvases</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent parts of canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.drawImage(offscreenCanvas2, 50, -50); +ctx.shadowColor = '#f00'; +ctx.drawImage(offscreenCanvas2, -50, -50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.worker.js new file mode 100644 index 00000000000..d91fa1694bf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.canvas.transparent.2.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.canvas.transparent.2 +// Description:Shadows are not drawn for transparent parts of canvases +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent parts of canvases"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var ctx2 = offscreenCanvas2.getContext('2d'); +ctx2.fillStyle = '#f00'; +ctx2.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.drawImage(offscreenCanvas2, 50, -50); +ctx.shadowColor = '#f00'; +ctx.drawImage(offscreenCanvas2, -50, -50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.1.html new file mode 100644 index 00000000000..9d5e33a008f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.1.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.clip.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.clip.1</h1> +<p class="desc">Shadows of clipped shapes are still drawn within the clipping region</p> + + +<script> +var t = async_test("Shadows of clipped shapes are still drawn within the clipping region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.save(); +ctx.beginPath(); +ctx.rect(50, 0, 50, 50); +ctx.clip(); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 50; +ctx.fillRect(0, 0, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.1.worker.js new file mode 100644 index 00000000000..d6a444d57fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.1.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.clip.1 +// Description:Shadows of clipped shapes are still drawn within the clipping region +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows of clipped shapes are still drawn within the clipping region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.save(); +ctx.beginPath(); +ctx.rect(50, 0, 50, 50); +ctx.clip(); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 50; +ctx.fillRect(0, 0, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.2.html new file mode 100644 index 00000000000..586fa9e65e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.2.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.clip.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.clip.2</h1> +<p class="desc">Shadows are not drawn outside the clipping region</p> + + +<script> +var t = async_test("Shadows are not drawn outside the clipping region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.save(); +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 50; +ctx.fillRect(0, 0, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.2.worker.js new file mode 100644 index 00000000000..eac6bc31b22 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.2.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.clip.2 +// Description:Shadows are not drawn outside the clipping region +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn outside the clipping region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.save(); +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 50; +ctx.fillRect(0, 0, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.3.html new file mode 100644 index 00000000000..77bb41ccc32 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.3.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.clip.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.clip.3</h1> +<p class="desc">Shadows of clipped shapes are still drawn within the clipping region</p> + + +<script> +var t = async_test("Shadows of clipped shapes are still drawn within the clipping region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.save(); +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 50; +ctx.fillRect(-50, 0, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.3.worker.js new file mode 100644 index 00000000000..809ee0b1a44 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.clip.3.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.clip.3 +// Description:Shadows of clipped shapes are still drawn within the clipping region +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows of clipped shapes are still drawn within the clipping region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.save(); +ctx.beginPath(); +ctx.rect(0, 0, 50, 50); +ctx.clip(); +ctx.fillStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 50; +ctx.fillRect(-50, 0, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.1.html new file mode 100644 index 00000000000..51c458c65e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.1.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.composite.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.composite.1</h1> +<p class="desc">Shadows are drawn using globalCompositeOperation</p> + + +<script> +var t = async_test("Shadows are drawn using globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 100; +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, 0, 200, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.1.worker.js new file mode 100644 index 00000000000..5c81a2c3498 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.1.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.composite.1 +// Description:Shadows are drawn using globalCompositeOperation +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn using globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 100; +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, 0, 200, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.2.html new file mode 100644 index 00000000000..a0355c63fa5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.2.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.composite.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.composite.2</h1> +<p class="desc">Shadows are drawn using globalCompositeOperation</p> + + +<script> +var t = async_test("Shadows are drawn using globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 1; +ctx.fillStyle = '#0f0'; +ctx.fillRect(-10, -10, 120, 70); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.2.worker.js new file mode 100644 index 00000000000..2ab91b7a7c6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.2.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.composite.2 +// Description:Shadows are drawn using globalCompositeOperation +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn using globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'xor'; +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 1; +ctx.fillStyle = '#0f0'; +ctx.fillRect(-10, -10, 120, 70); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.3.html new file mode 100644 index 00000000000..4cbf1902d5f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.3.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.composite.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.composite.3</h1> +<p class="desc">Areas outside shadows are drawn correctly with destination-out</p> + + +<script> +var t = async_test("Areas outside shadows are drawn correctly with destination-out"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 10; +ctx.fillStyle = '#f00'; +ctx.fillRect(200, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 5,5, 0,255,0,255, "5,5", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.3.worker.js new file mode 100644 index 00000000000..85730222225 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.composite.3.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.composite.3 +// Description:Areas outside shadows are drawn correctly with destination-out +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Areas outside shadows are drawn correctly with destination-out"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.globalCompositeOperation = 'destination-out'; +ctx.shadowColor = '#f00'; +ctx.shadowBlur = 10; +ctx.fillStyle = '#f00'; +ctx.fillRect(200, 0, 100, 50); +_assertPixelApprox(offscreenCanvas, 5,5, 0,255,0,255, "5,5", "0,255,0,255", 2); +_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.blur.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.blur.html new file mode 100644 index 00000000000..e6ad2937880 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.blur.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.enable.blur</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.enable.blur</h1> +<p class="desc">Shadows are drawn if shadowBlur is set</p> + + +<script> +var t = async_test("Shadows are drawn if shadowBlur is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#0f0'; +ctx.shadowBlur = 0.1; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.blur.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.blur.worker.js new file mode 100644 index 00000000000..610a38b994d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.blur.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.enable.blur +// Description:Shadows are drawn if shadowBlur is set +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn if shadowBlur is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#0f0'; +ctx.shadowBlur = 0.1; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.1.html new file mode 100644 index 00000000000..f8ecf85f1cc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.1.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.enable.off.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.enable.off.1</h1> +<p class="desc">Shadows are not drawn when only shadowColor is set</p> + + +<script> +var t = async_test("Shadows are not drawn when only shadowColor is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowColor = '#f00'; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.1.worker.js new file mode 100644 index 00000000000..dad5c0e58b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.1.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.enable.off.1 +// Description:Shadows are not drawn when only shadowColor is set +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn when only shadowColor is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.shadowColor = '#f00'; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.2.html new file mode 100644 index 00000000000..3a23c8bcfcf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.2.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.enable.off.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.enable.off.2</h1> +<p class="desc">Shadows are not drawn when only shadowColor is set</p> + + +<script> +var t = async_test("Shadows are not drawn when only shadowColor is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#f00'; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.2.worker.js new file mode 100644 index 00000000000..371f5822e9c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.off.2.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.enable.off.2 +// Description:Shadows are not drawn when only shadowColor is set +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn when only shadowColor is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#f00'; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.x.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.x.html new file mode 100644 index 00000000000..b2f147b4c6f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.x.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.enable.x</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.enable.x</h1> +<p class="desc">Shadows are drawn if shadowOffsetX is set</p> + + +<script> +var t = async_test("Shadows are drawn if shadowOffsetX is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 0.1; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.x.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.x.worker.js new file mode 100644 index 00000000000..1f70635e202 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.x.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.enable.x +// Description:Shadows are drawn if shadowOffsetX is set +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn if shadowOffsetX is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 0.1; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.y.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.y.html new file mode 100644 index 00000000000..a01d61f22f2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.y.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.enable.y</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.enable.y</h1> +<p class="desc">Shadows are drawn if shadowOffsetY is set</p> + + +<script> +var t = async_test("Shadows are drawn if shadowOffsetY is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 0.1; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.y.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.y.worker.js new file mode 100644 index 00000000000..f1d0f27bddf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.enable.y.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.enable.y +// Description:Shadows are drawn if shadowOffsetY is set +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn if shadowOffsetY is set"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.globalCompositeOperation = 'destination-atop'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 0.1; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.alpha.html new file mode 100644 index 00000000000..50e781675aa --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.alpha.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.gradient.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.gradient.alpha</h1> +<p class="desc">Shadows are drawn correctly for partially-transparent gradient fills</p> + + +<script> +var t = async_test("Shadows are drawn correctly for partially-transparent gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, 'rgba(255,0,0,0.5)'); +gradient.addColorStop(1, 'rgba(255,0,0,0.5)'); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#00f'; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.alpha.worker.js new file mode 100644 index 00000000000..07c02cd29cd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.alpha.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.gradient.alpha +// Description:Shadows are drawn correctly for partially-transparent gradient fills +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn correctly for partially-transparent gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, 'rgba(255,0,0,0.5)'); +gradient.addColorStop(1, 'rgba(255,0,0,0.5)'); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#00f'; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.basic.html new file mode 100644 index 00000000000..5ff7e66f36c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.basic.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.gradient.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.gradient.basic</h1> +<p class="desc">Shadows are drawn for gradient fills</p> + + +<script> +var t = async_test("Shadows are drawn for gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, '#f00'); +gradient.addColorStop(1, '#f00'); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.basic.worker.js new file mode 100644 index 00000000000..90f24bda1f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.basic.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.gradient.basic +// Description:Shadows are drawn for gradient fills +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, '#f00'); +gradient.addColorStop(1, '#f00'); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.html new file mode 100644 index 00000000000..80b59bace3b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.gradient.transparent.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.gradient.transparent.1</h1> +<p class="desc">Shadows are not drawn for transparent gradient fills</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, 'rgba(0,0,0,0)'); +gradient.addColorStop(1, 'rgba(0,0,0,0)'); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.worker.js new file mode 100644 index 00000000000..9e12ce83510 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.1.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.gradient.transparent.1 +// Description:Shadows are not drawn for transparent gradient fills +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, 'rgba(0,0,0,0)'); +gradient.addColorStop(1, 'rgba(0,0,0,0)'); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.html new file mode 100644 index 00000000000..7c1f567860a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.gradient.transparent.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.gradient.transparent.2</h1> +<p class="desc">Shadows are not drawn for transparent parts of gradient fills</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent parts of gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, '#f00'); +gradient.addColorStop(0.499, '#f00'); +gradient.addColorStop(0.5, 'rgba(0,0,0,0)'); +gradient.addColorStop(1, 'rgba(0,0,0,0)'); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.worker.js new file mode 100644 index 00000000000..08f46fdb49c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.gradient.transparent.2.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.gradient.transparent.2 +// Description:Shadows are not drawn for transparent parts of gradient fills +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent parts of gradient fills"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var gradient = ctx.createLinearGradient(0, 0, 100, 0); +gradient.addColorStop(0, '#f00'); +gradient.addColorStop(0.499, '#f00'); +gradient.addColorStop(0.5, 'rgba(0,0,0,0)'); +gradient.addColorStop(1, 'rgba(0,0,0,0)'); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.fillStyle = gradient; +ctx.fillRect(0, -50, 100, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.alpha.html new file mode 100644 index 00000000000..86483e39002 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.alpha.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.image.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.image.alpha</h1> +<p class="desc">Shadows are drawn correctly for partially-transparent images</p> + + +<script> +var t = async_test("Shadows are drawn correctly for partially-transparent images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#00f'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent50.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, -50); + _assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.alpha.worker.js new file mode 100644 index 00000000000..a624be80dda --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.alpha.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.image.alpha +// Description:Shadows are drawn correctly for partially-transparent images +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn correctly for partially-transparent images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#00f'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent50.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, -50); + _assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.basic.html new file mode 100644 index 00000000000..5ffd8c6a301 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.basic.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.image.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.image.basic</h1> +<p class="desc">Shadows are drawn for images</p> + + +<script> +var t = async_test("Shadows are drawn for images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, -50); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.basic.worker.js new file mode 100644 index 00000000000..0685043ad3f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.basic.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.image.basic +// Description:Shadows are drawn for images +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, -50); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.scale.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.scale.html new file mode 100644 index 00000000000..d438f3f3486 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.scale.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.image.scale</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.image.scale</h1> +<p class="desc">Shadows are drawn correctly for scaled images</p> + + +<script> +var t = async_test("Shadows are drawn correctly for scaled images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0, 100, 50, -10, -50, 240, 50); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.scale.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.scale.worker.js new file mode 100644 index 00000000000..6f084e9b42a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.scale.worker.js @@ -0,0 +1,38 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.image.scale +// Description:Shadows are drawn correctly for scaled images +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn correctly for scaled images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, 0, 100, 50, -10, -50, 240, 50); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.section.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.section.html new file mode 100644 index 00000000000..1f297601fa3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.section.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.image.section</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.image.section</h1> +<p class="desc">Shadows are not drawn for areas outside image source rectangles</p> + + +<script> +var t = async_test("Shadows are not drawn for areas outside image source rectangles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#f00'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 50, 0, 50, 50, 0, -50, 50, 50); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.section.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.section.worker.js new file mode 100644 index 00000000000..ad923e0f058 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.section.worker.js @@ -0,0 +1,38 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.image.section +// Description:Shadows are not drawn for areas outside image source rectangles +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for areas outside image source rectangles"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#f00'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 50, 0, 50, 50, 0, -50, 50, 50); + _assertPixelApprox(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2); + _assertPixelApprox(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255", 2); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.1.html new file mode 100644 index 00000000000..f2b2899ea42 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.1.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.image.transparent.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.image.transparent.1</h1> +<p class="desc">Shadows are not drawn for transparent images</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, -50); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.1.worker.js new file mode 100644 index 00000000000..af2d869f46d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.1.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.image.transparent.1 +// Description:Shadows are not drawn for transparent images +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 0, -50); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.2.html new file mode 100644 index 00000000000..5b23ddfe88e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.2.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.image.transparent.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.image.transparent.2</h1> +<p class="desc">Shadows are not drawn for transparent parts of images</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent parts of images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 50, -50); + ctx.shadowColor = '#f00'; + ctx.drawImage(response, -50, -50); + _assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.2.worker.js new file mode 100644 index 00000000000..0b99f3627e8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.image.transparent.2.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.image.transparent.2 +// Description:Shadows are not drawn for transparent parts of images +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent parts of images"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(50, 0, 50, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + ctx.drawImage(response, 50, -50); + ctx.shadowColor = '#f00'; + ctx.drawImage(response, -50, -50); + _assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeX.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeX.html new file mode 100644 index 00000000000..8f8fad7be44 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeX.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.offset.negativeX</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.offset.negativeX</h1> +<p class="desc">Shadows can be offset with negative x</p> + + +<script> +var t = async_test("Shadows can be offset with negative x"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = -50; +ctx.fillRect(50, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeX.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeX.worker.js new file mode 100644 index 00000000000..99081239e32 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeX.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.offset.negativeX +// Description:Shadows can be offset with negative x +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows can be offset with negative x"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = -50; +ctx.fillRect(50, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeY.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeY.html new file mode 100644 index 00000000000..47c391087a3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeY.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.offset.negativeY</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.offset.negativeY</h1> +<p class="desc">Shadows can be offset with negative y</p> + + +<script> +var t = async_test("Shadows can be offset with negative y"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = -25; +ctx.fillRect(0, 25, 100, 25); +_assertPixel(offscreenCanvas, 50,12, 0,255,0,255, "50,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,37, 0,255,0,255, "50,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeY.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeY.worker.js new file mode 100644 index 00000000000..998e4ad16c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.negativeY.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.offset.negativeY +// Description:Shadows can be offset with negative y +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows can be offset with negative y"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = -25; +ctx.fillRect(0, 25, 100, 25); +_assertPixel(offscreenCanvas, 50,12, 0,255,0,255, "50,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,37, 0,255,0,255, "50,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveX.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveX.html new file mode 100644 index 00000000000..d66414b672f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveX.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.offset.positiveX</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.offset.positiveX</h1> +<p class="desc">Shadows can be offset with positive x</p> + + +<script> +var t = async_test("Shadows can be offset with positive x"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 50; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveX.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveX.worker.js new file mode 100644 index 00000000000..e00379fbe0a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveX.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.offset.positiveX +// Description:Shadows can be offset with positive x +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows can be offset with positive x"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 50; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveY.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveY.html new file mode 100644 index 00000000000..6914414e926 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveY.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.offset.positiveY</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.offset.positiveY</h1> +<p class="desc">Shadows can be offset with positive y</p> + + +<script> +var t = async_test("Shadows can be offset with positive y"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 25; +ctx.fillRect(0, 0, 100, 25); +_assertPixel(offscreenCanvas, 50,12, 0,255,0,255, "50,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,37, 0,255,0,255, "50,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveY.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveY.worker.js new file mode 100644 index 00000000000..e7df68975fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.offset.positiveY.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.offset.positiveY +// Description:Shadows can be offset with positive y +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows can be offset with positive y"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#0f0'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 25; +ctx.fillRect(0, 0, 100, 25); +_assertPixel(offscreenCanvas, 50,12, 0,255,0,255, "50,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,37, 0,255,0,255, "50,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.outside.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.outside.html new file mode 100644 index 00000000000..664e50938b2 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.outside.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.outside</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.outside</h1> +<p class="desc">Shadows of shapes outside the visible area can be offset onto the visible area</p> + + +<script> +var t = async_test("Shadows of shapes outside the visible area can be offset onto the visible area"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 100; +ctx.fillRect(-100, 0, 25, 50); +ctx.shadowOffsetX = -100; +ctx.fillRect(175, 0, 25, 50); +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 100; +ctx.fillRect(25, -100, 50, 25); +ctx.shadowOffsetY = -100; +ctx.fillRect(25, 125, 50, 25); +_assertPixel(offscreenCanvas, 12,25, 0,255,0,255, "12,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 87,25, 0,255,0,255, "87,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,12, 0,255,0,255, "50,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,37, 0,255,0,255, "50,37", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.outside.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.outside.worker.js new file mode 100644 index 00000000000..6d23c72c8bb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.outside.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.outside +// Description:Shadows of shapes outside the visible area can be offset onto the visible area +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows of shapes outside the visible area can be offset onto the visible area"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 100; +ctx.fillRect(-100, 0, 25, 50); +ctx.shadowOffsetX = -100; +ctx.fillRect(175, 0, 25, 50); +ctx.shadowOffsetX = 0; +ctx.shadowOffsetY = 100; +ctx.fillRect(25, -100, 50, 25); +ctx.shadowOffsetY = -100; +ctx.fillRect(25, 125, 50, 25); +_assertPixel(offscreenCanvas, 12,25, 0,255,0,255, "12,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 87,25, 0,255,0,255, "87,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,12, 0,255,0,255, "50,12", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,37, 0,255,0,255, "50,37", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.alpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.alpha.html new file mode 100644 index 00000000000..371f32a4fe9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.alpha.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.pattern.alpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.pattern.alpha</h1> +<p class="desc">Shadows are drawn correctly for partially-transparent fill patterns</p> + + +<script> +var t = async_test("Shadows are drawn correctly for partially-transparent fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent50.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#00f'; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.alpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.alpha.worker.js new file mode 100644 index 00000000000..636253a7ab5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.alpha.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.pattern.alpha +// Description:Shadows are drawn correctly for partially-transparent fill patterns +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn correctly for partially-transparent fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent50.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#00f'; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.basic.html new file mode 100644 index 00000000000..cab764857d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.basic.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.pattern.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.pattern.basic</h1> +<p class="desc">Shadows are drawn for fill patterns</p> + + +<script> +var t = async_test("Shadows are drawn for fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.basic.worker.js new file mode 100644 index 00000000000..e8b6033d390 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.basic.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.pattern.basic +// Description:Shadows are drawn for fill patterns +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.html new file mode 100644 index 00000000000..315724a2b0d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.pattern.transparent.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.pattern.transparent.1</h1> +<p class="desc">Shadows are not drawn for transparent fill patterns</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.worker.js new file mode 100644 index 00000000000..34002793153 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.1.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.pattern.transparent.1 +// Description:Shadows are not drawn for transparent fill patterns +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.html new file mode 100644 index 00000000000..668e07f833b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.pattern.transparent.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.pattern.transparent.2</h1> +<p class="desc">Shadows are not drawn for transparent parts of fill patterns</p> + + +<script> +var t = async_test("Shadows are not drawn for transparent parts of fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + _assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +}); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.worker.js new file mode 100644 index 00000000000..157fbe2a8db --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.worker.js @@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.pattern.transparent.2 +// Description:Shadows are not drawn for transparent parts of fill patterns +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for transparent parts of fill patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; +}); +promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + _assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + _assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); +}); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.basic.html new file mode 100644 index 00000000000..be66f3a9a92 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.basic.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.stroke.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.stroke.basic</h1> +<p class="desc">Shadows are drawn for strokes</p> + + +<script> +var t = async_test("Shadows are drawn for strokes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.beginPath(); +ctx.lineWidth = 50; +ctx.moveTo(0, -25); +ctx.lineTo(100, -25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.basic.worker.js new file mode 100644 index 00000000000..e16536ded31 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.basic.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.stroke.basic +// Description:Shadows are drawn for strokes +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for strokes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.beginPath(); +ctx.lineWidth = 50; +ctx.moveTo(0, -25); +ctx.lineTo(100, -25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.html new file mode 100644 index 00000000000..2c460fd70f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.stroke.cap.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.stroke.cap.1</h1> +<p class="desc">Shadows are not drawn for areas outside stroke caps</p> + + +<script> +var t = async_test("Shadows are not drawn for areas outside stroke caps"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +ctx.beginPath(); +ctx.lineWidth = 50; +ctx.lineCap = 'butt'; +ctx.moveTo(-50, -25); +ctx.lineTo(0, -25); +ctx.moveTo(100, -25); +ctx.lineTo(150, -25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.worker.js new file mode 100644 index 00000000000..4c6a1aa4d4d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.1.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.stroke.cap.1 +// Description:Shadows are not drawn for areas outside stroke caps +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for areas outside stroke caps"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetY = 50; +ctx.beginPath(); +ctx.lineWidth = 50; +ctx.lineCap = 'butt'; +ctx.moveTo(-50, -25); +ctx.lineTo(0, -25); +ctx.moveTo(100, -25); +ctx.lineTo(150, -25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.html new file mode 100644 index 00000000000..0e78c1ad32a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.stroke.cap.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.stroke.cap.2</h1> +<p class="desc">Shadows are drawn for stroke caps</p> + + +<script> +var t = async_test("Shadows are drawn for stroke caps"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.beginPath(); +ctx.lineWidth = 50; +ctx.lineCap = 'square'; +ctx.moveTo(25, -25); +ctx.lineTo(75, -25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.worker.js new file mode 100644 index 00000000000..0c3cae105ba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.cap.2.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.stroke.cap.2 +// Description:Shadows are drawn for stroke caps +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for stroke caps"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetY = 50; +ctx.beginPath(); +ctx.lineWidth = 50; +ctx.lineCap = 'square'; +ctx.moveTo(25, -25); +ctx.lineTo(75, -25); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,25, 0,255,0,255, "1,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,25, 0,255,0,255, "98,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.1.html new file mode 100644 index 00000000000..04a6245686c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.1.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.stroke.join.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.stroke.join.1</h1> +<p class="desc">Shadows are not drawn for areas outside stroke joins</p> + + +<script> +var t = async_test("Shadows are not drawn for areas outside stroke joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 100; +ctx.lineWidth = 200; +ctx.lineJoin = 'bevel'; +ctx.beginPath(); +ctx.moveTo(-200, -50); +ctx.lineTo(-150, -50); +ctx.lineTo(-151, -100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.1.worker.js new file mode 100644 index 00000000000..95837207894 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.1.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.stroke.join.1 +// Description:Shadows are not drawn for areas outside stroke joins +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are not drawn for areas outside stroke joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 100; +ctx.lineWidth = 200; +ctx.lineJoin = 'bevel'; +ctx.beginPath(); +ctx.moveTo(-200, -50); +ctx.lineTo(-150, -50); +ctx.lineTo(-151, -100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.2.html new file mode 100644 index 00000000000..6629313baf7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.2.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.stroke.join.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.stroke.join.2</h1> +<p class="desc">Shadows are drawn for stroke joins</p> + + +<script> +var t = async_test("Shadows are drawn for stroke joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 100; +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.beginPath(); +ctx.moveTo(-200, -50); +ctx.lineTo(-150, -50); +ctx.lineTo(-151, -100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.2.worker.js new file mode 100644 index 00000000000..8b89d7405cd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.2.worker.js @@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.stroke.join.2 +// Description:Shadows are drawn for stroke joins +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for stroke joins"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, 0, 50, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#0f0'; +ctx.shadowOffsetX = 100; +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.beginPath(); +ctx.moveTo(-200, -50); +ctx.lineTo(-150, -50); +ctx.lineTo(-151, -100); +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.3.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.3.html new file mode 100644 index 00000000000..2fe623be5dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.3.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.stroke.join.3</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.stroke.join.3</h1> +<p class="desc">Shadows are drawn for stroke joins respecting miter limit</p> + + +<script> +var t = async_test("Shadows are drawn for stroke joins respecting miter limit"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 100; +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 0.1; +ctx.beginPath(); +ctx.moveTo(-200, -50); +ctx.lineTo(-150, -50); +ctx.lineTo(-151, -100); // (not an exact right angle, to avoid some other bug in Firefox 3) +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.3.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.3.worker.js new file mode 100644 index 00000000000..a67d7706cc7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.stroke.join.3.worker.js @@ -0,0 +1,36 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.stroke.join.3 +// Description:Shadows are drawn for stroke joins respecting miter limit +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows are drawn for stroke joins respecting miter limit"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.strokeStyle = '#f00'; +ctx.shadowColor = '#f00'; +ctx.shadowOffsetX = 100; +ctx.lineWidth = 200; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 0.1; +ctx.beginPath(); +ctx.moveTo(-200, -50); +ctx.lineTo(-150, -50); +ctx.lineTo(-151, -100); // (not an exact right angle, to avoid some other bug in Firefox 3) +ctx.stroke(); +_assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); +_assertPixel(offscreenCanvas, 48,48, 0,255,0,255, "48,48", "0,255,0,255"); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.1.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.1.html new file mode 100644 index 00000000000..a879a3b9920 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.1.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.transform.1</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.transform.1</h1> +<p class="desc">Shadows take account of transformations</p> + + +<script> +var t = async_test("Shadows take account of transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.translate(100, 100); +ctx.fillRect(-100, -150, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.1.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.1.worker.js new file mode 100644 index 00000000000..15389352979 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.1.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.transform.1 +// Description:Shadows take account of transformations +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadows take account of transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.translate(100, 100); +ctx.fillRect(-100, -150, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.2.html b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.2.html new file mode 100644 index 00000000000..d2452b48ea8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.2.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.shadow.transform.2</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.shadow.transform.2</h1> +<p class="desc">Shadow offsets are not affected by transformations</p> + + +<script> +var t = async_test("Shadow offsets are not affected by transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.rotate(Math.PI) +ctx.fillRect(-100, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.2.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.2.worker.js new file mode 100644 index 00000000000..bc9c7c8d3b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/shadows/2d.shadow.transform.2.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.shadow.transform.2 +// Description:Shadow offsets are not affected by transformations +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Shadow offsets are not affected by transformations"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.shadowOffsetY = 50; +ctx.shadowColor = '#0f0'; +ctx.rotate(Math.PI) +ctx.fillRect(-100, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.html new file mode 100644 index 00000000000..a384e56f248 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.bitmap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.bitmap</h1> +<p class="desc">save()/restore() does not affect the current bitmap</p> + + +<script> +var t = async_test("save()/restore() does not affect the current bitmap"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.worker.js new file mode 100644 index 00000000000..be240a4ebfe --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.bitmap.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.bitmap +// Description:save()/restore() does not affect the current bitmap +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() does not affect the current bitmap"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.html new file mode 100644 index 00000000000..0b3a7eaf387 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.clip</h1> +<p class="desc">save()/restore() affects the clipping path</p> + + +<script> +var t = async_test("save()/restore() affects the clipping path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.rect(0, 0, 1, 1); +ctx.clip(); +ctx.restore(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.worker.js new file mode 100644 index 00000000000..cee7df08bde --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.clip.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.clip +// Description:save()/restore() affects the clipping path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() affects the clipping path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.rect(0, 0, 1, 1); +ctx.clip(); +ctx.restore(); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.html new file mode 100644 index 00000000000..861312d0f45 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.fillStyle</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.fillStyle</h1> +<p class="desc">save()/restore() works for fillStyle</p> + + +<script> +var t = async_test("save()/restore() works for fillStyle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.fillStyle; +ctx.save(); +ctx.fillStyle = "#ff0000"; +ctx.restore(); +_assertSame(ctx.fillStyle, old, "ctx.fillStyle", "old"); + +// Also test that save() doesn't modify the values +ctx.fillStyle = "#ff0000"; +old = ctx.fillStyle; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "#ff0000" +ctx.save(); +_assertSame(ctx.fillStyle, old, "ctx.fillStyle", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.worker.js new file mode 100644 index 00000000000..a722dd041f6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.fillStyle.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.fillStyle +// Description:save()/restore() works for fillStyle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for fillStyle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.fillStyle; +ctx.save(); +ctx.fillStyle = "#ff0000"; +ctx.restore(); +_assertSame(ctx.fillStyle, old, "ctx.fillStyle", "old"); + +// Also test that save() doesn't modify the values +ctx.fillStyle = "#ff0000"; +old = ctx.fillStyle; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "#ff0000" +ctx.save(); +_assertSame(ctx.fillStyle, old, "ctx.fillStyle", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.html new file mode 100644 index 00000000000..a24c3d560fb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.globalAlpha</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.globalAlpha</h1> +<p class="desc">save()/restore() works for globalAlpha</p> + + +<script> +var t = async_test("save()/restore() works for globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.globalAlpha; +ctx.save(); +ctx.globalAlpha = 0.5; +ctx.restore(); +_assertSame(ctx.globalAlpha, old, "ctx.globalAlpha", "old"); + +// Also test that save() doesn't modify the values +ctx.globalAlpha = 0.5; +old = ctx.globalAlpha; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 0.5 +ctx.save(); +_assertSame(ctx.globalAlpha, old, "ctx.globalAlpha", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.worker.js new file mode 100644 index 00000000000..6432783c7dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalAlpha.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.globalAlpha +// Description:save()/restore() works for globalAlpha +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for globalAlpha"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.globalAlpha; +ctx.save(); +ctx.globalAlpha = 0.5; +ctx.restore(); +_assertSame(ctx.globalAlpha, old, "ctx.globalAlpha", "old"); + +// Also test that save() doesn't modify the values +ctx.globalAlpha = 0.5; +old = ctx.globalAlpha; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 0.5 +ctx.save(); +_assertSame(ctx.globalAlpha, old, "ctx.globalAlpha", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.html new file mode 100644 index 00000000000..5c512fbdda0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.globalCompositeOperation</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.globalCompositeOperation</h1> +<p class="desc">save()/restore() works for globalCompositeOperation</p> + + +<script> +var t = async_test("save()/restore() works for globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.globalCompositeOperation; +ctx.save(); +ctx.globalCompositeOperation = "copy"; +ctx.restore(); +_assertSame(ctx.globalCompositeOperation, old, "ctx.globalCompositeOperation", "old"); + +// Also test that save() doesn't modify the values +ctx.globalCompositeOperation = "copy"; +old = ctx.globalCompositeOperation; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "copy" +ctx.save(); +_assertSame(ctx.globalCompositeOperation, old, "ctx.globalCompositeOperation", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.worker.js new file mode 100644 index 00000000000..e06c99462bc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.globalCompositeOperation.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.globalCompositeOperation +// Description:save()/restore() works for globalCompositeOperation +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for globalCompositeOperation"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.globalCompositeOperation; +ctx.save(); +ctx.globalCompositeOperation = "copy"; +ctx.restore(); +_assertSame(ctx.globalCompositeOperation, old, "ctx.globalCompositeOperation", "old"); + +// Also test that save() doesn't modify the values +ctx.globalCompositeOperation = "copy"; +old = ctx.globalCompositeOperation; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "copy" +ctx.save(); +_assertSame(ctx.globalCompositeOperation, old, "ctx.globalCompositeOperation", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.html new file mode 100644 index 00000000000..a0e2457436a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.lineCap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.lineCap</h1> +<p class="desc">save()/restore() works for lineCap</p> + + +<script> +var t = async_test("save()/restore() works for lineCap"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.lineCap; +ctx.save(); +ctx.lineCap = "round"; +ctx.restore(); +_assertSame(ctx.lineCap, old, "ctx.lineCap", "old"); + +// Also test that save() doesn't modify the values +ctx.lineCap = "round"; +old = ctx.lineCap; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "round" +ctx.save(); +_assertSame(ctx.lineCap, old, "ctx.lineCap", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.worker.js new file mode 100644 index 00000000000..fa967743a02 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineCap.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.lineCap +// Description:save()/restore() works for lineCap +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for lineCap"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.lineCap; +ctx.save(); +ctx.lineCap = "round"; +ctx.restore(); +_assertSame(ctx.lineCap, old, "ctx.lineCap", "old"); + +// Also test that save() doesn't modify the values +ctx.lineCap = "round"; +old = ctx.lineCap; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "round" +ctx.save(); +_assertSame(ctx.lineCap, old, "ctx.lineCap", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.html new file mode 100644 index 00000000000..75c8a94c607 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.lineJoin</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.lineJoin</h1> +<p class="desc">save()/restore() works for lineJoin</p> + + +<script> +var t = async_test("save()/restore() works for lineJoin"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.lineJoin; +ctx.save(); +ctx.lineJoin = "round"; +ctx.restore(); +_assertSame(ctx.lineJoin, old, "ctx.lineJoin", "old"); + +// Also test that save() doesn't modify the values +ctx.lineJoin = "round"; +old = ctx.lineJoin; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "round" +ctx.save(); +_assertSame(ctx.lineJoin, old, "ctx.lineJoin", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.worker.js new file mode 100644 index 00000000000..1a4a377f504 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineJoin.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.lineJoin +// Description:save()/restore() works for lineJoin +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for lineJoin"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.lineJoin; +ctx.save(); +ctx.lineJoin = "round"; +ctx.restore(); +_assertSame(ctx.lineJoin, old, "ctx.lineJoin", "old"); + +// Also test that save() doesn't modify the values +ctx.lineJoin = "round"; +old = ctx.lineJoin; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "round" +ctx.save(); +_assertSame(ctx.lineJoin, old, "ctx.lineJoin", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.html new file mode 100644 index 00000000000..565fc63e38a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.lineWidth</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.lineWidth</h1> +<p class="desc">save()/restore() works for lineWidth</p> + + +<script> +var t = async_test("save()/restore() works for lineWidth"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.lineWidth; +ctx.save(); +ctx.lineWidth = 0.5; +ctx.restore(); +_assertSame(ctx.lineWidth, old, "ctx.lineWidth", "old"); + +// Also test that save() doesn't modify the values +ctx.lineWidth = 0.5; +old = ctx.lineWidth; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 0.5 +ctx.save(); +_assertSame(ctx.lineWidth, old, "ctx.lineWidth", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.worker.js new file mode 100644 index 00000000000..b04d4bb01b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.lineWidth.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.lineWidth +// Description:save()/restore() works for lineWidth +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for lineWidth"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.lineWidth; +ctx.save(); +ctx.lineWidth = 0.5; +ctx.restore(); +_assertSame(ctx.lineWidth, old, "ctx.lineWidth", "old"); + +// Also test that save() doesn't modify the values +ctx.lineWidth = 0.5; +old = ctx.lineWidth; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 0.5 +ctx.save(); +_assertSame(ctx.lineWidth, old, "ctx.lineWidth", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.html new file mode 100644 index 00000000000..2173325e248 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.miterLimit</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.miterLimit</h1> +<p class="desc">save()/restore() works for miterLimit</p> + + +<script> +var t = async_test("save()/restore() works for miterLimit"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.miterLimit; +ctx.save(); +ctx.miterLimit = 0.5; +ctx.restore(); +_assertSame(ctx.miterLimit, old, "ctx.miterLimit", "old"); + +// Also test that save() doesn't modify the values +ctx.miterLimit = 0.5; +old = ctx.miterLimit; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 0.5 +ctx.save(); +_assertSame(ctx.miterLimit, old, "ctx.miterLimit", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.worker.js new file mode 100644 index 00000000000..0591a7b597e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.miterLimit.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.miterLimit +// Description:save()/restore() works for miterLimit +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for miterLimit"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.miterLimit; +ctx.save(); +ctx.miterLimit = 0.5; +ctx.restore(); +_assertSame(ctx.miterLimit, old, "ctx.miterLimit", "old"); + +// Also test that save() doesn't modify the values +ctx.miterLimit = 0.5; +old = ctx.miterLimit; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 0.5 +ctx.save(); +_assertSame(ctx.miterLimit, old, "ctx.miterLimit", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.html new file mode 100644 index 00000000000..2c48b99ee96 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.path</h1> +<p class="desc">save()/restore() does not affect the current path</p> + + +<script> +var t = async_test("save()/restore() does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.rect(0, 0, 100, 50); +ctx.restore(); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.worker.js new file mode 100644 index 00000000000..83833e595dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.path.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.path +// Description:save()/restore() does not affect the current path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() does not affect the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.rect(0, 0, 100, 50); +ctx.restore(); +ctx.fillStyle = '#0f0'; +ctx.fill(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.html new file mode 100644 index 00000000000..0f4fccc9484 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.shadowBlur</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.shadowBlur</h1> +<p class="desc">save()/restore() works for shadowBlur</p> + + +<script> +var t = async_test("save()/restore() works for shadowBlur"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowBlur; +ctx.save(); +ctx.shadowBlur = 5; +ctx.restore(); +_assertSame(ctx.shadowBlur, old, "ctx.shadowBlur", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowBlur = 5; +old = ctx.shadowBlur; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 5 +ctx.save(); +_assertSame(ctx.shadowBlur, old, "ctx.shadowBlur", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.worker.js new file mode 100644 index 00000000000..c24e6438d79 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowBlur.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.shadowBlur +// Description:save()/restore() works for shadowBlur +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for shadowBlur"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowBlur; +ctx.save(); +ctx.shadowBlur = 5; +ctx.restore(); +_assertSame(ctx.shadowBlur, old, "ctx.shadowBlur", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowBlur = 5; +old = ctx.shadowBlur; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 5 +ctx.save(); +_assertSame(ctx.shadowBlur, old, "ctx.shadowBlur", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.html new file mode 100644 index 00000000000..086ba3003e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.shadowColor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.shadowColor</h1> +<p class="desc">save()/restore() works for shadowColor</p> + + +<script> +var t = async_test("save()/restore() works for shadowColor"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowColor; +ctx.save(); +ctx.shadowColor = "#ff0000"; +ctx.restore(); +_assertSame(ctx.shadowColor, old, "ctx.shadowColor", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowColor = "#ff0000"; +old = ctx.shadowColor; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "#ff0000" +ctx.save(); +_assertSame(ctx.shadowColor, old, "ctx.shadowColor", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.worker.js new file mode 100644 index 00000000000..94e25bb908a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowColor.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.shadowColor +// Description:save()/restore() works for shadowColor +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for shadowColor"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowColor; +ctx.save(); +ctx.shadowColor = "#ff0000"; +ctx.restore(); +_assertSame(ctx.shadowColor, old, "ctx.shadowColor", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowColor = "#ff0000"; +old = ctx.shadowColor; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "#ff0000" +ctx.save(); +_assertSame(ctx.shadowColor, old, "ctx.shadowColor", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.html new file mode 100644 index 00000000000..f211a0348a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.shadowOffsetX</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.shadowOffsetX</h1> +<p class="desc">save()/restore() works for shadowOffsetX</p> + + +<script> +var t = async_test("save()/restore() works for shadowOffsetX"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowOffsetX; +ctx.save(); +ctx.shadowOffsetX = 5; +ctx.restore(); +_assertSame(ctx.shadowOffsetX, old, "ctx.shadowOffsetX", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowOffsetX = 5; +old = ctx.shadowOffsetX; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 5 +ctx.save(); +_assertSame(ctx.shadowOffsetX, old, "ctx.shadowOffsetX", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.worker.js new file mode 100644 index 00000000000..373afa09f61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetX.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.shadowOffsetX +// Description:save()/restore() works for shadowOffsetX +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for shadowOffsetX"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowOffsetX; +ctx.save(); +ctx.shadowOffsetX = 5; +ctx.restore(); +_assertSame(ctx.shadowOffsetX, old, "ctx.shadowOffsetX", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowOffsetX = 5; +old = ctx.shadowOffsetX; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 5 +ctx.save(); +_assertSame(ctx.shadowOffsetX, old, "ctx.shadowOffsetX", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.html new file mode 100644 index 00000000000..1c1013b8806 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.shadowOffsetY</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.shadowOffsetY</h1> +<p class="desc">save()/restore() works for shadowOffsetY</p> + + +<script> +var t = async_test("save()/restore() works for shadowOffsetY"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowOffsetY; +ctx.save(); +ctx.shadowOffsetY = 5; +ctx.restore(); +_assertSame(ctx.shadowOffsetY, old, "ctx.shadowOffsetY", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowOffsetY = 5; +old = ctx.shadowOffsetY; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 5 +ctx.save(); +_assertSame(ctx.shadowOffsetY, old, "ctx.shadowOffsetY", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.worker.js new file mode 100644 index 00000000000..f883a935f87 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.shadowOffsetY.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.shadowOffsetY +// Description:save()/restore() works for shadowOffsetY +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for shadowOffsetY"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.shadowOffsetY; +ctx.save(); +ctx.shadowOffsetY = 5; +ctx.restore(); +_assertSame(ctx.shadowOffsetY, old, "ctx.shadowOffsetY", "old"); + +// Also test that save() doesn't modify the values +ctx.shadowOffsetY = 5; +old = ctx.shadowOffsetY; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against 5 +ctx.save(); +_assertSame(ctx.shadowOffsetY, old, "ctx.shadowOffsetY", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.html new file mode 100644 index 00000000000..6e74825f669 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.stack</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.stack</h1> +<p class="desc">save()/restore() can be nested as a stack</p> + + +<script> +var t = async_test("save()/restore() can be nested as a stack"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineWidth = 1; +ctx.save(); +ctx.lineWidth = 2; +ctx.save(); +ctx.lineWidth = 3; +_assertSame(ctx.lineWidth, 3, "ctx.lineWidth", "3"); +ctx.restore(); +_assertSame(ctx.lineWidth, 2, "ctx.lineWidth", "2"); +ctx.restore(); +_assertSame(ctx.lineWidth, 1, "ctx.lineWidth", "1"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.worker.js new file mode 100644 index 00000000000..5a0f74b8ab9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stack.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.stack +// Description:save()/restore() can be nested as a stack +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() can be nested as a stack"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.lineWidth = 1; +ctx.save(); +ctx.lineWidth = 2; +ctx.save(); +ctx.lineWidth = 3; +_assertSame(ctx.lineWidth, 3, "ctx.lineWidth", "3"); +ctx.restore(); +_assertSame(ctx.lineWidth, 2, "ctx.lineWidth", "2"); +ctx.restore(); +_assertSame(ctx.lineWidth, 1, "ctx.lineWidth", "1"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.html new file mode 100644 index 00000000000..4097ae9ee0c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.stackdepth</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.stackdepth</h1> +<p class="desc">save()/restore() stack depth is not unreasonably limited</p> + + +<script> +var t = async_test("save()/restore() stack depth is not unreasonably limited"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var limit = 512; +for (var i = 1; i < limit; ++i) +{ + ctx.save(); + ctx.lineWidth = i; +} +for (var i = limit-1; i > 0; --i) +{ + _assertSame(ctx.lineWidth, i, "ctx.lineWidth", "i"); + ctx.restore(); +} + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.worker.js new file mode 100644 index 00000000000..58a28e0ec88 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.stackdepth.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.stackdepth +// Description:save()/restore() stack depth is not unreasonably limited +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() stack depth is not unreasonably limited"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var limit = 512; +for (var i = 1; i < limit; ++i) +{ + ctx.save(); + ctx.lineWidth = i; +} +for (var i = limit-1; i > 0; --i) +{ + _assertSame(ctx.lineWidth, i, "ctx.lineWidth", "i"); + ctx.restore(); +} + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.html new file mode 100644 index 00000000000..13c0c9f865c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.strokeStyle</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.strokeStyle</h1> +<p class="desc">save()/restore() works for strokeStyle</p> + + +<script> +var t = async_test("save()/restore() works for strokeStyle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.strokeStyle; +ctx.save(); +ctx.strokeStyle = "#ff0000"; +ctx.restore(); +_assertSame(ctx.strokeStyle, old, "ctx.strokeStyle", "old"); + +// Also test that save() doesn't modify the values +ctx.strokeStyle = "#ff0000"; +old = ctx.strokeStyle; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "#ff0000" +ctx.save(); +_assertSame(ctx.strokeStyle, old, "ctx.strokeStyle", "old"); +ctx.restore(); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.worker.js new file mode 100644 index 00000000000..1f149ed99dc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.strokeStyle.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.strokeStyle +// Description:save()/restore() works for strokeStyle +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() works for strokeStyle"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Test that restore() undoes any modifications +var old = ctx.strokeStyle; +ctx.save(); +ctx.strokeStyle = "#ff0000"; +ctx.restore(); +_assertSame(ctx.strokeStyle, old, "ctx.strokeStyle", "old"); + +// Also test that save() doesn't modify the values +ctx.strokeStyle = "#ff0000"; +old = ctx.strokeStyle; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against "#ff0000" +ctx.save(); +_assertSame(ctx.strokeStyle, old, "ctx.strokeStyle", "old"); +ctx.restore(); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.html new file mode 100644 index 00000000000..785c128c249 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.transformation</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.transformation</h1> +<p class="desc">save()/restore() affects the current transformation matrix</p> + + +<script> +var t = async_test("save()/restore() affects the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.translate(200, 0); +ctx.restore(); +ctx.fillStyle = '#f00'; +ctx.fillRect(-200, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.worker.js new file mode 100644 index 00000000000..e5ce45e3cdf --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.transformation.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.transformation +// Description:save()/restore() affects the current transformation matrix +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("save()/restore() affects the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.translate(200, 0); +ctx.restore(); +ctx.fillStyle = '#f00'; +ctx.fillRect(-200, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.html new file mode 100644 index 00000000000..46aa29e7269 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.state.saverestore.underflow</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.state.saverestore.underflow</h1> +<p class="desc">restore() with an empty stack has no effect</p> + + +<script> +var t = async_test("restore() with an empty stack has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +for (var i = 0; i < 16; ++i) + ctx.restore(); +ctx.lineWidth = 0.5; +ctx.restore(); +_assertSame(ctx.lineWidth, 0.5, "ctx.lineWidth", "0.5"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.worker.js new file mode 100644 index 00000000000..150a31cf052 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-canvas-state/2d.state.saverestore.underflow.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.state.saverestore.underflow +// Description:restore() with an empty stack has no effect +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("restore() with an empty stack has no effect"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +for (var i = 0; i < 16; ++i) + ctx.restore(); +ctx.lineWidth = 0.5; +ctx.restore(); +_assertSame(ctx.lineWidth, 0.5, "ctx.lineWidth", "0.5"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.html new file mode 100644 index 00000000000..17a986c2333 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.readonly</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.canvas.readonly</h1> +<p class="desc">canvas is readonly</p> + + +<script> +var t = async_test("canvas is readonly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var d = ctx.canvas; +_assertDifferent(offscreenCanvas2, d, "offscreenCanvas2", "d"); +ctx.canvas = offscreenCanvas2; +_assertSame(ctx.canvas, d, "ctx.canvas", "d"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.worker.js new file mode 100644 index 00000000000..fdd99f86eb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.readonly.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.readonly +// Description:canvas is readonly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("canvas is readonly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +var d = ctx.canvas; +_assertDifferent(offscreenCanvas2, d, "offscreenCanvas2", "d"); +ctx.canvas = offscreenCanvas2; +_assertSame(ctx.canvas, d, "ctx.canvas", "d"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.html new file mode 100644 index 00000000000..1db640949b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.reference</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.canvas.reference</h1> +<p class="desc">canvas refers back to its canvas</p> + + +<script> +var t = async_test("canvas refers back to its canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.canvas, offscreenCanvas, "ctx.canvas", "offscreenCanvas"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.worker.js new file mode 100644 index 00000000000..ff2666bd3da --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.canvas.reference.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.reference +// Description:canvas refers back to its canvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("canvas refers back to its canvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(ctx.canvas, offscreenCanvas, "ctx.canvas", "offscreenCanvas"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.html new file mode 100644 index 00000000000..6011f205ed1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.getcontext.exists</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.getcontext.exists</h1> +<p class="desc">The 2D context is implemented</p> + + +<script> +var t = async_test("The 2D context is implemented"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +_assertDifferent(offscreenCanvas2.getContext('2d'), null, "offscreenCanvas2.getContext('2d')", "null"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.worker.js new file mode 100644 index 00000000000..bae8080dd79 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.exists.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.getcontext.exists +// Description:The 2D context is implemented +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("The 2D context is implemented"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +_assertDifferent(offscreenCanvas2.getContext('2d'), null, "offscreenCanvas2.getContext('2d')", "null"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.html new file mode 100644 index 00000000000..24a68e4914d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.getcontext.extraargs</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.getcontext.extraargs</h1> +<p class="desc">The 2D context ignores extra getContext arguments</p> + + +<script> +var t = async_test("The 2D context ignores extra getContext arguments"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +_assertDifferent(offscreenCanvas2.getContext('2d', false, {}, [], 1, "2"), null, "offscreenCanvas2.getContext('2d', false, {}, [], 1, \"2\")", "null"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.worker.js new file mode 100644 index 00000000000..933aa249d63 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.extraargs.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.getcontext.extraargs +// Description:The 2D context ignores extra getContext arguments +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("The 2D context ignores extra getContext arguments"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +_assertDifferent(offscreenCanvas2.getContext('2d', false, {}, [], 1, "2"), null, "offscreenCanvas2.getContext('2d', false, {}, [], 1, \"2\")", "null"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.html new file mode 100644 index 00000000000..8a948472455 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.getcontext.shared</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.getcontext.shared</h1> +<p class="desc">getContext('2d') returns objects which share canvas state</p> + + +<script> +var t = async_test("getContext('2d') returns objects which share canvas state"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var ctx2 = offscreenCanvas.getContext('2d'); +ctx.fillStyle = '#f00'; +ctx2.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.worker.js new file mode 100644 index 00000000000..c3ec6647da6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.shared.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.getcontext.shared +// Description:getContext('2d') returns objects which share canvas state +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getContext('2d') returns objects which share canvas state"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var ctx2 = offscreenCanvas.getContext('2d'); +ctx.fillStyle = '#f00'; +ctx2.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.html new file mode 100644 index 00000000000..8128c6ea9d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.getcontext.unique</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.getcontext.unique</h1> +<p class="desc">getContext('2d') returns the same object</p> + + +<script> +var t = async_test("getContext('2d') returns the same object"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +_assertSame(offscreenCanvas2.getContext('2d'), offscreenCanvas2.getContext('2d'), "offscreenCanvas2.getContext('2d')", "offscreenCanvas2.getContext('2d')"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.worker.js new file mode 100644 index 00000000000..3e4d6c47321 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/2d.getcontext.unique.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.getcontext.unique +// Description:getContext('2d') returns the same object +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getContext('2d') returns the same object"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +_assertSame(offscreenCanvas2.getContext('2d'), offscreenCanvas2.getContext('2d'), "offscreenCanvas2.getContext('2d')", "offscreenCanvas2.getContext('2d')"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.html new file mode 100644 index 00000000000..dfb7b303076 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.arguments.missing</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.arguments.missing</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext(); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.worker.js new file mode 100644 index 00000000000..467b78b0a93 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.arguments.missing.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.arguments.missing +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext(); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.casesensitive.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.casesensitive.html new file mode 100644 index 00000000000..e579b3a71f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.casesensitive.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.casesensitive</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.casesensitive</h1> +<p class="desc">Context name "2D" is unrecognised; matching is case sensitive</p> + + +<script> +var t = async_test("Context name \"2D\" is unrecognised; matching is case sensitive"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext('2D'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.casesensitive.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.casesensitive.worker.js new file mode 100644 index 00000000000..02aa32fa969 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.casesensitive.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.casesensitive +// Description:Context name "2D" is unrecognised; matching is case sensitive +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Context name \"2D\" is unrecognised; matching is case sensitive"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext('2D'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.emptystring.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.emptystring.html new file mode 100644 index 00000000000..dc057508c2c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.emptystring.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.emptystring</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.emptystring</h1> +<p class="desc">getContext with empty string returns null</p> + + +<script> +var t = async_test("getContext with empty string returns null"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext(""); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.emptystring.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.emptystring.worker.js new file mode 100644 index 00000000000..ea308c55199 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.emptystring.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.emptystring +// Description:getContext with empty string returns null +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getContext with empty string returns null"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext(""); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.html new file mode 100644 index 00000000000..89c9fa3eb38 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.unrecognised.badname</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.unrecognised.badname</h1> +<p class="desc">getContext with unrecognised context name returns null</p> + + +<script> +var t = async_test("getContext with unrecognised context name returns null"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext('This is not an implemented context in any real browser'); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.worker.js new file mode 100644 index 00000000000..87ffdcd273b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badname.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.unrecognised.badname +// Description:getContext with unrecognised context name returns null +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("getContext with unrecognised context name returns null"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext('This is not an implemented context in any real browser'); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.html new file mode 100644 index 00000000000..48061561bfd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.unrecognised.badsuffix</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.unrecognised.badsuffix</h1> +<p class="desc">Context name "2d" plus a suffix is unrecognised</p> + + +<script> +var t = async_test("Context name \"2d\" plus a suffix is unrecognised"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext("2d#"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.worker.js new file mode 100644 index 00000000000..13833f9102d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.badsuffix.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.unrecognised.badsuffix +// Description:Context name "2d" plus a suffix is unrecognised +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Context name \"2d\" plus a suffix is unrecognised"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext("2d#"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.html new file mode 100644 index 00000000000..8bf98d41047 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.unrecognised.nullsuffix</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.unrecognised.nullsuffix</h1> +<p class="desc">Context name "2d" plus a "\0" suffix is unrecognised</p> + + +<script> +var t = async_test("Context name \"2d\" plus a \"\\0\" suffix is unrecognised"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext("2d\0"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.worker.js new file mode 100644 index 00000000000..fc677f83d82 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.nullsuffix.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.unrecognised.nullsuffix +// Description:Context name "2d" plus a "\0" suffix is unrecognised +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Context name \"2d\" plus a \"\\0\" suffix is unrecognised"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext("2d\0"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.html new file mode 100644 index 00000000000..c657c896ee4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: context.unrecognised.unicode</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>context.unrecognised.unicode</h1> +<p class="desc">Context name which kind of looks like "2d" is unrecognised</p> + + +<script> +var t = async_test("Context name which kind of looks like \"2d\" is unrecognised"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext("2\uFF44"); }); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.worker.js new file mode 100644 index 00000000000..36befd94a41 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/context.unrecognised.unicode.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:context.unrecognised.unicode +// Description:Context name which kind of looks like "2d" is unrecognised +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Context name which kind of looks like \"2d\" is unrecognised"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var offscreenCanvas2 = new OffscreenCanvas(100, 50); +assert_throws(new TypeError(), function() { offscreenCanvas2.getContext("2\uFF44"); }); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.colour.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.colour.html new file mode 100644 index 00000000000..f033e4d2603 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.colour.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.colour</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.colour</h1> +<p class="desc">Initial state is transparent black</p> + + +<script> +var t = async_test("Initial state is transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.colour.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.colour.worker.js new file mode 100644 index 00000000000..f87861f7f09 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.colour.worker.js @@ -0,0 +1,20 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.colour +// Description:Initial state is transparent black +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Initial state is transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.html new file mode 100644 index 00000000000..13ef0c140f1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.html @@ -0,0 +1,85 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.2dstate</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.2dstate</h1> +<p class="desc">Resetting the canvas state resets 2D state variables</p> + + +<script> +var t = async_test("Resetting the canvas state resets 2D state variables"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +var default_val; + +default_val = ctx.strokeStyle; +ctx.strokeStyle = "#ff0000"; +offscreenCanvas.width = 100; +_assertSame(ctx.strokeStyle, default_val, "ctx.strokeStyle", "default_val"); + +default_val = ctx.fillStyle; +ctx.fillStyle = "#ff0000"; +offscreenCanvas.width = 100; +_assertSame(ctx.fillStyle, default_val, "ctx.fillStyle", "default_val"); + +default_val = ctx.globalAlpha; +ctx.globalAlpha = 0.5; +offscreenCanvas.width = 100; +_assertSame(ctx.globalAlpha, default_val, "ctx.globalAlpha", "default_val"); + +default_val = ctx.lineWidth; +ctx.lineWidth = 0.5; +offscreenCanvas.width = 100; +_assertSame(ctx.lineWidth, default_val, "ctx.lineWidth", "default_val"); + +default_val = ctx.lineCap; +ctx.lineCap = "round"; +offscreenCanvas.width = 100; +_assertSame(ctx.lineCap, default_val, "ctx.lineCap", "default_val"); + +default_val = ctx.lineJoin; +ctx.lineJoin = "round"; +offscreenCanvas.width = 100; +_assertSame(ctx.lineJoin, default_val, "ctx.lineJoin", "default_val"); + +default_val = ctx.miterLimit; +ctx.miterLimit = 0.5; +offscreenCanvas.width = 100; +_assertSame(ctx.miterLimit, default_val, "ctx.miterLimit", "default_val"); + +default_val = ctx.shadowOffsetX; +ctx.shadowOffsetX = 5; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowOffsetX, default_val, "ctx.shadowOffsetX", "default_val"); + +default_val = ctx.shadowOffsetY; +ctx.shadowOffsetY = 5; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowOffsetY, default_val, "ctx.shadowOffsetY", "default_val"); + +default_val = ctx.shadowBlur; +ctx.shadowBlur = 5; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowBlur, default_val, "ctx.shadowBlur", "default_val"); + +default_val = ctx.shadowColor; +ctx.shadowColor = "#ff0000"; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowColor, default_val, "ctx.shadowColor", "default_val"); + +default_val = ctx.globalCompositeOperation; +ctx.globalCompositeOperation = "copy"; +offscreenCanvas.width = 100; +_assertSame(ctx.globalCompositeOperation, default_val, "ctx.globalCompositeOperation", "default_val"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.worker.js new file mode 100644 index 00000000000..7eab7fbba1e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.2dstate.worker.js @@ -0,0 +1,81 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.2dstate +// Description:Resetting the canvas state resets 2D state variables +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Resetting the canvas state resets 2D state variables"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +var default_val; + +default_val = ctx.strokeStyle; +ctx.strokeStyle = "#ff0000"; +offscreenCanvas.width = 100; +_assertSame(ctx.strokeStyle, default_val, "ctx.strokeStyle", "default_val"); + +default_val = ctx.fillStyle; +ctx.fillStyle = "#ff0000"; +offscreenCanvas.width = 100; +_assertSame(ctx.fillStyle, default_val, "ctx.fillStyle", "default_val"); + +default_val = ctx.globalAlpha; +ctx.globalAlpha = 0.5; +offscreenCanvas.width = 100; +_assertSame(ctx.globalAlpha, default_val, "ctx.globalAlpha", "default_val"); + +default_val = ctx.lineWidth; +ctx.lineWidth = 0.5; +offscreenCanvas.width = 100; +_assertSame(ctx.lineWidth, default_val, "ctx.lineWidth", "default_val"); + +default_val = ctx.lineCap; +ctx.lineCap = "round"; +offscreenCanvas.width = 100; +_assertSame(ctx.lineCap, default_val, "ctx.lineCap", "default_val"); + +default_val = ctx.lineJoin; +ctx.lineJoin = "round"; +offscreenCanvas.width = 100; +_assertSame(ctx.lineJoin, default_val, "ctx.lineJoin", "default_val"); + +default_val = ctx.miterLimit; +ctx.miterLimit = 0.5; +offscreenCanvas.width = 100; +_assertSame(ctx.miterLimit, default_val, "ctx.miterLimit", "default_val"); + +default_val = ctx.shadowOffsetX; +ctx.shadowOffsetX = 5; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowOffsetX, default_val, "ctx.shadowOffsetX", "default_val"); + +default_val = ctx.shadowOffsetY; +ctx.shadowOffsetY = 5; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowOffsetY, default_val, "ctx.shadowOffsetY", "default_val"); + +default_val = ctx.shadowBlur; +ctx.shadowBlur = 5; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowBlur, default_val, "ctx.shadowBlur", "default_val"); + +default_val = ctx.shadowColor; +ctx.shadowColor = "#ff0000"; +offscreenCanvas.width = 100; +_assertSame(ctx.shadowColor, default_val, "ctx.shadowColor", "default_val"); + +default_val = ctx.globalCompositeOperation; +ctx.globalCompositeOperation = "copy"; +offscreenCanvas.width = 100; +_assertSame(ctx.globalCompositeOperation, default_val, "ctx.globalCompositeOperation", "default_val"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.html new file mode 100644 index 00000000000..076b3e89d15 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.clip</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.clip</h1> +<p class="desc">Resetting the canvas state resets the current clip region</p> + + +<script> +var t = async_test("Resetting the canvas state resets the current clip region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.rect(0, 0, 1, 1); +ctx.clip(); +offscreenCanvas.width = 100; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.worker.js new file mode 100644 index 00000000000..83a1a68fb1b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.clip.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.clip +// Description:Resetting the canvas state resets the current clip region +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Resetting the canvas state resets the current clip region"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.rect(0, 0, 1, 1); +ctx.clip(); +offscreenCanvas.width = 100; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.different.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.different.html new file mode 100644 index 00000000000..3b6ed013ffc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.different.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.different</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.different</h1> +<p class="desc">Changing size resets canvas to transparent black</p> + + +<script> +var t = async_test("Changing size resets canvas to transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 20,20, 255,0,0,255, "20,20", "255,0,0,255"); +offscreenCanvas.width = 50; +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.different.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.different.worker.js new file mode 100644 index 00000000000..8bf57849d78 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.different.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.different +// Description:Changing size resets canvas to transparent black +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Changing size resets canvas to transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 20,20, 255,0,0,255, "20,20", "255,0,0,255"); +offscreenCanvas.width = 50; +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.html new file mode 100644 index 00000000000..b0318901c88 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.gradient</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.gradient</h1> +<p class="desc">Resetting the canvas state does not invalidate any existing gradients</p> + + +<script> +var t = async_test("Resetting the canvas state does not invalidate any existing gradients"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 50; +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.worker.js new file mode 100644 index 00000000000..70a3c997585 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.gradient.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.gradient +// Description:Resetting the canvas state does not invalidate any existing gradients +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Resetting the canvas state does not invalidate any existing gradients"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 50; +var g = ctx.createLinearGradient(0, 0, 100, 0); +g.addColorStop(0, '#0f0'); +g.addColorStop(1, '#0f0'); +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = g; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.path.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.path.html new file mode 100644 index 00000000000..e4de133884b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.path.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.path</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.path</h1> +<p class="desc">Resetting the canvas state resets the current path</p> + + +<script> +var t = async_test("Resetting the canvas state resets the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.rect(0, 0, 100, 50); +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.path.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.path.worker.js new file mode 100644 index 00000000000..a0510f6fe01 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.path.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.path +// Description:Resetting the canvas state resets the current path +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Resetting the canvas state resets the current path"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.rect(0, 0, 100, 50); +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fill(); +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.html new file mode 100644 index 00000000000..646b399a825 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.pattern</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.pattern</h1> +<p class="desc">Resetting the canvas state does not invalidate any existing patterns</p> + + +<script> +var t = async_test("Resetting the canvas state does not invalidate any existing patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 30; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 30, 50); +var p = ctx.createPattern(offscreenCanvas, 'repeat-x'); +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = p; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.worker.js new file mode 100644 index 00000000000..51b1dea97d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.pattern.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.pattern +// Description:Resetting the canvas state does not invalidate any existing patterns +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Resetting the canvas state does not invalidate any existing patterns"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 30; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 30, 50); +var p = ctx.createPattern(offscreenCanvas, 'repeat-x'); +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = p; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.same.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.same.html new file mode 100644 index 00000000000..0a2edf4b6d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.same.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.same</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.same</h1> +<p class="desc">Setting size (not changing the value) resets canvas to transparent black</p> + + +<script> +var t = async_test("Setting size (not changing the value) resets canvas to transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 20,20, 255,0,0,255, "20,20", "255,0,0,255"); +offscreenCanvas.width = 100; +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.same.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.same.worker.js new file mode 100644 index 00000000000..dedbc551508 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.same.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.same +// Description:Setting size (not changing the value) resets canvas to transparent black +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting size (not changing the value) resets canvas to transparent black"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 50, 50); +_assertPixel(offscreenCanvas, 20,20, 255,0,0,255, "20,20", "255,0,0,255"); +offscreenCanvas.width = 100; +_assertPixel(offscreenCanvas, 20,20, 0,0,0,0, "20,20", "0,0,0,0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.html new file mode 100644 index 00000000000..346283fd139 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: initial.reset.transform</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>initial.reset.transform</h1> +<p class="desc">Resetting the canvas state resets the current transformation matrix</p> + + +<script> +var t = async_test("Resetting the canvas state resets the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.scale(0.1, 0.1); +offscreenCanvas.width = 100; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.worker.js new file mode 100644 index 00000000000..f2487fbf7b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/initial.reset.transform.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:initial.reset.transform +// Description:Resetting the canvas state resets the current transformation matrix +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Resetting the canvas state resets the current transformation matrix"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 100; +ctx.scale(0.1, 0.1); +offscreenCanvas.width = 100; +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 20,20, 0,255,0,255, "20,20", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.html new file mode 100644 index 00000000000..0377410e776 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#offscreencontext2d-commit"> +<script> + +function verifyPlaceholder(placeholder, expectedR, expectedG, expectedB, expectedA, expectedClrStr) +{ + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 10; + var ctx = canvas.getContext('2d'); + ctx.drawImage(placeholder, 0, 0); + _assertPixel(canvas, 5,5, expectedR, expectedG, expectedB, expectedA, "5,5", expectedClrStr); +} + +test(function() { + var placeholder = document.createElement('canvas'); + placeholder.width = placeholder.height = 10; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + var ctx = offscreenCanvas.getContext('2d'); + ctx.fillStyle = "#0f0"; + ctx.fillRect(0, 0, 10, 10); + ctx.commit(); + // commit() propagation is taken care of by an async task, which means the + // place holder contents should still be transparent black at this moment. + verifyPlaceholder(placeholder, 0,0,0,0, "0,0,0,0"); + // Set timeout acts as a sync barrier to allow commit to propagate + setTimeout(function() { + verifyPlaceholder(placeholder, 0,255,0,255, "0,255,0,255"); + }, 0); +}, "Test that calling OffscreenCanvas's commit pushes its contents to its placeholder."); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d'); + ctx.fillStyle = "#0f0"; + ctx.fillRect(0, 0, 10, 10); + assert_throws("InvalidStateError", function() { ctx.commit(); }); +}, "Test that calling commit on an OffscreenCanvas that is not transferred from a HTMLCanvasElement throws an exception."); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.w.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.w.html new file mode 100644 index 00000000000..3268021b28c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.w.html @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#offscreencontext2d-commit"> + +<script id="myWorker" type="text/worker"> + +function testCommitPushesContents(offscreenCanvas) +{ + var ctx = offscreenCanvas.getContext('2d'); + ctx.fillStyle = "#0f0"; + ctx.fillRect(0, 0, 10, 10); + ctx.commit(); +} + +function isInvalidStateError(funcStr, ctx) +{ + try { + eval(funcStr); + } catch (e) { + if (e instanceof DOMException && e.name == "InvalidStateError") + return true; + return false; + } +} + +function testCommitException() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d'); + ctx.fillStyle = "#0f0"; + ctx.fillRect(0, 0, 10, 10); + return isInvalidStateError("ctx.commit()", ctx); +} + +self.onmessage = function(e) { + switch (e.data.msg) { + case 'test1': + testCommitPushesContents(e.data.data); + self.postMessage('worker finished'); + break; + case 'test2': + self.postMessage(testCommitException()); + break; + } +}; + +</script> + +<script> + +function verifyPlaceholder(placeholder) +{ + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 10; + var ctx = canvas.getContext('2d'); + ctx.drawImage(placeholder, 0, 0); + _assertPixel(canvas, 5,5, 0,255,0,255, "5,5", "0,255,0,255"); +} + +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +async_test(function(t) { + var placeholder = document.createElement('canvas'); + placeholder.width = placeholder.height = 10; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + verifyPlaceholder(placeholder); + })); + worker.postMessage({msg: 'test1', data: offscreenCanvas}, [offscreenCanvas]); +}, "Test that calling OffscreenCanvas's commit pushes its contents to its placeholder."); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage({msg: 'test2'}); +}, "Test that calling commit on an OffscreenCanvas that is not transferred from a HTMLCanvasElement throws an exception in a worker."); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.html new file mode 100644 index 00000000000..c13010715e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-offscreencanvas"> +<script> + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + assert_equals(offscreenCanvas.width, 100); + assert_equals(offscreenCanvas.height, 50); + + offscreenCanvas.width = 50; + offscreenCanvas.height = 100; + assert_equals(offscreenCanvas.width, 50); + assert_equals(offscreenCanvas.height, 100); +}, "Test that calling OffscreenCanvas's constructor generates correct width and height."); + +test(function() { + var offscreenCanvas1 = new OffscreenCanvas(1, 1); + + offscreenCanvas1.width = null; + offscreenCanvas1.height = null; + assert_equals(offscreenCanvas1.width, 0); + assert_equals(offscreenCanvas1.height, 0); + + assert_throws(new TypeError(), function() { new OffscreenCanvas(-1, -1); }); + + var offscreenCanvas2 = new OffscreenCanvas(null, null); + assert_equals(offscreenCanvas2.width, 0); + assert_equals(offscreenCanvas2.height, 0); + + assert_throws(new TypeError(), function() { offscreenCanvas2.width = -1; }); + assert_throws(new TypeError(), function() { offscreenCanvas2.height = -1; }); + + var obj = {Name: "John Doe", Age: 30}; + assert_throws(new TypeError(), function() { offscreenCanvas2.width = obj; }); + assert_throws(new TypeError(), function() { offscreenCanvas2.height = obj; }); + assert_throws(new TypeError(), function() { new OffscreenCanvas(obj, obj); }); +}, "Test that OffscreenCanvas constructor handles invalid arguments correctly"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.worker.js new file mode 100644 index 00000000000..7c773e094de --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.constructor.worker.js @@ -0,0 +1,45 @@ +// spec link: https://html.spec.whatwg.org/#dom-offscreencanvas + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t1 = async_test("Test that calling OffscreenCanvas's constructor generates correct width and height."); +t1.step(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + assert_equals(offscreenCanvas.width, 100); + assert_equals(offscreenCanvas.height, 50); + + offscreenCanvas.width = 50; + offscreenCanvas.height = 100; + assert_equals(offscreenCanvas.width, 50); + assert_equals(offscreenCanvas.height, 100); + t1.done(); +}); + +var t2 = async_test("Test that OffscreenCanvas constructor handles invalid arguments correctly in a worker"); +t2.step(function() { + var offscreenCanvas1 = new OffscreenCanvas(1, 1); + + offscreenCanvas1.width = null; + offscreenCanvas1.height = null; + assert_equals(offscreenCanvas1.width, 0); + assert_equals(offscreenCanvas1.height, 0); + + assert_throws(new TypeError(), function() { new OffscreenCanvas(-1, -1); }); + + var offscreenCanvas2 = new OffscreenCanvas(null, null); + assert_equals(offscreenCanvas2.width, 0); + assert_equals(offscreenCanvas2.height, 0); + + assert_throws(new TypeError(), function() { offscreenCanvas2.width = -1; }); + assert_throws(new TypeError(), function() { offscreenCanvas2.height = -1; }); + + var obj = {Name: "John Doe", Age: 30}; + assert_throws(new TypeError(), function() { offscreenCanvas2.width = obj; }); + assert_throws(new TypeError(), function() { offscreenCanvas2.height = obj; }); + assert_throws(new TypeError(), function() { new OffscreenCanvas(obj, obj); }); + t2.done(); +}); + +done(); + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html new file mode 100644 index 00000000000..fce08e56a77 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html @@ -0,0 +1,148 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-offscreencanvas-converttoblob"> +<script id="myWorker" type="text/worker"> +self.onmessage = function(e) { +}; +</script> +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +function drawCanvas(ctx) +{ + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, 5, 5); + ctx.fillStyle = "green"; + ctx.fillRect(5, 0, 5, 5); + ctx.fillStyle = "blue"; + ctx.fillRect(0, 5, 5, 5); + ctx.fillStyle = "black"; + ctx.fillRect(5, 5, 5, 5); +} + +function compareImages(image1, image2) +{ + var canvas1 = document.createElement('canvas'); + var canvas2 = document.createElement('canvas'); + canvas1.width = canvas1.height = 10; + canvas2.width = canvas2.height = 10; + var ctx1 = canvas1.getContext('2d'); + var ctx2 = canvas1.getContext('2d'); + ctx1.drawImage(image1, 0, 0); + ctx2.drawImage(image2, 0, 0); + var data1 = ctx1.getImageData(0, 0, 10, 10).data; + var data2 = ctx2.getImageData(0, 0, 10, 10).data; + assert_equals(data1.length, data2.length); + var imageMatched = true; + for (var i = 0; i < data1.length; i++) { + if (data1[i] != data2[i]) { + imageMatched = false; + break; + } + } + assert_true(imageMatched); +} + +function testConvertToBlob(t, typeVal, qualityVal) { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var oCtx = offscreenCanvas.getContext('2d'); + drawCanvas(oCtx); + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + drawCanvas(ctx); + var imageLoadedCounter = 0; + + var image1 = new Image(); + var image2 = new Image(); + var promise; + if (typeVal == "empty" && qualityVal == "empty") + promise = offscreenCanvas.convertToBlob(); + else if (typeVal == "empty" && qualityVal != "empty") + promise = offscreenCanvas.convertToBlob({quality: qualityVal}); + else if (typeVal != "empty" && qualityVal == "empty") + promise = offscreenCanvas.convertToBlob({type: typeVal}); + else + promise = offscreenCanvas.convertToBlob({type: typeVal, quality: qualityVal}); + promise.then(function(blob2) { + image2.src = URL.createObjectURL(blob2); + if (typeVal == "empty" && qualityVal == "empty") { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }); + } else if (typeVal == "empty" && qualityVal != "empty") { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }, "image/png", qualityVal); + } else if (typeVal != "empty" && qualityVal == "empty") { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }, typeVal, 1.0); + } else { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }, typeVal, qualityVal); + } + image1.onload = image2.onload = t.step_func(function() { + imageLoadedCounter++; + if (imageLoadedCounter == 2) { + compareImages(image1, image2); + t.done(); + } + }); + }); +} + +async_test(function(t) { + testConvertToBlob(t, "empty", "empty"); + testConvertToBlob(t, "empty", 1.0); + testConvertToBlob(t, "empty", 0.2); +}, "Test that convertToBlob with default type produces correct result"); + +async_test(function(t) { + testConvertToBlob(t, "image/png", "empty"); + testConvertToBlob(t, "image/png", 1.0); + testConvertToBlob(t, "image/png", 0.2); +}, "Test that convertToBlob with png produces correct result"); + +async_test(function(t) { + testConvertToBlob(t, "image/jpeg", "empty"); + testConvertToBlob(t, "image/jpeg", 1.0); + testConvertToBlob(t, "image/jpeg", 0.2); +}, "Test that convertToBlob with jpge produces correct result"); + +async_test(function(t) { + testConvertToBlob(t, "image/webp", "empty"); + testConvertToBlob(t, "image/webp", 1.0); + testConvertToBlob(t, "image/webp", 0.2); +}, "Test that convertToBlob with webp produces correct result"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + worker.postMessage({offscreenCanvas}, [offscreenCanvas]); + offscreenCanvas.convertToBlob().then(t.step_func_done(function() { + assert_false("convertToBlob didn't throw, but should be"); + }), t.step_func_done(function(e) { + assert_true(e instanceof DOMException); + assert_equals(e.name, "InvalidStateError"); + })); +}, "Test that call convertToBlob on a detached OffscreenCanvas throws exception"); + +async_test(function(t) { + var offscreenCanvas = new OffscreenCanvas(0, 0); + offscreenCanvas.convertToBlob().then(t.step_func_done(function() { + assert_false("convertToBlob didn't throw, but should be"); + }), t.step_func_done(function(e) { + assert_true(e instanceof DOMException); + assert_equals(e.name, "IndexSizeError"); + })); +}, "Test that call convertToBlob on a OffscreenCanvas with size 0 throws exception"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.w.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.w.html new file mode 100644 index 00000000000..a6c4b4b7f93 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.w.html @@ -0,0 +1,307 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-offscreencanvas-converttoblob"> +<script id="myWorker" type="text/worker"> +function drawCanvas(ctx) +{ + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, 5, 5); + ctx.fillStyle = "green"; + ctx.fillRect(5, 0, 5, 5); + ctx.fillStyle = "blue"; + ctx.fillRect(0, 5, 5, 5); + ctx.fillStyle = "black"; + ctx.fillRect(5, 5, 5, 5); +} + +function testConvertToBlob(typeVal, qualityVal) { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var oCtx = offscreenCanvas.getContext('2d'); + drawCanvas(oCtx); + + var promise; + if (typeVal == "empty" && qualityVal == "empty") + promise = offscreenCanvas.convertToBlob(); + else if (typeVal == "empty" && qualityVal != "empty") + promise = offscreenCanvas.convertToBlob({quality: qualityVal}); + else if (typeVal != "empty" && qualityVal == "empty") + promise = offscreenCanvas.convertToBlob({type: typeVal}); + else + promise = offscreenCanvas.convertToBlob({type: typeVal, quality: qualityVal}); + promise.then(function(blob) { + self.postMessage(blob); + }); +} + +function testConvertToBlobException1() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + self.postMessage({offscreenCanvas}, [offscreenCanvas]); + offscreenCanvas.convertToBlob().then(function() { + return false; + }, function(e) { + if (e instanceof DOMException && e.name == "InvalidStateError") + return true; + else + return false; + }); +} + +function testConvertToBlobException2() +{ + var offscreenCanvas = new OffscreenCanvas(0, 0); + offscreenCanvas.convertToBlob().then(function() { + return false; + }, function(e) { + if (e instanceof DOMException && e.name == "IndexSizeError") + return true; + else + return false; + }); +} + +self.onmessage = function(e) { + switch(e.data) { + case 'test1': + testConvertToBlob("empty", "empty"); + break; + case 'test2': + testConvertToBlob("empty", 1.0); + break; + case 'test3': + testConvertToBlob("empty", 0.2); + break; + case 'test4': + testConvertToBlob("image/png", "empty"); + break; + case 'test5': + testConvertToBlob("image/png", 1.0); + break; + case 'test6': + testConvertToBlob("image/png", 0.2); + break; + case 'test7': + testConvertToBlob("image/jpeg", "empty"); + break; + case 'test8': + testConvertToBlob("image/jpeg", 1.0); + break; + case 'test9': + testConvertToBlob("image/jpeg", 0.2); + break; + case 'test10': + testConvertToBlob("image/webp", "empty"); + break; + case 'test11': + testConvertToBlob("image/webp", 1.0); + break; + case 'test12': + testConvertToBlob("image/webp", 0.2); + break; + case 'test13': + self.postMessage(testConvertToBlobException1()); + break; + case 'test14': + self.postMessage(testConvertToBlobException2()); + break; + } +}; + +</script> + +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +function drawCanvas(ctx) +{ + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, 5, 5); + ctx.fillStyle = "green"; + ctx.fillRect(5, 0, 5, 5); + ctx.fillStyle = "blue"; + ctx.fillRect(0, 5, 5, 5); + ctx.fillStyle = "black"; + ctx.fillRect(5, 5, 5, 5); +} + +function compareImages(image1, image2) +{ + var canvas1 = document.createElement('canvas'); + var canvas2 = document.createElement('canvas'); + canvas1.width = canvas1.height = 10; + canvas2.width = canvas2.height = 10; + var ctx1 = canvas1.getContext('2d'); + var ctx2 = canvas1.getContext('2d'); + ctx1.drawImage(image1, 0, 0); + ctx2.drawImage(image2, 0, 0); + var data1 = ctx1.getImageData(0, 0, 10, 10).data; + var data2 = ctx2.getImageData(0, 0, 10, 10).data; + assert_equals(data1.length, data2.length); + var imageMatched = true; + for (var i = 0; i < data1.length; i++) { + if (data1[i] != data2[i]) { + imageMatched = false; + break; + } + } + assert_true(imageMatched); +} + +function compareWithToBlob(t, typeVal, qualityVal, blob2) +{ + var image1 = new Image(); + var image2 = new Image(); + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + drawCanvas(ctx); + var imageLoadedCounter = 0; + + if (typeVal == "empty" && qualityVal == "empty") { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }); + } else if (typeVal == "empty" && qualityVal != "empty") { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }, "image/png", qualityVal); + } else if (typeVal != "empty" && qualityVal == "empty") { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }, typeVal, 1.0); + } else { + canvas.toBlob(function(blob1) { + image1.src = URL.createObjectURL(blob1); + }, typeVal, qualityVal); + } + image2.src = URL.createObjectURL(blob2); + image1.onload = image2.onload = t.step_func(function() { + imageLoadedCounter++; + if (imageLoadedCounter == 2) { + compareImages(image1, image2); + t.done(); + } + }); +} + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "empty", "empty", msg.data); + })); + worker.postMessage('test1'); +}, "Test that convertToBlob with default arguments produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "empty", 1.0, msg.data); + })); + worker.postMessage('test2'); +}, "Test that convertToBlob with default type/1.0 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "empty", 0.2, msg.data); + })); + worker.postMessage('test3'); +}, "Test that convertToBlob with default type/0.2 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/png", "empty", msg.data); + })); + worker.postMessage('test4'); +}, "Test that convertToBlob with png/default quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/png", 1.0, msg.data); + })); + worker.postMessage('test5'); +}, "Test that convertToBlob with png/1.0 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/png", 0.2, msg.data); + })); + worker.postMessage('test6'); +}, "Test that convertToBlob with png/0.2 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/jpeg", "empty", msg.data); + })); + worker.postMessage('test7'); +}, "Test that convertToBlob with jpeg/default quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/jpeg", 1.0, msg.data); + })); + worker.postMessage('test8'); +}, "Test that convertToBlob with jpeg/1.0 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/jpeg", 0.2, msg.data); + })); + worker.postMessage('test9'); +}, "Test that convertToBlob with jpeg/0.2 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/webp", "empty", msg.data); + })); + worker.postMessage('test10'); +}, "Test that convertToBlob with webp/default quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/webp", 1.0, msg.data); + })); + worker.postMessage('test11'); +}, "Test that convertToBlob with webp/1.0 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func(function(msg) { + compareWithToBlob(t, "image/webp", 0.2, msg.data); + })); + worker.postMessage('test12'); +}, "Test that convertToBlob with webp/0.2 quality produces correct result in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + if (msg.data == true || msg.data == false) + assert_true(msg.data); + })); + worker.postMessage('test13'); +}, "Test that call convertToBlob on a detached OffscreenCanvas throws exception in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + if (msg.data == true || msg.data == false) + assert_true(msg.data); + })); + worker.postMessage('test14'); +}, "Test that call convertToBlob on a OffscreenCanvas with size 0 throws exception in a worker"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.html new file mode 100644 index 00000000000..65f6391d357 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-offscreencanvas-getcontext"> +<script> + +test(function() { + var offscreenCanvas = new OffscreenCanvas(1, 1); + assert_throws(new TypeError(), function() { offscreenCanvas.getContext('3d'); }); +}, "Test that getContext with un-supported string throws a TypeError."); + +test(function() { + var offscreenCanvas1 = new OffscreenCanvas(1, 1); + var ctx1 = offscreenCanvas1.getContext('2d'); + assert_true(ctx1 instanceof OffscreenCanvasRenderingContext2D); + + var offscreenCanvas2 = new OffscreenCanvas(1, 1); + var ctx2 = offscreenCanvas2.getContext('webgl'); + assert_true(ctx2 instanceof WebGLRenderingContext); + + var offscreenCanvas3 = new OffscreenCanvas(1, 1); + var ctx3 = offscreenCanvas3.getContext('webgl2'); + assert_true(ctx3 instanceof WebGL2RenderingContext); +}, "Test that getContext with supported string returns correct results"); + +test(function() { + var offscreenCanvas1 = new OffscreenCanvas(1, 1); + var ctx1 = offscreenCanvas1.getContext('2d'); + var ctx2 = offscreenCanvas1.getContext('webgl'); + assert_equals(ctx2, null); + + var offscreenCanvas2 = new OffscreenCanvas(1, 1); + var ctx3 = offscreenCanvas2.getContext('webgl'); + var ctx4 = offscreenCanvas2.getContext('2d'); + assert_equals(ctx4, null); +}, "Test that getContext twice with different context type returns null the second time"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(1, 2); + var ctx = offscreenCanvas.getContext('2d'); + var dstCanvas = ctx.canvas; + assert_equals(dstCanvas.width, 1); + assert_equals(dstCanvas.height, 2); +}, "Test that 2dcontext.canvas should return the original OffscreenCanvas"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(1, 2); + var ctx = offscreenCanvas.getContext('webgl'); + var dstCanvas = ctx.canvas; + assert_equals(dstCanvas.width, 1); + assert_equals(dstCanvas.height, 2); +}, "Test that webglcontext.canvas should return the original OffscreenCanvas"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d', {alpha: false}); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.fillRect(0, 0, 10, 10); + _assertPixelApprox(offscreenCanvas, 5,5, 0,127,0,255, "5,5", "0,127,0,255", 2); +}, "Test that OffscreenCanvasRenderingContext2D with alpha disabled makes the OffscreenCanvas opaque"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d', {alpha: true}); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.fillRect(0, 0, 10, 10); + _assertPixelApprox(offscreenCanvas, 5,5, 0,255,0,127, "5,5", "0,255,0,127", 2); +}, "Test that OffscreenCanvasRenderingContext2D with alpha enabled preserves the alpha"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d'); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.fillRect(0, 0, 10, 10); + _assertPixelApprox(offscreenCanvas, 5,5, 0,255,0,127, "5,5", "0,255,0,127", 2); +}, "Test that 'alpha' context creation attribute is true by default"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.worker.js new file mode 100644 index 00000000000..008e04e750e --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.getcontext.worker.js @@ -0,0 +1,77 @@ +// spec link: https://html.spec.whatwg.org/#dom-offscreencanvas-getcontext + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(1, 1); + assert_throws(new TypeError(), function() { offscreenCanvas.getContext('3d'); }); +}, "Test that getContext with un-supported string throws a TypeError."); + +test(function() { + var offscreenCanvas1 = new OffscreenCanvas(1, 1); + var ctx1 = offscreenCanvas1.getContext('2d'); + assert_true(ctx1 instanceof OffscreenCanvasRenderingContext2D); + + var offscreenCanvas2 = new OffscreenCanvas(1, 1); + var ctx2 = offscreenCanvas2.getContext('webgl'); + assert_true(ctx2 instanceof WebGLRenderingContext); + + var offscreenCanvas3 = new OffscreenCanvas(1, 1); + var ctx3 = offscreenCanvas3.getContext('webgl2'); + assert_true(ctx3 instanceof WebGL2RenderingContext); +}, "Test that getContext with supported string returns correct results"); + +test(function() { + var offscreenCanvas1 = new OffscreenCanvas(1, 1); + var ctx1 = offscreenCanvas1.getContext('2d'); + var ctx2 = offscreenCanvas1.getContext('webgl'); + assert_equals(ctx2, null); + + var offscreenCanvas2 = new OffscreenCanvas(1, 1); + var ctx3 = offscreenCanvas2.getContext('webgl'); + var ctx4 = offscreenCanvas2.getContext('2d'); + assert_equals(ctx4, null); +}, "Test that getContext twice with different context type returns null the second time"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(1, 2); + var ctx = offscreenCanvas.getContext('2d'); + var dstCanvas = ctx.canvas; + assert_equals(dstCanvas.width, 1); + assert_equals(dstCanvas.height, 2); +}, "Test that 2dcontext.canvas should return the original OffscreenCanvas"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(1, 2); + var ctx = offscreenCanvas.getContext('webgl'); + var dstCanvas = ctx.canvas; + assert_equals(dstCanvas.width, 1); + assert_equals(dstCanvas.height, 2); +}, "Test that webglcontext.canvas should return the original OffscreenCanvas"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d', {alpha: false}); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.fillRect(0, 0, 10, 10); + _assertPixelApprox(offscreenCanvas, 5,5, 0,127,0,255, "5,5", "0,127,0,255", 2); +}, "Test that OffscreenCanvasRenderingContext2D with alpha disabled makes the OffscreenCanvas opaque"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d', {alpha: true}); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.fillRect(0, 0, 10, 10); + _assertPixelApprox(offscreenCanvas, 5,5, 0,255,0,127, "5,5", "0,255,0,127", 2); +}, "Test that OffscreenCanvasRenderingContext2D with alpha enabled preserves the alpha"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d'); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.fillRect(0, 0, 10, 10); + _assertPixelApprox(offscreenCanvas, 5,5, 0,255,0,127, "5,5", "0,255,0,127", 2); +}, "Test that 'alpha' context creation attribute is true by default"); + +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html new file mode 100644 index 00000000000..36fef6f498f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html @@ -0,0 +1,112 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-offscreencanvas-transfertoimagebitmap"> + +<script id="myWorker" type="text/worker"> + +self.onmessage = function(e) { +}; + +</script> + +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +test(function() { + function testSize(contextType) { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext(contextType); + var image = offscreenCanvas.transferToImageBitmap(); + assert_equals(image.width, 100); + assert_equals(image.height, 50); + } + + testSize('2d'); + testSize('webgl'); +}, "Test that transferToImageBitmap returns an ImageBitmap with correct width and height"); + +test(function() { + function testImageBitmapClr(shouldCallTwice, alphaVal) { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d', {alpha: alphaVal}); + ctx.fillStyle = "#0f0"; + ctx.fillRect(0, 0, 100, 50); + var image = offscreenCanvas.transferToImageBitmap(); + + if (shouldCallTwice) + image = offscreenCanvas.transferToImageBitmap(); + + var drawCanvas = document.createElement('canvas'); + drawCanvas.width = 100; + drawCanvas.height = 50; + var dCtx = drawCanvas.getContext('2d'); + dCtx.drawImage(image, 0, 0); + + if (shouldCallTwice) { + if (alphaVal) + _assertPixel(drawCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); + else + _assertPixel(drawCanvas, 50,25, 0,0,0,255, "50,25", "0,0,0,255"); + } else { + _assertPixel(drawCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + } + } + + testImageBitmapClr(false, true); + testImageBitmapClr(true, true); + testImageBitmapClr(true, false); +}, "Test that transferToImageBitmap returns an ImageBitmap with correct color"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.lineWidth = 10; + var image = offscreenCanvas.transferToImageBitmap(); + assert_equals(ctx.lineWidth, 10); +}, "Test that transferToImageBitmap won't change context's property"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.rect(0, 0, 25, 50); + ctx.clip(); + ctx.translate(20, 20); + + ctx.fillStyle = '#0f0'; + var image1 = offscreenCanvas.transferToImageBitmap(); + // trasnform should be preserved + ctx.fillRect(0, 0, 10, 10); + var image2 = offscreenCanvas.transferToImageBitmap(); + + var drawCanvas = document.createElement('canvas'); + drawCanvas.width = 100; + drawCanvas.height = 50; + var dCtx = drawCanvas.getContext('2d'); + dCtx.drawImage(image2, 0, 0); + // Verify that transform was carried over. + _assertPixel(drawCanvas, 23,25, 0,255,0,255, "23,25", "0,255,0,255"); + // Verify that clip was carried over. + _assertPixel(drawCanvas, 27,25, 0,0,0,0, "27,25", "0,0,0,0"); +}, "Test that transferToImageBitmap preserves transform"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + worker.postMessage(offscreenCanvas, [offscreenCanvas]); + assert_throws("InvalidStateError", function() { offscreenCanvas.transferToImageBitmap(); }); + t.done(); +}, "Test that call transferToImageBitmap on a detached OffscreenCanvas throws an exception"); + +test(function() { + var offscreenCanvas = new OffscreenCanvas(10, 10); + assert_throws("InvalidStateError", function() { offscreenCanvas.transferToImageBitmap(); }); +}, "Test that transferToImageBitmap without a context throws an exception"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html new file mode 100644 index 00000000000..bd284905743 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html @@ -0,0 +1,200 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-offscreencanvas-transfertoimagebitmap"> + +<script id="myWorker" type="text/worker"> + +function testSize(contextType) +{ + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext(contextType); + var image = offscreenCanvas.transferToImageBitmap(); + if (image.width == 100 && image.height == 50) + return true; + return false; +} + +function testImageBitmapClr(shouldCallTwice, alphaVal) { + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d', {alpha: alphaVal}); + ctx.fillStyle = "#0f0"; + ctx.fillRect(0, 0, 100, 50); + var image = offscreenCanvas.transferToImageBitmap(); + + if (shouldCallTwice) + image = offscreenCanvas.transferToImageBitmap(); + return image; +} + +function isInvalidStateError(funcStr, offscreenCanvas) +{ + try { + eval(funcStr); + } catch (e) { + if (e instanceof DOMException && e.name == "InvalidStateError") + return true; + return false; + } +} + +function testImageBitmapSize() +{ + return testSize('2d') && testSize('webgl'); +} + +function testLineWidthNotAltered() +{ + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.lineWidth = 10; + var image = offscreenCanvas.transferToImageBitmap(); + return ctx.lineWidth == 10; +} + +function testTransformPreserved() +{ + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + ctx.rect(0, 0, 25, 50); + ctx.clip(); + ctx.translate(20, 20); + + ctx.fillStyle = '#0f0'; + var image1 = offscreenCanvas.transferToImageBitmap(); + // trasnform should be preserved + ctx.fillRect(0, 0, 10, 10); + var image2 = offscreenCanvas.transferToImageBitmap(); + return image2; +} + +function testException() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + return isInvalidStateError("offscreenCanvas.transferToImageBitmap()", offscreenCanvas); +} + +self.onmessage = function(e) { + switch (e.data) { + case 'test1': + self.postMessage(testImageBitmapSize()); + break; + case 'test2': + self.postMessage(testImageBitmapClr(false, true)); + break; + case 'test3': + self.postMessage(testImageBitmapClr(true, true)); + break; + case 'test4': + self.postMessage(testImageBitmapClr(true, false)); + break; + case 'test5': + self.postMessage(testLineWidthNotAltered()); + break; + case 'test6': + self.postMessage(testTransformPreserved()); + break; + case 'test7': + var offscreenCanvas = new OffscreenCanvas(10, 10); + self.postMessage({offscreenCanvas: offscreenCanvas}, [offscreenCanvas]); + self.postMessage(isInvalidStateError("offscreenCanvas.transferToImageBitmap()", offscreenCanvas)); + break; + case 'test8': + self.postMessage(testException()); + break; + } +}; + +</script> + +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +function drawImageBitmap(image, x, y) +{ + var drawCanvas = document.createElement('canvas'); + drawCanvas.width = 100; + drawCanvas.height = 50; + var dCtx = drawCanvas.getContext('2d'); + dCtx.drawImage(image, 0, 0); + return dCtx.getImageData(x, y, 1, 1).data; +} + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage('test1'); +}, "Test that transferToImageBitmap returns an ImageBitmap with correct width and height in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + var clr = drawImageBitmap(msg.data, 50, 25); + assert_array_equals(clr, [0, 255, 0, 255]); + })); + worker.postMessage('test2'); +}, "Test that transferToImageBitmap returns an ImageBitmap with correct color in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + var clr = drawImageBitmap(msg.data, 50, 25); + assert_array_equals(clr, [0, 0, 0, 0]); + })); + worker.postMessage('test3'); +}, "Test that call transferToImageBitmap twice returns an ImageBitmap with correct color in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + var clr = drawImageBitmap(msg.data, 50, 25); + assert_array_equals(clr, [0, 0, 0, 255]); + })); + worker.postMessage('test4'); +}, "Test that call transferToImageBitmap twice on a alpha-disabled context returns an ImageBitmap with correct color in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage('test5'); +}, "Test that transferToImageBitmap won't change context's property in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + var clr1 = drawImageBitmap(msg.data, 23, 25); + assert_array_equals(clr1, [0, 255, 0, 255]); + var clr2 = drawImageBitmap(msg.data, 27, 25); + assert_array_equals(clr2, [0, 0, 0, 0]); + })); + worker.postMessage('test6'); +}, "Test that call transferToImageBitmap preserves transform in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + if (msg.data == true || msg.data == false) + assert_true(msg.data); + })); + worker.postMessage('test7'); +}, "Test that call transferToImageBitmap on a detached OffscreenCanvas throws an exception in a worker"); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage('test8'); +}, "Test that call transferToImageBitmap without a context throws an exception in a worker"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html new file mode 100644 index 00000000000..433dd45f837 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-canvas-transfercontroltooffscreen"> +<script> + +test(function() { + var placeholder = document.createElement('canvas'); + placeholder.width = 100; + placeholder.height = 50; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + assert_equals(offscreenCanvas.width, 100); + assert_equals(offscreenCanvas.height, 50); +}, "Test that an OffscreenCanvas generated by transferControlToOffscreen gets correct width and height"); + +test(function() { + var placeholder = document.createElement('canvas'); + placeholder.width = 100; + placeholder.height = 50; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + assert_throws("InvalidStateError", function() { placeholder.getContext('2d'); }); +}, "Test that calling getContext on a placeholder canvas that has already transferred its control throws an exception"); + +test(function() { + var placeholder = document.createElement('canvas'); + placeholder.width = 100; + placeholder.height = 50; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + assert_throws("InvalidStateError", function() { placeholder.transferControlToOffscreen(); }); +}, "Test that calling transferControlToOffscreen twice throws an exception"); + +async_test(function(t) { + var placeholder = document.createElement('canvas'); + placeholder.width = 10; + placeholder.height = 20; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + var ctx = offscreenCanvas.getContext('2d'); + t.step(function() { + offscreenCanvas.width = 30; + offscreenCanvas.height = 40; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 30, 40); + assert_equals(offscreenCanvas.width, 30); + assert_equals(offscreenCanvas.height, 40); + var image = offscreenCanvas.transferToImageBitmap(); + assert_equals(image.width, 30); + assert_equals(image.height, 40); + }); + t.step(function() { + // Setting the size of an OffscreenCanvas does not directly update the size of its placeholder canvas. + assert_equals(placeholder.width, 10); + assert_equals(placeholder.height, 20); + }); + ctx.commit(); + t.step(function() { + // commit() doesnt't synchronously update the size of its placeholder canvas + assert_equals(placeholder.width, 10); + assert_equals(placeholder.height, 20); + }); + // Set timeout acts as a sync barrier to allow commit to propagate + setTimeout(function() { + t.step(function() { + // commit() asynchronously updates the size of its placeholder canvas + assert_equals(placeholder.width, 30); + assert_equals(placeholder.height, 40); + }); + createImageBitmap(placeholder).then(image => { + t.step(function() { + assert_equals(image.width, 30); + assert_equals(image.height, 40); + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 50; + var context = canvas.getContext('2d'); + context.drawImage(image, 0, 0); + _assertPixel(canvas, 15,20, 0,255,0,255, "15,20", "0,255,0,255"); + t.done(); + }); + }); + }, 0); +}, "Verify that resizing an OffscreenCanvas with a 2d context propagates the new size to its placeholder canvas asynchronously, upon commit."); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html new file mode 100644 index 00000000000..ec8d05a4ba3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html @@ -0,0 +1,76 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#dom-canvas-transfercontroltooffscreen"> + +<script id="myWorker" type="text/worker"> + +function testSize(offscreenCanvas) +{ + if (offscreenCanvas.width == 100 && offscreenCanvas.height == 50) + return true; + return false; +} + +self.onmessage = function(e) { + switch (e.data.msg) { + case 'test1': + self.postMessage(testSize(e.data.data)); + break; + case 'test2': + self.postMessage(""); + break; + case 'test3': + self.postMessage(""); + break; + } +}; + +</script> + +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +async_test(function(t) { + var placeholder = document.createElement('canvas'); + placeholder.width = 100; + placeholder.height = 50; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage({msg: 'test1', data: offscreenCanvas}, [offscreenCanvas]); +}, "Test that an OffscreenCanvas generated by transferControlToOffscreen gets correct width and height when it is transferred to a worker"); + +async_test(function(t) { + var placeholder = document.createElement('canvas'); + placeholder.width = 100; + placeholder.height = 50; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_throws("InvalidStateError", function() { placeholder.getContext('2d'); }); + })); + worker.postMessage({msg: 'test2', data: offscreenCanvas}, [offscreenCanvas]); +}, "Test that calling getContext on a placeholder canvas that is transferred its control to an OffscreenCanvas throws an exception, when the OffscreenCanvas is transferred to a worker"); + +async_test(function(t) { + var placeholder = document.createElement('canvas'); + placeholder.width = 100; + placeholder.height = 50; + var offscreenCanvas = placeholder.transferControlToOffscreen(); + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_throws("InvalidStateError", function() { placeholder.transferControlToOffscreen(); }); + })); + worker.postMessage({msg: 'test3', data: offscreenCanvas}, [offscreenCanvas]); +}, "Test that calling transferControlToOffscreen twice throws an exception, when its associated OffscreenCanvas is transferred to a worker"); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.html new file mode 100644 index 00000000000..f32309fc1bb --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.html @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#offscreencanvas"> + +<script id="myWorker" type="text/worker"> + +function test1(offscreenCanvas) +{ + return offscreenCanvas.width == 10 && offscreenCanvas.height == 10; +} + +self.onmessage = function(e) { + switch(e.data.msg) { + case 'test1': + self.postMessage(test1(e.data.data)); + break; + } +}; + +</script> + +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + worker.postMessage({msg: 'test1', data: offscreenCanvas}, [offscreenCanvas]); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + assert_equals(offscreenCanvas.width, 0); + assert_equals(offscreenCanvas.height, 0); +}, "Test that offscreenCanvas's size is correct after being transferred to a worker."); + +test(function() { + function testException(contextType) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext(contextType); + assert_throws("InvalidStateError", function() { + worker.postMessage({offscreenCanvas}, [offscreenCanvas]); + }); + } + testException('2d'); + testException('webgl'); +}, "Test that transfer an OffscreenCanvas that has a context throws exception."); + +test(function() { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + worker.postMessage({offscreenCanvas}, [offscreenCanvas]); + assert_throws("InvalidStateError", function() { + worker.postMessage({offscreenCanvas}, [offscreenCanvas]); + }); +}, "Test that transfer an OffscreenCanvas twice throws exception."); + +test(function() { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + worker.postMessage({offscreenCanvas}, [offscreenCanvas]); + assert_throws("InvalidStateError", function() { + offscreenCanvas.getContext('2d'); + }); +}, "Test that calling getContext('2d') on a detached OffscreenCanvas throws exception."); + +test(function() { + var worker = makeWorker(document.getElementById("myWorker").textContent); + var offscreenCanvas = new OffscreenCanvas(10, 10); + worker.postMessage({offscreenCanvas}, [offscreenCanvas]); + assert_throws("InvalidStateError", function() { + offscreenCanvas.getContext('webgl'); + }); +}, "Test that calling getContext('webgl') on a detached OffscreenCanvas throws exception."); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.w.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.w.html new file mode 100644 index 00000000000..506eccca449 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.w.html @@ -0,0 +1,141 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#offscreencanvas"> + +<script id="myWorker" type="text/worker"> + +function isInvalidStateError(funcStr, offscreenCanvas) +{ + try { + eval(funcStr); + } catch (e) { + if (e instanceof DOMException && e.name == "InvalidStateError") + return true; + return false; + } +} + +function testExceptionWith2DContext() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('2d'); + return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas); +} + +function testExceptionWithWebGLContext() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + var ctx = offscreenCanvas.getContext('webgl'); + return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas); +} + +function testExceptionWithDetachedOffscreenCanvas1() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + self.postMessage(offscreenCanvas, [offscreenCanvas]); + return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas); +} + +function testExceptionWithDetachedOffscreenCanvas2() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + self.postMessage(offscreenCanvas, [offscreenCanvas]); + return isInvalidStateError("offscreenCanvas.getContext('2d')", offscreenCanvas); +} + +function testExceptionWithDetachedOffscreenCanvas3() +{ + var offscreenCanvas = new OffscreenCanvas(10, 10); + self.postMessage(offscreenCanvas, [offscreenCanvas]); + return isInvalidStateError("offscreenCanvas.getContext('webgl')", offscreenCanvas); +} + +self.onmessage = function(e) { + switch(e.data) { + case 'test1': + var offscreenCanvas = new OffscreenCanvas(10, 10); + self.postMessage(offscreenCanvas, [offscreenCanvas]); + break; + case 'test2': + self.postMessage(testExceptionWith2DContext()); + break; + case 'test3': + self.postMessage(testExceptionWithWebGLContext()); + break; + case 'test4': + self.postMessage(testExceptionWithDetachedOffscreenCanvas1()); + break; + case 'test5': + self.postMessage(testExceptionWithDetachedOffscreenCanvas2()); + break; + case 'test6': + self.postMessage(testExceptionWithDetachedOffscreenCanvas3()); + break; + } +}; + +</script> + +<script> +function makeWorker(script) +{ + var blob = new Blob([script]); + return new Worker(URL.createObjectURL(blob)); +} + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_equals(msg.data.width, 10); + assert_equals(msg.data.height, 10); + })); + worker.postMessage('test1'); +}, "Test that OffscreenCanvas's size is correct after being transferred from a worker."); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage('test2'); +}, "Test that transfer an OffscreenCanvas that has a 2d context throws exception in a worker."); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + assert_true(msg.data); + })); + worker.postMessage('test3'); +}, "Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker."); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + if (msg.data == true || msg.data == false) + assert_true(msg.data); + })); + worker.postMessage('test4'); +}, "Test that transfer an OffscreenCanvas twice throws exception in a worker."); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + if (msg.data == true || msg.data == false) + assert_true(msg.data); + })); + worker.postMessage('test5'); +}, "Test that calling getContext('2d') on a detached OffscreenCanvas throws exception in a worker."); + +async_test(function(t) { + var worker = makeWorker(document.getElementById("myWorker").textContent); + worker.addEventListener('message', t.step_func_done(function(msg) { + if (msg.data == true || msg.data == false) + assert_true(msg.data); + })); + worker.postMessage('test6'); +}, "Test that calling getContext('webgl') on a detached OffscreenCanvas throws exception in a worker."); + +</script> + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.default.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.default.html new file mode 100644 index 00000000000..b5fa3c0f115 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.default.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.default</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.default</h1> +<p class="desc">Default width/height when attributes are missing</p> + + +<script> +var t = async_test("Default width/height when attributes are missing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.default.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.default.worker.js new file mode 100644 index 00000000000..70bb3a2c4ce --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.default.worker.js @@ -0,0 +1,21 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.default +// Description:Default width/height when attributes are missing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Default width/height when attributes are missing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.html new file mode 100644 index 00000000000..c6728cd069f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.idl</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.idl</h1> +<p class="desc">Getting/setting width/height IDL attributes</p> + + +<script> +var t = async_test("Getting/setting width/height IDL attributes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = "100"; +offscreenCanvas.height = "100"; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); +offscreenCanvas.width = "+1.5e2"; +offscreenCanvas.height = "0x96"; +_assertSame(offscreenCanvas.width, 150, "offscreenCanvas.width", "150"); +_assertSame(offscreenCanvas.height, 150, "offscreenCanvas.height", "150"); +offscreenCanvas.width = 301.999; +offscreenCanvas.height = 301.001; +_assertSame(offscreenCanvas.width, 301, "offscreenCanvas.width", "301"); +_assertSame(offscreenCanvas.height, 301, "offscreenCanvas.height", "301"); +offscreenCanvas.width = "400x"; +offscreenCanvas.height = "foo"; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.html new file mode 100644 index 00000000000..34bcef3d294 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.idl.set.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.idl.set.zero</h1> +<p class="desc">Setting width/height IDL attributes to 0</p> + + +<script> +var t = async_test("Setting width/height IDL attributes to 0"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 0; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.worker.js new file mode 100644 index 00000000000..d321095b496 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.set.zero.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.idl.set.zero +// Description:Setting width/height IDL attributes to 0 +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting width/height IDL attributes to 0"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 0; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.worker.js new file mode 100644 index 00000000000..dc79f017540 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.idl.worker.js @@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.idl +// Description:Getting/setting width/height IDL attributes +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Getting/setting width/height IDL attributes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = "100"; +offscreenCanvas.height = "100"; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); +offscreenCanvas.width = "+1.5e2"; +offscreenCanvas.height = "0x96"; +_assertSame(offscreenCanvas.width, 150, "offscreenCanvas.width", "150"); +_assertSame(offscreenCanvas.height, 150, "offscreenCanvas.height", "150"); +offscreenCanvas.width = 301.999; +offscreenCanvas.height = 301.001; +_assertSame(offscreenCanvas.width, 301, "offscreenCanvas.width", "301"); +_assertSame(offscreenCanvas.height, 301, "offscreenCanvas.height", "301"); +offscreenCanvas.width = "400x"; +offscreenCanvas.height = "foo"; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.html new file mode 100644 index 00000000000..b6ca53426a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.decimal</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.decimal</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100.999'; +offscreenCanvas.height = '100.999'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.worker.js new file mode 100644 index 00000000000..134ee395e4c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.decimal.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.decimal +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100.999'; +offscreenCanvas.height = '100.999'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html new file mode 100644 index 00000000000..dd248f3a1ad --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.em</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.em</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100em'; +offscreenCanvas.height = '100em'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js new file mode 100644 index 00000000000..753db9a15e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.em +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100em'; +offscreenCanvas.height = '100em'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.html new file mode 100644 index 00000000000..9134ec0a919 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.empty</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.empty</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ''; +offscreenCanvas.height = ''; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.worker.js new file mode 100644 index 00000000000..940a89a0255 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.empty.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.empty +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ''; +offscreenCanvas.height = ''; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.html new file mode 100644 index 00000000000..0611080578f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.exp</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.exp</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100e1'; +offscreenCanvas.height = '100e1'; +_assertSame(offscreenCanvas.width, 1000.0, "offscreenCanvas.width", "1000.0"); +_assertSame(offscreenCanvas.height, 1000.0, "offscreenCanvas.height", "1000.0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.worker.js new file mode 100644 index 00000000000..17300f556b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.exp.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.exp +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100e1'; +offscreenCanvas.height = '100e1'; +_assertSame(offscreenCanvas.width, 1000.0, "offscreenCanvas.width", "1000.0"); +_assertSame(offscreenCanvas.height, 1000.0, "offscreenCanvas.height", "1000.0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.html new file mode 100644 index 00000000000..fed86d96c5b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.hex</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.hex</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '0x100'; +offscreenCanvas.height = '0x100'; +_assertSame(offscreenCanvas.width, 256, "offscreenCanvas.width", "256"); +_assertSame(offscreenCanvas.height, 256, "offscreenCanvas.height", "256"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.worker.js new file mode 100644 index 00000000000..76b9763e714 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.hex.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.hex +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '0x100'; +offscreenCanvas.height = '0x100'; +_assertSame(offscreenCanvas.width, 256, "offscreenCanvas.width", "256"); +_assertSame(offscreenCanvas.height, 256, "offscreenCanvas.height", "256"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html new file mode 100644 index 00000000000..6a2988718c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.junk</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.junk</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '#!?'; +offscreenCanvas.height = '#!?'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js new file mode 100644 index 00000000000..96301e2e8a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.junk +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '#!?'; +offscreenCanvas.height = '#!?'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html new file mode 100644 index 00000000000..c4981aa0ca1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.minus</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.minus</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '-100'; +offscreenCanvas.height = '-100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js new file mode 100644 index 00000000000..82a4de47d18 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.minus +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '-100'; +offscreenCanvas.height = '-100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.html new file mode 100644 index 00000000000..fd6edd57e48 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.octal</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.octal</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '0100'; +offscreenCanvas.height = '0100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.worker.js new file mode 100644 index 00000000000..0c3bbc175f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.octal.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.octal +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '0100'; +offscreenCanvas.height = '0100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.html new file mode 100644 index 00000000000..ccfa41df635 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.onlyspace</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.onlyspace</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ' '; +offscreenCanvas.height = ' '; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.worker.js new file mode 100644 index 00000000000..ec52619cdd5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.onlyspace.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.onlyspace +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ' '; +offscreenCanvas.height = ' '; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html new file mode 100644 index 00000000000..14463560c50 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.percent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.percent</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100%'; +offscreenCanvas.height = '100%'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js new file mode 100644 index 00000000000..83fda7b94a3 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.percent +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100%'; +offscreenCanvas.height = '100%'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.html new file mode 100644 index 00000000000..c4bc0299590 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.plus</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.plus</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '+100'; +offscreenCanvas.height = '+100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.worker.js new file mode 100644 index 00000000000..dee10412809 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.plus.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.plus +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '+100'; +offscreenCanvas.height = '+100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.html new file mode 100644 index 00000000000..1bbfdea3cde --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.space</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.space</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ' 100'; +offscreenCanvas.height = ' 100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.worker.js new file mode 100644 index 00000000000..a0da9ce8d01 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.space.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.space +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ' 100'; +offscreenCanvas.height = ' 100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.html new file mode 100644 index 00000000000..f68e0fa94c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.trailingjunk</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.trailingjunk</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100#!?'; +offscreenCanvas.height = '100#!?'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.worker.js new file mode 100644 index 00000000000..8e3fd569f74 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.trailingjunk.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.trailingjunk +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '100#!?'; +offscreenCanvas.height = '100#!?'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.html new file mode 100644 index 00000000000..3046f3d0127 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.whitespace</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.whitespace</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ' 100'; +offscreenCanvas.height = ' 100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.worker.js new file mode 100644 index 00000000000..5e5261d6076 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.whitespace.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.whitespace +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = ' 100'; +offscreenCanvas.height = ' 100'; +_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); +_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.html new file mode 100644 index 00000000000..4c358c0bba7 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.parse.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.parse.zero</h1> +<p class="desc">Parsing of non-negative integers</p> + + +<script> +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '0'; +offscreenCanvas.height = '0'; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.worker.js new file mode 100644 index 00000000000..f3deb485cb4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.zero.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.parse.zero +// Description:Parsing of non-negative integers +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Parsing of non-negative integers"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = '0'; +offscreenCanvas.height = '0'; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.html new file mode 100644 index 00000000000..b1fc9b9b838 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.reflect.setidl</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.reflect.setidl</h1> +<p class="desc">Setting IDL attributes updates IDL and content attributes</p> + + +<script> +var t = async_test("Setting IDL attributes updates IDL and content attributes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 120; +offscreenCanvas.height = 60; +_assertSame(offscreenCanvas.width, 120, "offscreenCanvas.width", "120"); +_assertSame(offscreenCanvas.height, 60, "offscreenCanvas.height", "60"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.worker.js new file mode 100644 index 00000000000..eb2a4288118 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidl.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.reflect.setidl +// Description:Setting IDL attributes updates IDL and content attributes +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting IDL attributes updates IDL and content attributes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 120; +offscreenCanvas.height = 60; +_assertSame(offscreenCanvas.width, 120, "offscreenCanvas.width", "120"); +_assertSame(offscreenCanvas.height, 60, "offscreenCanvas.height", "60"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.html new file mode 100644 index 00000000000..9ffdb677270 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.attributes.reflect.setidlzero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.attributes.reflect.setidlzero</h1> +<p class="desc">Setting IDL attributes to 0 updates IDL and content attributes</p> + + +<script> +var t = async_test("Setting IDL attributes to 0 updates IDL and content attributes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 0; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.worker.js new file mode 100644 index 00000000000..873fc9422b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.attributes.reflect.setidlzero.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.attributes.reflect.setidlzero +// Description:Setting IDL attributes to 0 updates IDL and content attributes +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Setting IDL attributes to 0 updates IDL and content attributes"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +offscreenCanvas.width = 0; +offscreenCanvas.height = 0; +_assertSame(offscreenCanvas.width, 0, "offscreenCanvas.width", "0"); +_assertSame(offscreenCanvas.height, 0, "offscreenCanvas.height", "0"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.large.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.large.html new file mode 100644 index 00000000000..a22c17dfc14 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.large.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: size.large</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>size.large</h1> +<p class="desc"></p> + +<p class="notes">Not sure how reasonable this is, but the spec doesn't say there's an upper limit on the size. +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long" +offscreenCanvas.width = n; +offscreenCanvas.height = n; +_assertSame(offscreenCanvas.width, n, "offscreenCanvas.width", "n"); +_assertSame(offscreenCanvas.height, n, "offscreenCanvas.height", "n"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.large.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.large.worker.js new file mode 100644 index 00000000000..797f4ab7a1d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/size.large.worker.js @@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:size.large +// Description: +// Note:<p class="notes">Not sure how reasonable this is, but the spec doesn't say there's an upper limit on the size. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long" +offscreenCanvas.width = n; +offscreenCanvas.height = n; +_assertSame(offscreenCanvas.width, n, "offscreenCanvas.width", "n"); +_assertSame(offscreenCanvas.height, n, "offscreenCanvas.height", "n"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/tools/gentest.py b/tests/wpt/web-platform-tests/offscreen-canvas/tools/gentest.py new file mode 100644 index 00000000000..1037482aecc --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/tools/gentest.py @@ -0,0 +1,6 @@ +import sys +sys.path.insert(0, '../../2dcontext/tools/') +import gentestutils +from gentestutils import genTestUtils + +genTestUtils('../../offscreen-canvas', '../../offscreen-canvas', 'templates.yaml', 'name2dir.yaml', True) diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/tools/name2dir.yaml b/tests/wpt/web-platform-tests/offscreen-canvas/tools/name2dir.yaml new file mode 100644 index 00000000000..9c6e05453af --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/tools/name2dir.yaml @@ -0,0 +1,23 @@ +2d.state: "the-canvas-state" +2d.transformation: "transformations" +2d.composite: "compositing" +2d.fillStyle: "fill-and-stroke-styles" +2d.gradient: "fill-and-stroke-styles" +2d.pattern: "fill-and-stroke-styles" +2d.strokeStyle: "fill-and-stroke-styles" +2d.shadow: "shadows" +2d.clearRect: "drawing-rectangles-to-the-canvas" +2d.fillRect: "drawing-rectangles-to-the-canvas" +2d.strokeRect: "drawing-rectangles-to-the-canvas" +2d.drawImage: "drawing-images-to-the-canvas" +2d.imageData: "pixel-manipulation" +2d.line: "line-styles" +2d.path: "path-objects" +2d.coordinatespace: "conformance-requirements" +2d.missingargs: "conformance-requirements" +2d.voidreturn: "conformance-requirements" +2d.canvas: "the-offscreen-canvas" +2d.getcontext: "the-offscreen-canvas" +context: "the-offscreen-canvas" +initial: "the-offscreen-canvas" +size: "the-offscreen-canvas" diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/tools/templates.yaml b/tests/wpt/web-platform-tests/offscreen-canvas/tools/templates.yaml new file mode 100644 index 00000000000..35740965b0c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/tools/templates.yaml @@ -0,0 +1,47 @@ +w3c: | + <!DOCTYPE html> + <!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> + <title>OffscreenCanvas test: %(name)s</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/canvas-tests.js"></script> + + <h1>%(name)s</h1> + <p class="desc">%(desc)s</p> + + %(notes)s + <script> + var t = async_test("%(escaped_desc)s"); + t.step(function() { + + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + + %(code)s + t.done(); + + }); + </script> + + +w3cworker: | + // DO NOT EDIT! This test has been generated by tools/gentest.py. + // OffscreenCanvas test in a worker:%(name)s + // Description:%(desc)s + // Note:%(notes)s + + importScripts("/resources/testharness.js"); + importScripts("/common/canvas-tests.js"); + + var t = async_test("%(escaped_desc)s"); + t.step(function() { + + var offscreenCanvas = new OffscreenCanvas(100, 50); + var ctx = offscreenCanvas.getContext('2d'); + + %(code)s + t.done(); + + }); + done(); + diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml b/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml new file mode 100644 index 00000000000..0a1befbb37b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml @@ -0,0 +1,9235 @@ +- meta: | + state = [ # some non-default values to test with + ('strokeStyle', '"#ff0000"'), + ('fillStyle', '"#ff0000"'), + ('globalAlpha', 0.5), + ('lineWidth', 0.5), + ('lineCap', '"round"'), + ('lineJoin', '"round"'), + ('miterLimit', 0.5), + ('shadowOffsetX', 5), + ('shadowOffsetY', 5), + ('shadowBlur', 5), + ('shadowColor', '"#ff0000"'), + ('globalCompositeOperation', '"copy"'), + ] + for key,value in state: + tests.append( { + 'name': '2d.state.saverestore.%s' % key, + 'desc': 'save()/restore() works for %s' % key, + 'testing': [ '2d.state.%s' % key ], + 'code': + """// Test that restore() undoes any modifications + var old = ctx.%(key)s; + ctx.save(); + ctx.%(key)s = %(value)s; + ctx.restore(); + @assert ctx.%(key)s === old; + + // Also test that save() doesn't modify the values + ctx.%(key)s = %(value)s; + old = ctx.%(key)s; + // we're not interested in failures caused by get(set(x)) != x (e.g. + // from rounding), so compare against 'old' instead of against %(value)s + ctx.save(); + @assert ctx.%(key)s === old; + ctx.restore(); + """ % { 'key':key, 'value':value } + } ) + + tests.append( { + 'name': 'initial.reset.2dstate', + 'desc': 'Resetting the canvas state resets 2D state variables', + 'testing': [ 'initial.reset' ], + 'code': + """offscreenCanvas.width = 100; + var default_val; + """ + "".join( + """ + default_val = ctx.%(key)s; + ctx.%(key)s = %(value)s; + offscreenCanvas.width = 100; + @assert ctx.%(key)s === default_val; + """ % { 'key':key, 'value':value } + for key,value in state), + } ) + +- name: 2d.state.saverestore.transformation + desc: save()/restore() affects the current transformation matrix + testing: + - 2d.state.transformation + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.translate(200, 0); + ctx.restore(); + ctx.fillStyle = '#f00'; + ctx.fillRect(-200, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.state.saverestore.clip + desc: save()/restore() affects the clipping path + testing: + - 2d.state.clip + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.rect(0, 0, 1, 1); + ctx.clip(); + ctx.restore(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.state.saverestore.path + desc: save()/restore() does not affect the current path + testing: + - 2d.state.path + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.rect(0, 0, 100, 50); + ctx.restore(); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.state.saverestore.bitmap + desc: save()/restore() does not affect the current bitmap + testing: + - 2d.state.bitmap + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.restore(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.state.saverestore.stack + desc: save()/restore() can be nested as a stack + testing: + - 2d.state.save + - 2d.state.restore + code: | + ctx.lineWidth = 1; + ctx.save(); + ctx.lineWidth = 2; + ctx.save(); + ctx.lineWidth = 3; + @assert ctx.lineWidth === 3; + ctx.restore(); + @assert ctx.lineWidth === 2; + ctx.restore(); + @assert ctx.lineWidth === 1; + +- name: 2d.state.saverestore.stackdepth + desc: save()/restore() stack depth is not unreasonably limited + testing: + - 2d.state.save + - 2d.state.restore + code: | + var limit = 512; + for (var i = 1; i < limit; ++i) + { + ctx.save(); + ctx.lineWidth = i; + } + for (var i = limit-1; i > 0; --i) + { + @assert ctx.lineWidth === i; + ctx.restore(); + } + +- name: 2d.state.saverestore.underflow + desc: restore() with an empty stack has no effect + testing: + - 2d.state.restore.underflow + code: | + for (var i = 0; i < 16; ++i) + ctx.restore(); + ctx.lineWidth = 0.5; + ctx.restore(); + @assert ctx.lineWidth === 0.5; + +- name: 2d.transformation.order + desc: Transformations are applied in the right order + testing: + - 2d.transformation.order + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(2, 1); + ctx.rotate(Math.PI / 2); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, -50, 50, 50); + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.transformation.scale.basic + desc: scale() works + testing: + - 2d.transformation.scale + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(2, 4); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 12.5); + @assert pixel 90,40 == 0,255,0,255; + +- name: 2d.transformation.scale.zero + desc: scale() with a scale factor of zero works + testing: + - 2d.transformation.scale + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.translate(50, 0); + ctx.scale(0, 1); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.restore(); + ctx.save(); + ctx.translate(0, 25); + ctx.scale(1, 0); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.restore(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.scale.negative + desc: scale() with negative scale factors works + testing: + - 2d.transformation.scale + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.scale(-1, 1); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-50, 0, 50, 50); + ctx.restore(); + ctx.save(); + ctx.scale(1, -1); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, -50, 50, 50); + ctx.restore(); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.transformation.scale.large + desc: scale() with large scale factors works + notes: Not really that large at all, but it hits the limits in Firefox. + testing: + - 2d.transformation.scale + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(1e5, 1e5); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 1, 1); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.scale.nonfinite + desc: scale() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 10); + @nonfinite ctx.scale(<0.1 Infinity -Infinity NaN>, <0.1 Infinity -Infinity NaN>); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -10, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.scale.multiple + desc: Multiple scale()s combine + testing: + - 2d.transformation.scale.multiple + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(Math.sqrt(2), Math.sqrt(2)); + ctx.scale(Math.sqrt(2), Math.sqrt(2)); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 25); + @assert pixel 90,40 == 0,255,0,255; + + +- name: 2d.transformation.rotate.zero + desc: rotate() by 0 does nothing + testing: + - 2d.transformation.rotate + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.rotate(0); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.rotate.radians + desc: rotate() uses radians + testing: + - 2d.transformation.rotate.radians + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.rotate(Math.PI); // should fail obviously if this is 3.1 degrees + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.rotate.direction + desc: rotate() is clockwise + testing: + - 2d.transformation.rotate.direction + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.rotate(Math.PI / 2); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, -100, 50, 100); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.rotate.wrap + desc: rotate() wraps large positive values correctly + testing: + - 2d.transformation.rotate + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.rotate(Math.PI * (1 + 4096)); // == pi (mod 2*pi) + // We need about pi +/- 0.001 in order to get correct-looking results + // 32-bit floats can store pi*4097 with precision 2^-10, so that should + // be safe enough on reasonable implementations + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,2 == 0,255,0,255; + @assert pixel 98,47 == 0,255,0,255; + +- name: 2d.transformation.rotate.wrapnegative + desc: rotate() wraps large negative values correctly + testing: + - 2d.transformation.rotate + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.rotate(-Math.PI * (1 + 4096)); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,2 == 0,255,0,255; + @assert pixel 98,47 == 0,255,0,255; + +- name: 2d.transformation.rotate.nonfinite + desc: rotate() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 10); + @nonfinite ctx.rotate(<0.1 Infinity -Infinity NaN>); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -10, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.translate.basic + desc: translate() works + testing: + - 2d.transformation.translate + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -50, 100, 50); + @assert pixel 90,40 == 0,255,0,255; + +- name: 2d.transformation.translate.nonfinite + desc: translate() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 10); + @nonfinite ctx.translate(<0.1 Infinity -Infinity NaN>, <0.1 Infinity -Infinity NaN>); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -10, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + + +- name: 2d.transformation.transform.identity + desc: transform() with the identity matrix does nothing + testing: + - 2d.transformation.transform + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.transform(1,0, 0,1, 0,0); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.transform.skewed + desc: transform() with skewy matrix transforms correctly + testing: + - 2d.transformation.transform + code: | + // Create green with a red square ring inside it + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(20, 10, 60, 30); + ctx.fillStyle = '#0f0'; + ctx.fillRect(40, 20, 20, 10); + // Draw a skewed shape to fill that gap, to make sure it is aligned correctly + ctx.transform(1,4, 2,3, 5,6); + // Post-transform coordinates: + // [[20,10],[80,10],[80,40],[20,40],[20,10],[40,20],[40,30],[60,30],[60,20],[40,20],[20,10]]; + // Hence pre-transform coordinates: + var pts=[[-7.4,11.2],[-43.4,59.2],[-31.4,53.2],[4.6,5.2],[-7.4,11.2], + [-15.4,25.2],[-11.4,23.2],[-23.4,39.2],[-27.4,41.2],[-15.4,25.2], + [-7.4,11.2]]; + ctx.beginPath(); + ctx.moveTo(pts[0][0], pts[0][1]); + for (var i = 0; i < pts.length; ++i) + ctx.lineTo(pts[i][0], pts[i][1]); + ctx.fill(); + @assert pixel 21,11 == 0,255,0,255; + @assert pixel 79,11 == 0,255,0,255; + @assert pixel 21,39 == 0,255,0,255; + @assert pixel 79,39 == 0,255,0,255; + @assert pixel 39,19 == 0,255,0,255; + @assert pixel 61,19 == 0,255,0,255; + @assert pixel 39,31 == 0,255,0,255; + @assert pixel 61,31 == 0,255,0,255; + +- name: 2d.transformation.transform.multiply + desc: transform() multiplies the CTM + testing: + - 2d.transformation.transform.multiply + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.transform(1,2, 3,4, 5,6); + ctx.transform(-2,1, 3/2,-1/2, 1,-2); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.transformation.transform.nonfinite + desc: transform() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 10); + @nonfinite ctx.transform(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -10, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + + +- name: 2d.transformation.setTransform.skewed + testing: + - 2d.transformation.setTransform + code: | + // Create green with a red square ring inside it + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(20, 10, 60, 30); + ctx.fillStyle = '#0f0'; + ctx.fillRect(40, 20, 20, 10); + // Draw a skewed shape to fill that gap, to make sure it is aligned correctly + ctx.setTransform(1,4, 2,3, 5,6); + // Post-transform coordinates: + // [[20,10],[80,10],[80,40],[20,40],[20,10],[40,20],[40,30],[60,30],[60,20],[40,20],[20,10]]; + // Hence pre-transform coordinates: + var pts=[[-7.4,11.2],[-43.4,59.2],[-31.4,53.2],[4.6,5.2],[-7.4,11.2], + [-15.4,25.2],[-11.4,23.2],[-23.4,39.2],[-27.4,41.2],[-15.4,25.2], + [-7.4,11.2]]; + ctx.beginPath(); + ctx.moveTo(pts[0][0], pts[0][1]); + for (var i = 0; i < pts.length; ++i) + ctx.lineTo(pts[i][0], pts[i][1]); + ctx.fill(); + @assert pixel 21,11 == 0,255,0,255; + @assert pixel 79,11 == 0,255,0,255; + @assert pixel 21,39 == 0,255,0,255; + @assert pixel 79,39 == 0,255,0,255; + @assert pixel 39,19 == 0,255,0,255; + @assert pixel 61,19 == 0,255,0,255; + @assert pixel 39,31 == 0,255,0,255; + @assert pixel 61,31 == 0,255,0,255; + +- name: 2d.transformation.setTransform.multiple + testing: + - 2d.transformation.setTransform.identity + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.setTransform(1/2,0, 0,1/2, 0,0); + ctx.setTransform(2,0, 0,2, 0,0); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 25); + @assert pixel 75,35 == 0,255,0,255; + +- name: 2d.transformation.setTransform.nonfinite + desc: setTransform() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 10); + @nonfinite ctx.setTransform(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>); + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, -10, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.composite.globalAlpha.range + testing: + - 2d.composite.globalAlpha.range + code: | + ctx.globalAlpha = 0.5; + var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons + ctx.globalAlpha = 1.1; + @assert ctx.globalAlpha === a; + ctx.globalAlpha = -0.1; + @assert ctx.globalAlpha === a; + ctx.globalAlpha = 0; + @assert ctx.globalAlpha === 0; + ctx.globalAlpha = 1; + @assert ctx.globalAlpha === 1; + +- name: 2d.composite.globalAlpha.invalid + testing: + - 2d.composite.globalAlpha.range + code: | + ctx.globalAlpha = 0.5; + var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons + ctx.globalAlpha = Infinity; + @assert ctx.globalAlpha === a; + ctx.globalAlpha = -Infinity; + @assert ctx.globalAlpha === a; + ctx.globalAlpha = NaN; + @assert ctx.globalAlpha === a; + +- name: 2d.composite.globalAlpha.default + testing: + - 2d.composite.globalAlpha.default + code: | + @assert ctx.globalAlpha === 1.0; + +- name: 2d.composite.globalAlpha.fill + testing: + - 2d.composite.globalAlpha.shape + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ 2,253,0,255; + +- name: 2d.composite.globalAlpha.image + testing: + - 2d.composite.globalAlpha.image + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 2,253,0,255; + }); + +- name: 2d.composite.globalAlpha.canvas + testing: + - 2d.composite.globalAlpha.image + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + ctx.drawImage(offscreenCanvas2, 0, 0); + @assert pixel 50,25 ==~ 2,253,0,255; + +- name: 2d.composite.globalAlpha.imagepattern + testing: + - 2d.composite.globalAlpha.image + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ 2,253,0,255; + }); + +- name: 2d.composite.globalAlpha.canvaspattern + testing: + - 2d.composite.globalAlpha.image + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = ctx.createPattern(offscreenCanvas2, 'no-repeat'); + ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimisations + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ 2,253,0,255; + +- name: 2d.composite.globalAlpha.canvascopy + testing: + - 2d.composite.globalAlpha.image + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'copy' + ctx.globalAlpha = 0.51; + ctx.drawImage(offscreenCanvas2, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,130; + + +- meta: | + # Composite operation tests + # <http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2007-March/010608.html> + ops = [ + # name FA FB + ('source-over', '1', '1-aA'), + ('destination-over', '1-aB', '1'), + ('source-in', 'aB', '0'), + ('destination-in', '0', 'aA'), + ('source-out', '1-aB', '0'), + ('destination-out', '0', '1-aA'), + ('source-atop', 'aB', '1-aA'), + ('destination-atop', '1-aB', 'aA'), + ('xor', '1-aB', '1-aA'), + ('copy', '1', '0'), + ('lighter', '1', '1'), + ] + + # The ones that change the output when src = (0,0,0,0): + ops_trans = [ 'source-in', 'destination-in', 'source-out', 'destination-atop', 'copy' ]; + + def calc_output((RA, GA, BA, aA), (RB, GB, BB, aB), FA_code, FB_code): + rA, gA, bA = RA*aA, GA*aA, BA*aA + rB, gB, bB = RB*aB, GB*aB, BB*aB + + FA = eval(FA_code) + FB = eval(FB_code) + + rO = rA*FA + rB*FB + gO = gA*FA + gB*FB + bO = bA*FA + bB*FB + aO = aA*FA + aB*FB + + rO = min(255, rO) + gO = min(255, gO) + bO = min(255, bO) + aO = min(1, aO) + + if aO: + RO = rO / aO + GO = gO / aO + BO = bO / aO + else: RO = GO = BO = 0 + + return (RO, GO, BO, aO) + + def to_test((r,g,b,a)): + return '%d,%d,%d,%d' % (round(r), round(g), round(b), round(a*255)) + def to_cairo((r,g,b,a)): + return '%f,%f,%f,%f' % (r/255., g/255., b/255., a) + + for (name, src, dest) in [ + ('solid', (255, 255, 0, 1.0), (0, 255, 255, 1.0)), + ('transparent', (0, 0, 255, 0.75), (0, 255, 0, 0.5)), + # catches the atop, xor and lighter bugs in Opera 9.10 + ]: + for op, FA_code, FB_code in ops: + expected = calc_output(src, dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'testing': [ '2d.composite.%s' % op ], + 'code': """ + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ %s +/- 5; + """ % (dest, op, src, to_test(expected)), + } ) + + for (name, src, dest) in [ ('image', (255, 255, 0, 0.75), (0, 255, 255, 0.5)) ]: + for op, FA_code, FB_code in ops: + expected = calc_output(src, dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'testing': [ '2d.composite.%s' % op ], + 'images': [ 'yellow75.png' ], + 'code': """ + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ %s +/- 5; + }); + """ % (dest, op, to_test(expected)), + } ) + + for (name, src, dest) in [ ('canvas', (255, 255, 0, 0.75), (0, 255, 255, 0.5)) ]: + for op, FA_code, FB_code in ops: + expected = calc_output(src, dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'testing': [ '2d.composite.%s' % op ], + 'images': [ 'yellow75.png' ], + 'code': """ + var offscreenCanvas2 = new OffscreenCanvas(offscreenCanvas.width, offscreenCanvas.height); + var ctx2 = offscreenCanvas2.getContext('2d'); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow75.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx2.drawImage(response, 0, 0); + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + ctx.drawImage(offscreenCanvas2, 0, 0); + @assert pixel 50,25 ==~ %s +/- 5; + }); + """ % (dest, op, to_test(expected)), + } ) + + for (name, src, dest) in [ ('uncovered.fill', (0, 0, 255, 0.75), (0, 255, 0, 0.5)) ]: + for op, FA_code, FB_code in ops: + if op not in ops_trans: continue + expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'desc': 'fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.', + 'testing': [ '2d.composite.%s' % op ], + 'code': """ + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + ctx.fillStyle = 'rgba%s'; + ctx.translate(0, 25); + ctx.fillRect(0, 50, 100, 50); + @assert pixel 50,25 ==~ %s +/- 5; + """ % (dest, op, src, to_test(expected0)), + } ) + + for (name, src, dest) in [ ('uncovered.image', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]: + for op, FA_code, FB_code in ops: + if op not in ops_trans: continue + expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'desc': 'drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.', + 'testing': [ '2d.composite.%s' % op ], + 'images': [ 'yellow.png' ], + 'code': """ + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 40, 40, 10, 10, 40, 50, 10, 10); + @assert pixel 15,15 ==~ %s +/- 5; + @assert pixel 50,25 ==~ %s +/- 5; + }); + """ % (dest, op, to_test(expected0), to_test(expected0)), + } ) + + for (name, src, dest) in [ ('uncovered.nocontext', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]: + for op, FA_code, FB_code in ops: + if op not in ops_trans: continue + expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'desc': 'drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.', + 'testing': [ '2d.composite.%s' % op ], + 'code': """ + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + ctx.drawImage(offscreenCanvas2, 0, 0); + @assert pixel 50,25 ==~ %s +/- 5; + """ % (dest, op, to_test(expected0)), + } ) + + for (name, src, dest) in [ ('uncovered.pattern', (255, 255, 0, 1.0), (0, 255, 255, 0.5)) ]: + for op, FA_code, FB_code in ops: + if op not in ops_trans: continue + expected0 = calc_output((0,0,0,0.0), dest, FA_code, FB_code) + tests.append( { + 'name': '2d.composite.%s.%s' % (name, op), + 'desc': 'Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.', + 'testing': [ '2d.composite.%s' % op ], + 'images': [ 'yellow.png' ], + 'code': """ + ctx.fillStyle = 'rgba%s'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/yellow.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.fillStyle = ctx.createPattern(response, 'no-repeat'); + ctx.fillRect(0, 50, 100, 50); + @assert pixel 50,25 ==~ %s +/- 5; + }); + """ % (dest, op, to_test(expected0)), + } ) + + for op, FA_code, FB_code in ops: + tests.append( { + 'name': '2d.composite.clip.%s' % (op), + 'desc': 'fill() does not affect pixels outside the clip region.', + 'testing': [ '2d.composite.%s' % op ], + 'code': """ + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = '%s'; + ctx.rect(-20, -20, 10, 10); + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + """ % (op), + } ) + +- name: 2d.composite.operation.get + testing: + - 2d.composite.operation + code: | + var modes = ['source-atop', 'source-in', 'source-out', 'source-over', + 'destination-atop', 'destination-in', 'destination-out', 'destination-over', + 'lighter', 'copy', 'xor']; + for (var i = 0; i < modes.length; ++i) + { + ctx.globalCompositeOperation = modes[i]; + @assert ctx.globalCompositeOperation === modes[i]; + } + +- name: 2d.composite.operation.unrecognised + testing: + - 2d.composite.operation.unrecognised + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'nonexistent'; + @assert ctx.globalCompositeOperation === 'xor'; + +- name: 2d.composite.operation.darker + testing: + - 2d.composite.operation.unrecognised + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'darker'; + @assert ctx.globalCompositeOperation === 'xor'; + +- name: 2d.composite.operation.over + testing: + - 2d.composite.operation.unrecognised + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'over'; + @assert ctx.globalCompositeOperation === 'xor'; + +- name: 2d.composite.operation.clear + testing: + - 2d.composite.operation.clear + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'clear'; + @assert ctx.globalCompositeOperation === 'clear'; + +- name: 2d.composite.operation.highlight + testing: + - 2d.composite.operation.unrecognised + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'highlight'; + @assert ctx.globalCompositeOperation === 'xor'; + +- name: 2d.composite.operation.nullsuffix + testing: + - 2d.composite.operation.exact + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'source-over\0'; + @assert ctx.globalCompositeOperation === 'xor'; + +- name: 2d.composite.operation.casesensitive + testing: + - 2d.composite.operation.casesensitive + code: | + ctx.globalCompositeOperation = 'xor'; + ctx.globalCompositeOperation = 'Source-over'; + @assert ctx.globalCompositeOperation === 'xor'; + +- name: 2d.composite.operation.default + testing: + - 2d.composite.operation.default + code: | + @assert ctx.globalCompositeOperation === 'source-over'; + +- meta: | + # Colour parsing tests + + # Try most of the CSS3 Color <color> values - http://www.w3.org/TR/css3-color/#colorunits + big_float = '1' + ('0' * 39) + big_double = '1' + ('0' * 310) + for name, string, r,g,b,a, notes in [ + ('html4', 'limE', 0,255,0,255, ""), + ('hex3', '#0f0', 0,255,0,255, ""), + ('hex4', '#0f0f', 0,255,0,255, ""), + ('hex6', '#00fF00', 0,255,0,255, ""), + ('hex8', '#00ff00ff', 0,255,0,255, ""), + ('rgb-num', 'rgb(0,255,0)', 0,255,0,255, ""), + ('rgb-clamp-1', 'rgb(-1000, 1000, -1000)', 0,255,0,255, 'Assumes colours are clamped to [0,255].'), + ('rgb-clamp-2', 'rgb(-200%, 200%, -200%)', 0,255,0,255, 'Assumes colours are clamped to [0,255].'), + ('rgb-clamp-3', 'rgb(-2147483649, 4294967298, -18446744073709551619)', 0,255,0,255, 'Assumes colours are clamped to [0,255].'), + ('rgb-clamp-4', 'rgb(-'+big_float+', '+big_float+', -'+big_float+')', 0,255,0,255, 'Assumes colours are clamped to [0,255].'), + ('rgb-clamp-5', 'rgb(-'+big_double+', '+big_double+', -'+big_double+')', 0,255,0,255, 'Assumes colours are clamped to [0,255].'), + ('rgb-percent', 'rgb(0% ,100% ,0%)', 0,255,0,255, 'CSS3 Color says "The integer value 255 corresponds to 100%". (In particular, it is not 254...)'), + ('rgb-eof', 'rgb(0, 255, 0', 0,255,0,255, ""), # see CSS2.1 4.2 "Unexpected end of style sheet" + ('rgba-solid-1', 'rgba( 0 , 255 , 0 , 1 )', 0,255,0,255, ""), + ('rgba-solid-2', 'rgba( 0 , 255 , 0 , 1.0 )', 0,255,0,255, ""), + ('rgba-solid-3', 'rgba( 0 , 255 , 0 , +1 )', 0,255,0,255, ""), + ('rgba-solid-4', 'rgba( -0 , 255 , +0 , 1 )', 0,255,0,255, ""), + ('rgba-num-1', 'rgba( 0 , 255 , 0 , .499 )', 0,255,0,127, ""), + ('rgba-num-2', 'rgba( 0 , 255 , 0 , 0.499 )', 0,255,0,127, ""), + ('rgba-percent', 'rgba(0%,100%,0%,0.499)', 0,255,0,127, ""), # 0.499*255 rounds to 127, both down and nearest, so it should be safe + ('rgba-clamp-1', 'rgba(0, 255, 0, -2)', 0,0,0,0, ""), + ('rgba-clamp-2', 'rgba(0, 255, 0, 2)', 0,255,0,255, ""), + ('rgba-eof', 'rgba(0, 255, 0, 1', 0,255,0,255, ""), + ('transparent-1', 'transparent', 0,0,0,0, ""), + ('transparent-2', 'TrAnSpArEnT', 0,0,0,0, ""), + ('hsl-1', 'hsl(120, 100%, 50%)', 0,255,0,255, ""), + ('hsl-2', 'hsl( -240 , 100% , 50% )', 0,255,0,255, ""), + ('hsl-3', 'hsl(360120, 100%, 50%)', 0,255,0,255, ""), + ('hsl-4', 'hsl(-360240, 100%, 50%)', 0,255,0,255, ""), + ('hsl-5', 'hsl(120.0, 100.0%, 50.0%)', 0,255,0,255, ""), + ('hsl-6', 'hsl(+120, +100%, +50%)', 0,255,0,255, ""), + ('hsl-clamp-1', 'hsl(120, 200%, 50%)', 0,255,0,255, ""), + ('hsl-clamp-2', 'hsl(120, -200%, 49.9%)', 127,127,127,255, ""), + ('hsl-clamp-3', 'hsl(120, 100%, 200%)', 255,255,255,255, ""), + ('hsl-clamp-4', 'hsl(120, 100%, -200%)', 0,0,0,255, ""), + ('hsla-1', 'hsla(120, 100%, 50%, 0.499)', 0,255,0,127, ""), + ('hsla-2', 'hsla( 120.0 , 100.0% , 50.0% , 1 )', 0,255,0,255, ""), + ('hsla-clamp-1', 'hsla(120, 200%, 50%, 1)', 0,255,0,255, ""), + ('hsla-clamp-2', 'hsla(120, -200%, 49.9%, 1)', 127,127,127,255, ""), + ('hsla-clamp-3', 'hsla(120, 100%, 200%, 1)', 255,255,255,255, ""), + ('hsla-clamp-4', 'hsla(120, 100%, -200%, 1)', 0,0,0,255, ""), + ('hsla-clamp-5', 'hsla(120, 100%, 50%, 2)', 0,255,0,255, ""), + ('hsla-clamp-6', 'hsla(120, 100%, 0%, -2)', 0,0,0,0, ""), + ('svg-1', 'gray', 128,128,128,255, ""), + ('svg-2', 'grey', 128,128,128,255, ""), + # css-color-4 rgb() color function + # https://drafts.csswg.org/css-color/#numeric-rgb + ('css-color-4-rgb-1', 'rgb(0, 255.0, 0)', 0,255,0,255, ""), + ('css-color-4-rgb-2', 'rgb(0, 255, 0, 0.2)', 0,255,0,51, ""), + ('css-color-4-rgb-3', 'rgb(0, 255, 0, 20%)', 0,255,0,51, ""), + ('css-color-4-rgb-4', 'rgb(0 255 0)', 0,255,0,255, ""), + ('css-color-4-rgb-5', 'rgb(0 255 0 / 0.2)', 0,255,0,51, ""), + ('css-color-4-rgb-6', 'rgb(0 255 0 / 20%)', 0,255,0,51, ""), + ('css-color-4-rgba-1', 'rgba(0, 255.0, 0)', 0,255,0,255, ""), + ('css-color-4-rgba-2', 'rgba(0, 255, 0, 0.2)', 0,255,0,51, ""), + ('css-color-4-rgba-3', 'rgba(0, 255, 0, 20%)', 0,255,0,51, ""), + ('css-color-4-rgba-4', 'rgba(0 255 0)', 0,255,0,255, ""), + ('css-color-4-rgba-5', 'rgba(0 255 0 / 0.2)', 0,255,0,51, ""), + ('css-color-4-rgba-6', 'rgba(0 255 0 / 20%)', 0,255,0,51, ""), + # css-color-4 hsl() color function + # https://drafts.csswg.org/css-color/#the-hsl-notation + ('css-color-4-hsl-1', 'hsl(120 100.0% 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsl-2', 'hsl(120 100.0% 50.0% / 0.2)', 0,255,0,51, ""), + ('css-color-4-hsl-3', 'hsl(120.0, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""), + ('css-color-4-hsl-4', 'hsl(120.0, 100.0%, 50.0%, 20%)', 0,255,0,51, ""), + ('css-color-4-hsl-5', 'hsl(120deg, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""), + ('css-color-4-hsl-6', 'hsl(120deg, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsl-7', 'hsl(133.33333333grad, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsl-8', 'hsl(2.0943951024rad, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsl-9', 'hsl(0.3333333333turn, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsla-1', 'hsl(120 100.0% 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsla-2', 'hsl(120 100.0% 50.0% / 0.2)', 0,255,0,51, ""), + ('css-color-4-hsla-3', 'hsl(120.0, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""), + ('css-color-4-hsla-4', 'hsl(120.0, 100.0%, 50.0%, 20%)', 0,255,0,51, ""), + ('css-color-4-hsla-5', 'hsl(120deg, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""), + ('css-color-4-hsla-6', 'hsl(120deg, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsla-7', 'hsl(133.33333333grad, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsla-8', 'hsl(2.0943951024rad, 100.0%, 50.0%)', 0,255,0,255, ""), + ('css-color-4-hsla-9', 'hsl(0.3333333333turn, 100.0%, 50.0%)', 0,255,0,255, ""), + # currentColor is handled later + ]: + # TODO: test by retrieving fillStyle, instead of actually drawing? + # TODO: test strokeStyle, shadowColor in the same way + test = { + 'name': '2d.fillStyle.parse.%s' % name, + 'testing': [ '2d.colours.parse' ], + 'notes': notes, + 'code': """ + ctx.fillStyle = '#f00'; + ctx.fillStyle = '%s'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == %d,%d,%d,%d; + """ % (string, r,g,b,a), + } + tests.append(test) + + # Also test that invalid colours are ignored + for name, string in [ + ('hex1', '#f'), + ('hex2', '#f0'), + ('hex3', '#g00'), + ('hex4', '#fg00'), + ('hex5', '#ff000'), + ('hex6', '#fg0000'), + ('hex7', '#ff0000f'), + ('hex8', '#fg0000ff'), + ('rgb-1', 'rgb(255.0, 0, 0,)'), + ('rgb-2', 'rgb(100%, 0, 0)'), + ('rgb-3', 'rgb(255, - 1, 0)'), + ('rgba-1', 'rgba(100%, 0, 0, 1)'), + ('rgba-2', 'rgba(255, 0, 0, 1. 0)'), + ('rgba-3', 'rgba(255, 0, 0, 1.)'), + ('rgba-4', 'rgba(255, 0, 0, '), + ('rgba-5', 'rgba(255, 0, 0, 1,)'), + ('hsl-1', 'hsl(0%, 100%, 50%)'), + ('hsl-2', 'hsl(z, 100%, 50%)'), + ('hsl-3', 'hsl(0, 0, 50%)'), + ('hsl-4', 'hsl(0, 100%, 0)'), + ('hsl-5', 'hsl(0, 100.%, 50%)'), + ('hsl-6', 'hsl(0, 100%, 50%,)'), + ('hsla-1', 'hsla(0%, 100%, 50%, 1)'), + ('hsla-2', 'hsla(0, 0, 50%, 1)'), + ('hsla-3', 'hsla(0, 0, 50%, 1,)'), + ('name-1', 'darkbrown'), + ('name-2', 'firebrick1'), + ('name-3', 'red blue'), + ('name-4', '"red"'), + ('name-5', '"red'), + # css-color-4 color function + # comma and comma-less expressions should not mix together. + ('css-color-4-rgb-1', 'rgb(255, 0, 0 / 1)'), + ('css-color-4-rgb-2', 'rgb(255 0 0, 1)'), + ('css-color-4-rgb-3', 'rgb(255, 0 0)'), + ('css-color-4-rgba-1', 'rgba(255, 0, 0 / 1)'), + ('css-color-4-rgba-2', 'rgba(255 0 0, 1)'), + ('css-color-4-rgba-3', 'rgba(255, 0 0)'), + ('css-color-4-hsl-1', 'hsl(0, 100%, 50% / 1)'), + ('css-color-4-hsl-2', 'hsl(0 100% 50%, 1)'), + ('css-color-4-hsl-3', 'hsl(0, 100% 50%)'), + ('css-color-4-hsla-1', 'hsla(0, 100%, 50% / 1)'), + ('css-color-4-hsla-2', 'hsla(0 100% 50%, 1)'), + ('css-color-4-hsla-3', 'hsla(0, 100% 50%)'), + # trailing slash + ('css-color-4-rgb-4', 'rgb(0 0 0 /)'), + ('css-color-4-rgb-5', 'rgb(0, 0, 0 /)'), + ('css-color-4-hsl-4', 'hsl(0 100% 50% /)'), + ('css-color-4-hsl-5', 'hsl(0, 100%, 50% /)'), + ]: + test = { + 'name': '2d.fillStyle.parse.invalid.%s' % name, + 'testing': [ '2d.colours.parse' ], + 'code': """ + ctx.fillStyle = '#0f0'; + try { ctx.fillStyle = '%s'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + """ % string, + } + tests.append(test) + + # Some can't have positive tests, only negative tests, because we don't know what colour they're meant to be + for name, string in [ + ('system', 'ThreeDDarkShadow'), + #('flavor', 'flavor'), # removed from latest CSS3 Color drafts + ]: + test = { + 'name': '2d.fillStyle.parse.%s' % name, + 'testing': [ '2d.colours.parse' ], + 'code': """ + ctx.fillStyle = '#f00'; + ctx.fillStyle = '%s'; + @assert ctx.fillStyle =~ /^#(?!(FF0000|ff0000|f00)$)/; // test that it's not red + """ % (string,), + } + tests.append(test) + +- name: 2d.fillStyle.invalidstring + testing: + - 2d.colours.invalidstring + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillStyle = 'invalid'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillStyle.invalidtype + testing: + - 2d.colours.invalidtype + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillStyle = null; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillStyle.get.solid + testing: + - 2d.colours.getcolour + - 2d.serializecolour.solid + code: | + ctx.fillStyle = '#fa0'; + @assert ctx.fillStyle === '#ffaa00'; + +- name: 2d.fillStyle.get.semitransparent + testing: + - 2d.colours.getcolour + - 2d.serializecolour.transparent + code: | + ctx.fillStyle = 'rgba(255,255,255,0.45)'; + @assert ctx.fillStyle =~ /^rgba\(255, 255, 255, 0\.4\d+\)$/; + +- name: 2d.fillStyle.get.transparent + testing: + - 2d.colours.getcolour + - 2d.serializecolour.transparent + code: | + ctx.fillStyle = 'rgba(0,0,0,0)'; + @assert ctx.fillStyle === 'rgba(0, 0, 0, 0)'; + +- name: 2d.fillStyle.default + testing: + - 2d.colours.default + code: | + @assert ctx.fillStyle === '#000000'; + +- name: 2d.strokeStyle.default + testing: + - 2d.colours.default + code: | + @assert ctx.strokeStyle === '#000000'; + +- name: 2d.gradient.interpolate.solid + testing: + - 2d.gradient.interpolate.linear + code: | + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.gradient.interpolate.colour + testing: + - 2d.gradient.interpolate.linear + code: | + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, '#ff0'); + g.addColorStop(1, '#00f'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 25,25 ==~ 191,191,63,255 +/- 3; + @assert pixel 50,25 ==~ 127,127,127,255 +/- 3; + @assert pixel 75,25 ==~ 63,63,191,255 +/- 3; + +- name: 2d.gradient.interpolate.alpha + testing: + - 2d.gradient.interpolate.linear + code: | + ctx.fillStyle = '#ff0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, 'rgba(0,0,255, 0)'); + g.addColorStop(1, 'rgba(0,0,255, 1)'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 25,25 ==~ 191,191,63,255 +/- 3; + @assert pixel 50,25 ==~ 127,127,127,255 +/- 3; + @assert pixel 75,25 ==~ 63,63,191,255 +/- 3; + +- name: 2d.gradient.interpolate.colouralpha + testing: + - 2d.gradient.interpolate.alpha + code: | + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, 'rgba(255,255,0, 0)'); + g.addColorStop(1, 'rgba(0,0,255, 1)'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 25,25 ==~ 190,190,65,65 +/- 3; + @assert pixel 50,25 ==~ 126,126,128,128 +/- 3; + @assert pixel 75,25 ==~ 62,62,192,192 +/- 3; + +- name: 2d.gradient.interpolate.outside + testing: + - 2d.gradient.outside.first + - 2d.gradient.outside.last + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(25, 0, 75, 0); + g.addColorStop(0.4, '#0f0'); + g.addColorStop(0.6, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 20,25 ==~ 0,255,0,255; + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 80,25 ==~ 0,255,0,255; + +- name: 2d.gradient.interpolate.zerosize.fill + testing: + - 2d.gradient.linear.zerosize + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.rect(0, 0, 100, 50); + ctx.fill(); + @assert pixel 40,20 == 0,255,0,255; + +- name: 2d.gradient.interpolate.zerosize.stroke + testing: + - 2d.gradient.linear.zerosize + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.strokeStyle = g; + ctx.rect(20, 20, 60, 10); + ctx.stroke(); + @assert pixel 19,19 == 0,255,0,255; + @assert pixel 20,19 == 0,255,0,255; + @assert pixel 21,19 == 0,255,0,255; + @assert pixel 19,20 == 0,255,0,255; + @assert pixel 20,20 == 0,255,0,255; + @assert pixel 21,20 == 0,255,0,255; + @assert pixel 19,21 == 0,255,0,255; + @assert pixel 20,21 == 0,255,0,255; + @assert pixel 21,21 == 0,255,0,255; + +- name: 2d.gradient.interpolate.zerosize.fillRect + testing: + - 2d.gradient.linear.zerosize + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 40,20 == 0,255,0,255; @moz-todo + +- name: 2d.gradient.interpolate.zerosize.strokeRect + testing: + - 2d.gradient.linear.zerosize + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(50, 25, 50, 25); // zero-length line (undefined direction) + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.strokeStyle = g; + ctx.strokeRect(20, 20, 60, 10); + @assert pixel 19,19 == 0,255,0,255; + @assert pixel 20,19 == 0,255,0,255; + @assert pixel 21,19 == 0,255,0,255; + @assert pixel 19,20 == 0,255,0,255; + @assert pixel 20,20 == 0,255,0,255; + @assert pixel 21,20 == 0,255,0,255; + @assert pixel 19,21 == 0,255,0,255; + @assert pixel 20,21 == 0,255,0,255; + @assert pixel 21,21 == 0,255,0,255; + + +- name: 2d.gradient.interpolate.vertical + testing: + - 2d.gradient.interpolate.linear + code: | + var g = ctx.createLinearGradient(0, 0, 0, 50); + g.addColorStop(0, '#ff0'); + g.addColorStop(1, '#00f'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,12 ==~ 191,191,63,255 +/- 10; + @assert pixel 50,25 ==~ 127,127,127,255 +/- 5; + @assert pixel 50,37 ==~ 63,63,191,255 +/- 10; + +- name: 2d.gradient.interpolate.multiple + testing: + - 2d.gradient.interpolate.linear + code: | + offscreenCanvas.width = 200; + var g = ctx.createLinearGradient(0, 0, 200, 0); + g.addColorStop(0, '#ff0'); + g.addColorStop(0.5, '#0ff'); + g.addColorStop(1, '#f0f'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 200, 50); + @assert pixel 50,25 ==~ 127,255,127,255 +/- 3; + @assert pixel 100,25 ==~ 0,255,255,255 +/- 3; + @assert pixel 150,25 ==~ 127,127,255,255 +/- 3; + +- name: 2d.gradient.interpolate.overlap + testing: + - 2d.gradient.interpolate.overlap + code: | + offscreenCanvas.width = 200; + var g = ctx.createLinearGradient(0, 0, 200, 0); + g.addColorStop(0, '#f00'); + g.addColorStop(0, '#ff0'); + g.addColorStop(0.25, '#00f'); + g.addColorStop(0.25, '#0f0'); + g.addColorStop(0.25, '#0f0'); + g.addColorStop(0.25, '#0f0'); + g.addColorStop(0.25, '#ff0'); + g.addColorStop(0.5, '#00f'); + g.addColorStop(0.5, '#0f0'); + g.addColorStop(0.75, '#00f'); + g.addColorStop(0.75, '#f00'); + g.addColorStop(0.75, '#ff0'); + g.addColorStop(0.5, '#0f0'); + g.addColorStop(0.5, '#0f0'); + g.addColorStop(0.5, '#ff0'); + g.addColorStop(1, '#00f'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 200, 50); + @assert pixel 49,25 ==~ 0,0,255,255 +/- 16; + @assert pixel 51,25 ==~ 255,255,0,255 +/- 16; + @assert pixel 99,25 ==~ 0,0,255,255 +/- 16; + @assert pixel 101,25 ==~ 255,255,0,255 +/- 16; + @assert pixel 149,25 ==~ 0,0,255,255 +/- 16; + @assert pixel 151,25 ==~ 255,255,0,255 +/- 16; + +- name: 2d.gradient.interpolate.overlap2 + testing: + - 2d.gradient.interpolate.overlap + code: | + var g = ctx.createLinearGradient(0, 0, 100, 0); + var ps = [ 0, 1/10, 1/4, 1/3, 1/2, 3/4, 1 ]; + for (var p = 0; p < ps.length; ++p) + { + g.addColorStop(ps[p], '#0f0'); + for (var i = 0; i < 15; ++i) + g.addColorStop(ps[p], '#f00'); + g.addColorStop(ps[p], '#0f0'); + } + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 30,25 == 0,255,0,255; + @assert pixel 40,25 == 0,255,0,255; + @assert pixel 60,25 == 0,255,0,255; + @assert pixel 80,25 == 0,255,0,255; + +- name: 2d.gradient.empty + testing: + - 2d.gradient.empty + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createLinearGradient(0, 0, 0, 50); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.gradient.object.update + testing: + - 2d.gradient.update + code: | + var g = ctx.createLinearGradient(-100, 0, 200, 0); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + g.addColorStop(0.1, '#0f0'); + g.addColorStop(0.9, '#0f0'); + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.gradient.object.compare + testing: + - 2d.gradient.object + code: | + var g1 = ctx.createLinearGradient(0, 0, 100, 0); + var g2 = ctx.createLinearGradient(0, 0, 100, 0); + @assert g1 !== g2; + ctx.fillStyle = g1; + @assert ctx.fillStyle === g1; + +- name: 2d.gradient.object.crosscanvas + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var g = offscreenCanvas2.getContext('2d').createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.gradient.object.invalidoffset + testing: + - 2d.gradient.invalidoffset + code: | + var g = ctx.createLinearGradient(0, 0, 100, 0); + @assert throws INDEX_SIZE_ERR g.addColorStop(-1, '#000'); + @assert throws INDEX_SIZE_ERR g.addColorStop(2, '#000'); + @assert throws TypeError g.addColorStop(Infinity, '#000'); + @assert throws TypeError g.addColorStop(-Infinity, '#000'); + @assert throws TypeError g.addColorStop(NaN, '#000'); + +- name: 2d.gradient.object.invalidcolour + testing: + - 2d.gradient.invalidcolour + code: | + var g = ctx.createLinearGradient(0, 0, 100, 0); + @assert throws SYNTAX_ERR g.addColorStop(0, ""); + @assert throws SYNTAX_ERR g.addColorStop(0, 'null'); + @assert throws SYNTAX_ERR g.addColorStop(0, 'undefined'); + @assert throws SYNTAX_ERR g.addColorStop(0, null); + @assert throws SYNTAX_ERR g.addColorStop(0, undefined); + +- name: 2d.gradient.linear.nonfinite + desc: createLinearGradient() throws TypeError if arguments are not finite + testing: + - 2d.gradient.linear.nonfinite + code: | + @nonfinite @assert throws TypeError ctx.createLinearGradient(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <1 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>); + +- name: 2d.gradient.linear.transform.1 + desc: Linear gradient coordinates are relative to the coordinate space at the time of filling + testing: + - 2d.gradient.linear.transform + code: | + var g = ctx.createLinearGradient(0, 0, 200, 0); + g.addColorStop(0, '#f00'); + g.addColorStop(0.25, '#0f0'); + g.addColorStop(0.75, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.translate(-50, 0); + ctx.fillRect(50, 0, 100, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.gradient.linear.transform.2 + desc: Linear gradient coordinates are relative to the coordinate space at the time of filling + testing: + - 2d.gradient.linear.transform + code: | + ctx.translate(100, 0); + var g = ctx.createLinearGradient(0, 0, 200, 0); + g.addColorStop(0, '#f00'); + g.addColorStop(0.25, '#0f0'); + g.addColorStop(0.75, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.translate(-150, 0); + ctx.fillRect(50, 0, 100, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.gradient.linear.transform.3 + desc: Linear gradient transforms do not experience broken caching effects + testing: + - 2d.gradient.linear.transform + code: | + var g = ctx.createLinearGradient(0, 0, 200, 0); + g.addColorStop(0, '#f00'); + g.addColorStop(0.25, '#0f0'); + g.addColorStop(0.75, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(-50, 0); + ctx.fillRect(50, 0, 100, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.gradient.radial.negative + desc: createRadialGradient() throws INDEX_SIZE_ERR if either radius is negative + testing: + - 2d.gradient.radial.negative + code: | + @assert throws INDEX_SIZE_ERR ctx.createRadialGradient(0, 0, -0.1, 0, 0, 1); + @assert throws INDEX_SIZE_ERR ctx.createRadialGradient(0, 0, 1, 0, 0, -0.1); + @assert throws INDEX_SIZE_ERR ctx.createRadialGradient(0, 0, -0.1, 0, 0, -0.1); +- name: 2d.gradient.radial.nonfinite + + desc: createRadialGradient() throws TypeError if arguments are not finite + testing: + - 2d.gradient.radial.nonfinite + code: | + @nonfinite @assert throws TypeError ctx.createRadialGradient(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <1 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <1 Infinity -Infinity NaN>); + +- name: 2d.gradient.radial.inside1 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(50, 25, 100, 50, 25, 200); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.inside2 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(50, 25, 200, 50, 25, 100); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.inside3 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(50, 25, 200, 50, 25, 100); + g.addColorStop(0, '#f00'); + g.addColorStop(0.993, '#f00'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.outside1 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(200, 25, 10, 200, 25, 20); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.outside2 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(200, 25, 20, 200, 25, 10); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.outside3 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(200, 25, 20, 200, 25, 10); + g.addColorStop(0, '#0f0'); + g.addColorStop(0.001, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.touch1 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(150, 25, 50, 200, 25, 100); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,1 == 0,255,0,255; @moz-todo + @assert pixel 98,1 == 0,255,0,255; @moz-todo + @assert pixel 1,25 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; @moz-todo + @assert pixel 98,25 == 0,255,0,255; @moz-todo + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 50,48 == 0,255,0,255; @moz-todo + @assert pixel 98,48 == 0,255,0,255; @moz-todo + +- name: 2d.gradient.radial.touch2 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150); + g.addColorStop(0, '#f00'); + g.addColorStop(0.01, '#0f0'); + g.addColorStop(0.99, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.touch3 + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(120, -15, 25, 140, -30, 50); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,1 == 0,255,0,255; @moz-todo + @assert pixel 98,1 == 0,255,0,255; @moz-todo + @assert pixel 1,25 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; @moz-todo + @assert pixel 98,25 == 0,255,0,255; @moz-todo + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 50,48 == 0,255,0,255; @moz-todo + @assert pixel 98,48 == 0,255,0,255; @moz-todo + +- name: 2d.gradient.radial.equal + testing: + - 2d.gradient.radial.equal + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(50, 25, 20, 50, 25, 20); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,1 == 0,255,0,255; @moz-todo + @assert pixel 98,1 == 0,255,0,255; @moz-todo + @assert pixel 1,25 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; @moz-todo + @assert pixel 98,25 == 0,255,0,255; @moz-todo + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 50,48 == 0,255,0,255; @moz-todo + @assert pixel 98,48 == 0,255,0,255; @moz-todo + +- name: 2d.gradient.radial.cone.behind + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(120, 25, 10, 211, 25, 100); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,1 == 0,255,0,255; @moz-todo + @assert pixel 98,1 == 0,255,0,255; @moz-todo + @assert pixel 1,25 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; @moz-todo + @assert pixel 98,25 == 0,255,0,255; @moz-todo + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 50,48 == 0,255,0,255; @moz-todo + @assert pixel 98,48 == 0,255,0,255; @moz-todo + +- name: 2d.gradient.radial.cone.front + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(311, 25, 10, 210, 25, 100); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.cone.bottom + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(210, 25, 100, 230, 25, 101); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.cone.top + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(230, 25, 100, 100, 25, 101); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.cone.beside + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(0, 100, 40, 100, 100, 50); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,1 == 0,255,0,255; @moz-todo + @assert pixel 98,1 == 0,255,0,255; @moz-todo + @assert pixel 1,25 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; @moz-todo + @assert pixel 98,25 == 0,255,0,255; @moz-todo + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 50,48 == 0,255,0,255; @moz-todo + @assert pixel 98,48 == 0,255,0,255; @moz-todo + +- name: 2d.gradient.radial.cone.cylinder + testing: + - 2d.gradient.radial.rendering + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(210, 25, 100, 230, 25, 100); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.cone.shape1 + testing: + - 2d.gradient.radial.rendering + code: | + var tol = 1; // tolerance to avoid antialiasing artifacts + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(30+tol, 40); + ctx.lineTo(110, -20+tol); + ctx.lineTo(110, 100-tol); + ctx.fill(); + var g = ctx.createRadialGradient(30+10*5/2, 40, 10*3/2, 30+10*15/4, 40, 10*9/4); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#0f0'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.cone.shape2 + testing: + - 2d.gradient.radial.rendering + code: | + var tol = 1; // tolerance to avoid antialiasing artifacts + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var g = ctx.createRadialGradient(30+10*5/2, 40, 10*3/2, 30+10*15/4, 40, 10*9/4); + g.addColorStop(0, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(30-tol, 40); + ctx.lineTo(110, -20-tol); + ctx.lineTo(110, 100+tol); + ctx.fill(); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,1 == 0,255,0,255; @moz-todo + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.gradient.radial.transform.1 + desc: Radial gradient coordinates are relative to the coordinate space at the time of filling + testing: + - 2d.gradient.radial.transform + code: | + var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); + g.addColorStop(0, '#0f0'); + g.addColorStop(0.5, '#0f0'); + g.addColorStop(0.51, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.translate(50, 25); + ctx.scale(10, 10); + ctx.fillRect(-5, -2.5, 10, 5); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.gradient.radial.transform.2 + desc: Radial gradient coordinates are relative to the coordinate space at the time of filling + testing: + - 2d.gradient.radial.transform + code: | + ctx.translate(100, 0); + var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); + g.addColorStop(0, '#0f0'); + g.addColorStop(0.5, '#0f0'); + g.addColorStop(0.51, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.translate(-50, 25); + ctx.scale(10, 10); + ctx.fillRect(-5, -2.5, 10, 5); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.gradient.radial.transform.3 + desc: Radial gradient transforms do not experience broken caching effects + testing: + - 2d.gradient.radial.transform + code: | + var g = ctx.createRadialGradient(0, 0, 0, 0, 0, 11.2); + g.addColorStop(0, '#0f0'); + g.addColorStop(0.5, '#0f0'); + g.addColorStop(0.51, '#f00'); + g.addColorStop(1, '#f00'); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(50, 25); + ctx.scale(10, 10); + ctx.fillRect(-5, -2.5, 10, 5); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.pattern.basic.image + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.basic.canvas + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 0, 100, 50); + var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.pattern.basic.zerocanvas + testing: + - 2d.pattern.zerocanvas + code: | + offscreenCanvas.width = 0; + offscreenCanvas.height = 10; + @assert offscreenCanvas.width === 0; + @assert offscreenCanvas.height === 10; + @assert throws INVALID_STATE_ERR ctx.createPattern(offscreenCanvas, 'repeat'); + offscreenCanvas.width = 10; + offscreenCanvas.height = 0; + @assert offscreenCanvas.width === 10; + @assert offscreenCanvas.height === 0; + @assert throws INVALID_STATE_ERR ctx.createPattern(offscreenCanvas, 'repeat'); + offscreenCanvas.width = 0; + offscreenCanvas.height = 0; + @assert offscreenCanvas.width === 0; + @assert offscreenCanvas.height === 0; + @assert throws INVALID_STATE_ERR ctx.createPattern(offscreenCanvas, 'repeat'); + +- name: 2d.pattern.basic.nocontext + testing: + - 2d.pattern.painting + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.pattern.image.undefined + testing: + - 2d.pattern.IDL + code: | + @assert throws TypeError ctx.createPattern(undefined, 'repeat'); + +- name: 2d.pattern.image.null + testing: + - 2d.pattern.IDL + code: | + @assert throws TypeError ctx.createPattern(null, 'repeat'); + +- name: 2d.pattern.image.string + testing: + - 2d.pattern.IDL + code: | + @assert throws TypeError ctx.createPattern('../images/red.png', 'repeat'); + +- name: 2d.pattern.repeat.empty + testing: + - 2d.pattern.missing + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-1x1.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, ""); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 200, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.repeat.null + testing: + - 2d.pattern.unrecognised + code: | + @assert ctx.createPattern(offscreenCanvas, null) != null; + +- name: 2d.pattern.repeat.undefined + testing: + - 2d.pattern.unrecognised + code: | + @assert throws SYNTAX_ERR ctx.createPattern(offscreenCanvas, undefined); + +- name: 2d.pattern.repeat.unrecognised + testing: + - 2d.pattern.unrecognised + code: | + @assert throws SYNTAX_ERR ctx.createPattern(offscreenCanvas, "invalid"); + +- name: 2d.pattern.repeat.unrecognisednull + testing: + - 2d.pattern.unrecognised + code: | + @assert throws SYNTAX_ERR ctx.createPattern(offscreenCanvas, "null"); + +- name: 2d.pattern.repeat.case + testing: + - 2d.pattern.exact + code: | + @assert throws SYNTAX_ERR ctx.createPattern(offscreenCanvas, "Repeat"); + +- name: 2d.pattern.repeat.nullsuffix + testing: + - 2d.pattern.exact + code: | + @assert throws SYNTAX_ERR ctx.createPattern(offscreenCanvas, "repeat\0"); + +- name: 2d.pattern.modify.canvas1 + testing: + - 2d.pattern.modify + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 0, 100, 50); + var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.pattern.modify.canvas2 + testing: + - 2d.pattern.modify + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 0, 100, 50); + var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.pattern.crosscanvas + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var pattern = offscreenCanvas2.getContext('2d').createPattern(response, 'no-repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.norepeat.basic + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.norepeat.outside + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + ctx.fillRect(-100, 0, 100, 50); + ctx.fillRect(0, 50, 100, 50); + ctx.fillRect(100, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.norepeat.coord1 + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 0); + ctx.fillRect(-50, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.norepeat.coord2 + testing: + - 2d.pattern.painting + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.fillStyle = pattern; + ctx.translate(50, 0); + ctx.fillRect(-50, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.norepeat.coord3 + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 25); + ctx.fillRect(-50, -25, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 25); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeat.basic + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeat.outside + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(50, 25); + ctx.fillRect(-50, -25, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeat.coord1 + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.translate(-128, -78); + ctx.fillRect(128, 78, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeat.coord2 + testing: + - 2d.pattern.painting + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/grgr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeat.coord3 + testing: + - 2d.pattern.painting + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(-128, -78); + ctx.fillRect(128, 78, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeatx.basic + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 16); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeatx.outside + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 16); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeatx.coord1 + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-x'); + ctx.fillStyle = pattern; + ctx.translate(0, 16); + ctx.fillRect(0, -16, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 16); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeaty.basic + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 16, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeaty.outside + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.repeaty.coord1 + testing: + - 2d.pattern.painting + images: + - red-16x16.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-16x16.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat-y'); + ctx.fillStyle = pattern; + ctx.translate(48, 0); + ctx.fillRect(-48, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 50); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.orientation.image + desc: Image patterns do not get flipped when painted + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rrgg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.save(); + ctx.translate(0, -103); + ctx.fillRect(0, 103, 100, 50); + ctx.restore(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 25); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + }); + +- name: 2d.pattern.paint.orientation.canvas + desc: Canvas patterns do not get flipped when painted + testing: + - 2d.pattern.painting + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 100, 25); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 25, 100, 25); + var pattern = ctx.createPattern(offscreenCanvas2, 'no-repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 25); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.shadow.attributes.shadowBlur.initial + testing: + - 2d.shadow.blur.get + - 2d.shadow.blur.initial + code: | + @assert ctx.shadowBlur === 0; + +- name: 2d.shadow.attributes.shadowBlur.valid + testing: + - 2d.shadow.blur.get + - 2d.shadow.blur.set + code: | + ctx.shadowBlur = 1; + @assert ctx.shadowBlur === 1; + ctx.shadowBlur = 0.5; + @assert ctx.shadowBlur === 0.5; + ctx.shadowBlur = 1e6; + @assert ctx.shadowBlur === 1e6; + ctx.shadowBlur = 0; + @assert ctx.shadowBlur === 0; + +- name: 2d.shadow.attributes.shadowBlur.invalid + testing: + - 2d.shadow.blur.invalid + code: | + ctx.shadowBlur = 1; + ctx.shadowBlur = -2; + @assert ctx.shadowBlur === 1; + ctx.shadowBlur = 1; + ctx.shadowBlur = Infinity; + @assert ctx.shadowBlur === 1; + ctx.shadowBlur = 1; + ctx.shadowBlur = -Infinity; + @assert ctx.shadowBlur === 1; + ctx.shadowBlur = 1; + ctx.shadowBlur = NaN; + @assert ctx.shadowBlur === 1; + +- name: 2d.shadow.attributes.shadowOffset.initial + testing: + - 2d.shadow.offset.initial + code: | + @assert ctx.shadowOffsetX === 0; + @assert ctx.shadowOffsetY === 0; + +- name: 2d.shadow.attributes.shadowOffset.valid + testing: + - 2d.shadow.offset.get + - 2d.shadow.offset.set + code: | + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 2; + @assert ctx.shadowOffsetX === 1; + @assert ctx.shadowOffsetY === 2; + ctx.shadowOffsetX = 0.5; + ctx.shadowOffsetY = 0.25; + @assert ctx.shadowOffsetX === 0.5; + @assert ctx.shadowOffsetY === 0.25; + ctx.shadowOffsetX = -0.5; + ctx.shadowOffsetY = -0.25; + @assert ctx.shadowOffsetX === -0.5; + @assert ctx.shadowOffsetY === -0.25; + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + @assert ctx.shadowOffsetX === 0; + @assert ctx.shadowOffsetY === 0; + ctx.shadowOffsetX = 1e6; + ctx.shadowOffsetY = 1e6; + @assert ctx.shadowOffsetX === 1e6; + @assert ctx.shadowOffsetY === 1e6; + +- name: 2d.shadow.attributes.shadowOffset.invalid + testing: + - 2d.shadow.offset.invalid + code: | + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 2; + ctx.shadowOffsetX = Infinity; + ctx.shadowOffsetY = Infinity; + @assert ctx.shadowOffsetX === 1; + @assert ctx.shadowOffsetY === 2; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 2; + ctx.shadowOffsetX = -Infinity; + ctx.shadowOffsetY = -Infinity; + @assert ctx.shadowOffsetX === 1; + @assert ctx.shadowOffsetY === 2; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 2; + ctx.shadowOffsetX = NaN; + ctx.shadowOffsetY = NaN; + @assert ctx.shadowOffsetX === 1; + @assert ctx.shadowOffsetY === 2; + +- name: 2d.shadow.attributes.shadowColor.initial + testing: + - 2d.shadow.color.initial + code: | + @assert ctx.shadowColor === 'rgba(0, 0, 0, 0)'; + +- name: 2d.shadow.attributes.shadowColor.valid + testing: + - 2d.shadow.color.get + - 2d.shadow.color.set + code: | + ctx.shadowColor = 'lime'; + @assert ctx.shadowColor === '#00ff00'; + ctx.shadowColor = 'RGBA(0,255, 0,0)'; + @assert ctx.shadowColor === 'rgba(0, 255, 0, 0)'; + +- name: 2d.shadow.attributes.shadowColor.invalid + testing: + - 2d.shadow.color.invalid + code: | + ctx.shadowColor = '#00ff00'; + ctx.shadowColor = 'bogus'; + @assert ctx.shadowColor === '#00ff00'; + ctx.shadowColor = '#00ff00'; + ctx.shadowColor = 'red bogus'; + @assert ctx.shadowColor === '#00ff00'; + ctx.shadowColor = '#00ff00'; + ctx.shadowColor = ctx; + @assert ctx.shadowColor === '#00ff00'; + ctx.shadowColor = '#00ff00'; + ctx.shadowColor = undefined; + @assert ctx.shadowColor === '#00ff00'; + +- name: 2d.shadow.enable.off.1 + desc: Shadows are not drawn when only shadowColor is set + testing: + - 2d.shadow.enable + - 2d.shadow.render + code: | + ctx.shadowColor = '#f00'; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.enable.off.2 + desc: Shadows are not drawn when only shadowColor is set + testing: + - 2d.shadow.enable + - 2d.shadow.render + code: | + ctx.globalCompositeOperation = 'destination-atop'; + ctx.shadowColor = '#f00'; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.enable.blur + desc: Shadows are drawn if shadowBlur is set + testing: + - 2d.shadow.enable + - 2d.shadow.render + code: | + ctx.globalCompositeOperation = 'destination-atop'; + ctx.shadowColor = '#0f0'; + ctx.shadowBlur = 0.1; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.enable.x + desc: Shadows are drawn if shadowOffsetX is set + testing: + - 2d.shadow.enable + - 2d.shadow.render + code: | + ctx.globalCompositeOperation = 'destination-atop'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = 0.1; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.enable.y + desc: Shadows are drawn if shadowOffsetY is set + testing: + - 2d.shadow.enable + - 2d.shadow.render + code: | + ctx.globalCompositeOperation = 'destination-atop'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 0.1; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.offset.positiveX + desc: Shadows can be offset with positive x + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = 50; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.offset.negativeX + desc: Shadows can be offset with negative x + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = -50; + ctx.fillRect(50, 0, 50, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.offset.positiveY + desc: Shadows can be offset with positive y + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 25; + ctx.fillRect(0, 0, 100, 25); + @assert pixel 50,12 == 0,255,0,255; + @assert pixel 50,37 == 0,255,0,255; + +- name: 2d.shadow.offset.negativeY + desc: Shadows can be offset with negative y + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = -25; + ctx.fillRect(0, 25, 100, 25); + @assert pixel 50,12 == 0,255,0,255; + @assert pixel 50,37 == 0,255,0,255; + +- name: 2d.shadow.outside + desc: Shadows of shapes outside the visible area can be offset onto the visible area + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = 100; + ctx.fillRect(-100, 0, 25, 50); + ctx.shadowOffsetX = -100; + ctx.fillRect(175, 0, 25, 50); + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 100; + ctx.fillRect(25, -100, 50, 25); + ctx.shadowOffsetY = -100; + ctx.fillRect(25, 125, 50, 25); + @assert pixel 12,25 == 0,255,0,255; + @assert pixel 87,25 == 0,255,0,255; + @assert pixel 50,12 == 0,255,0,255; + @assert pixel 50,37 == 0,255,0,255; + +- name: 2d.shadow.clip.1 + desc: Shadows of clipped shapes are still drawn within the clipping region + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.save(); + ctx.beginPath(); + ctx.rect(50, 0, 50, 50); + ctx.clip(); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = 50; + ctx.fillRect(0, 0, 50, 50); + ctx.restore(); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.clip.2 + desc: Shadows are not drawn outside the clipping region + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.save(); + ctx.beginPath(); + ctx.rect(0, 0, 50, 50); + ctx.clip(); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetX = 50; + ctx.fillRect(0, 0, 50, 50); + ctx.restore(); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.clip.3 + desc: Shadows of clipped shapes are still drawn within the clipping region + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.save(); + ctx.beginPath(); + ctx.rect(0, 0, 50, 50); + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = 50; + ctx.fillRect(-50, 0, 50, 50); + ctx.restore(); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.stroke.basic + desc: Shadows are drawn for strokes + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.beginPath(); + ctx.lineWidth = 50; + ctx.moveTo(0, -25); + ctx.lineTo(100, -25); + ctx.stroke(); + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + +- name: 2d.shadow.stroke.cap.1 + desc: Shadows are not drawn for areas outside stroke caps + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + ctx.beginPath(); + ctx.lineWidth = 50; + ctx.lineCap = 'butt'; + ctx.moveTo(-50, -25); + ctx.lineTo(0, -25); + ctx.moveTo(100, -25); + ctx.lineTo(150, -25); + ctx.stroke(); + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + +- name: 2d.shadow.stroke.cap.2 + desc: Shadows are drawn for stroke caps + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.beginPath(); + ctx.lineWidth = 50; + ctx.lineCap = 'square'; + ctx.moveTo(25, -25); + ctx.lineTo(75, -25); + ctx.stroke(); + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + +- name: 2d.shadow.stroke.join.1 + desc: Shadows are not drawn for areas outside stroke joins + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.shadowColor = '#f00'; + ctx.shadowOffsetX = 100; + ctx.lineWidth = 200; + ctx.lineJoin = 'bevel'; + ctx.beginPath(); + ctx.moveTo(-200, -50); + ctx.lineTo(-150, -50); + ctx.lineTo(-151, -100); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.shadow.stroke.join.2 + desc: Shadows are drawn for stroke joins + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.strokeStyle = '#f00'; + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetX = 100; + ctx.lineWidth = 200; + ctx.lineJoin = 'miter'; + ctx.beginPath(); + ctx.moveTo(-200, -50); + ctx.lineTo(-150, -50); + ctx.lineTo(-151, -100); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.shadow.stroke.join.3 + desc: Shadows are drawn for stroke joins respecting miter limit + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.shadowColor = '#f00'; + ctx.shadowOffsetX = 100; + ctx.lineWidth = 200; + ctx.lineJoin = 'miter'; + ctx.miterLimit = 0.1; + ctx.beginPath(); + ctx.moveTo(-200, -50); + ctx.lineTo(-150, -50); + ctx.lineTo(-151, -100); // (not an exact right angle, to avoid some other bug in Firefox 3) + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.shadow.image.basic + desc: Shadows are drawn for images + testing: + - 2d.shadow.render + images: + - red.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, -50); + @assert pixel 50,25 == 0,255,0,255; + }); + +- name: 2d.shadow.image.transparent.1 + desc: Shadows are not drawn for transparent images + testing: + - 2d.shadow.render + images: + - transparent.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, -50); + @assert pixel 50,25 == 0,255,0,255; + }); + +- name: 2d.shadow.image.transparent.2 + desc: Shadows are not drawn for transparent parts of images + testing: + - 2d.shadow.render + images: + - redtransparent.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 50, -50); + ctx.shadowColor = '#f00'; + ctx.drawImage(response, -50, -50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + }); + +- name: 2d.shadow.image.alpha + desc: Shadows are drawn correctly for partially-transparent images + testing: + - 2d.shadow.render + images: + - transparent50.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#00f'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent50.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, -50); + @assert pixel 50,25 ==~ 127,0,127,255; + }); + +- name: 2d.shadow.image.section + desc: Shadows are not drawn for areas outside image source rectangles + testing: + - 2d.shadow.render + images: + - redtransparent.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#f00'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 50, 0, 50, 50, 0, -50, 50, 50); + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + }); + +- name: 2d.shadow.image.scale + desc: Shadows are drawn correctly for scaled images + testing: + - 2d.shadow.render + images: + - redtransparent.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0, 100, 50, -10, -50, 240, 50); + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + }); + +- name: 2d.shadow.canvas.basic + desc: Shadows are drawn for canvases + testing: + - 2d.shadow.render + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.drawImage(offscreenCanvas2, 0, -50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.canvas.transparent.1 + desc: Shadows are not drawn for transparent canvases + testing: + - 2d.shadow.render + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + ctx.drawImage(offscreenCanvas2, 0, -50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.canvas.transparent.2 + desc: Shadows are not drawn for transparent parts of canvases + testing: + - 2d.shadow.render + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#f00'; + ctx2.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.drawImage(offscreenCanvas2, 50, -50); + ctx.shadowColor = '#f00'; + ctx.drawImage(offscreenCanvas2, -50, -50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.canvas.alpha + desc: Shadows are drawn correctly for partially-transparent canvases + testing: + - 2d.shadow.render + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = 'rgba(255, 0, 0, 0.5)'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#00f'; + ctx.drawImage(offscreenCanvas2, 0, -50); + @assert pixel 50,25 ==~ 127,0,127,255; + +- name: 2d.shadow.pattern.basic + desc: Shadows are drawn for fill patterns + testing: + - 2d.shadow.render + images: + - red.png + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + }); + +- name: 2d.shadow.pattern.transparent.1 + desc: Shadows are not drawn for transparent fill patterns + testing: + - 2d.shadow.render + # http://bugs.webkit.org/show_bug.cgi?id=15266 + images: + - transparent.png + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + }); + +- name: 2d.shadow.pattern.transparent.2 + desc: Shadows are not drawn for transparent parts of fill patterns + testing: + - 2d.shadow.render + images: + - redtransparent.png + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + }); + +- name: 2d.shadow.pattern.alpha + desc: Shadows are drawn correctly for partially-transparent fill patterns + testing: + - 2d.shadow.render + images: + - transparent50.png + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/transparent50.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + var pattern = ctx.createPattern(response, 'repeat'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#00f'; + ctx.fillStyle = pattern; + ctx.fillRect(0, -50, 100, 50); + }); + +- name: 2d.shadow.gradient.basic + desc: Shadows are drawn for gradient fills + testing: + - 2d.shadow.render + # http://bugs.webkit.org/show_bug.cgi?id=15266 + code: | + var gradient = ctx.createLinearGradient(0, 0, 100, 0); + gradient.addColorStop(0, '#f00'); + gradient.addColorStop(1, '#f00'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = gradient; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.gradient.transparent.1 + desc: Shadows are not drawn for transparent gradient fills + testing: + - 2d.shadow.render + # http://bugs.webkit.org/show_bug.cgi?id=15266 + code: | + var gradient = ctx.createLinearGradient(0, 0, 100, 0); + gradient.addColorStop(0, 'rgba(0,0,0,0)'); + gradient.addColorStop(1, 'rgba(0,0,0,0)'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowOffsetY = 50; + ctx.fillStyle = gradient; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.gradient.transparent.2 + desc: Shadows are not drawn for transparent parts of gradient fills + testing: + - 2d.shadow.render + code: | + var gradient = ctx.createLinearGradient(0, 0, 100, 0); + gradient.addColorStop(0, '#f00'); + gradient.addColorStop(0.499, '#f00'); + gradient.addColorStop(0.5, 'rgba(0,0,0,0)'); + gradient.addColorStop(1, 'rgba(0,0,0,0)'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(50, 0, 50, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.fillStyle = gradient; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + +- name: 2d.shadow.gradient.alpha + desc: Shadows are drawn correctly for partially-transparent gradient fills + testing: + - 2d.shadow.render + code: | + var gradient = ctx.createLinearGradient(0, 0, 100, 0); + gradient.addColorStop(0, 'rgba(255,0,0,0.5)'); + gradient.addColorStop(1, 'rgba(255,0,0,0.5)'); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#00f'; + ctx.fillStyle = gradient; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 ==~ 127,0,127,255; + +- name: 2d.shadow.transform.1 + desc: Shadows take account of transformations + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.translate(100, 100); + ctx.fillRect(-100, -150, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.transform.2 + desc: Shadow offsets are not affected by transformations + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowOffsetY = 50; + ctx.shadowColor = '#0f0'; + ctx.rotate(Math.PI) + ctx.fillRect(-100, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.shadow.alpha.1 + desc: Shadow colour alpha components are used + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = 'rgba(255, 0, 0, 0.01)'; + ctx.shadowOffsetY = 50; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255 +/- 4; + +- name: 2d.shadow.alpha.2 + desc: Shadow colour alpha components are used + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = 'rgba(0, 0, 255, 0.5)'; + ctx.shadowOffsetY = 50; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 ==~ 127,0,127,255; + +- name: 2d.shadow.alpha.3 + desc: Shadows are affected by globalAlpha + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; // (work around broken Firefox globalAlpha caching) + ctx.shadowColor = '#00f'; + ctx.shadowOffsetY = 50; + ctx.globalAlpha = 0.5; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 ==~ 127,0,127,255; + +- name: 2d.shadow.alpha.4 + desc: Shadows with alpha components are correctly affected by globalAlpha + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; // (work around broken Firefox globalAlpha caching) + ctx.shadowColor = 'rgba(0, 0, 255, 0.707)'; + ctx.shadowOffsetY = 50; + ctx.globalAlpha = 0.707; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 ==~ 127,0,127,255; + +- name: 2d.shadow.alpha.5 + desc: Shadows of shapes with alpha components are drawn correctly + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = 'rgba(64, 0, 0, 0.5)'; + ctx.shadowColor = '#00f'; + ctx.shadowOffsetY = 50; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 ==~ 127,0,127,255; + +- name: 2d.shadow.composite.1 + desc: Shadows are drawn using globalCompositeOperation + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'xor'; + ctx.shadowColor = '#f00'; + ctx.shadowOffsetX = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(-100, 0, 200, 50); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.shadow.composite.2 + desc: Shadows are drawn using globalCompositeOperation + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'xor'; + ctx.shadowColor = '#f00'; + ctx.shadowBlur = 1; + ctx.fillStyle = '#0f0'; + ctx.fillRect(-10, -10, 120, 70); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.shadow.composite.3 + desc: Areas outside shadows are drawn correctly with destination-out + testing: + - 2d.shadow.render + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-out'; + ctx.shadowColor = '#f00'; + ctx.shadowBlur = 10; + ctx.fillStyle = '#f00'; + ctx.fillRect(200, 0, 100, 50); + @assert pixel 5,5 ==~ 0,255,0,255; + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.clearRect.basic + desc: clearRect clears to transparent black + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.clearRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.clearRect.path + desc: clearRect does not affect the current path + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 50); + ctx.clearRect(0, 0, 16, 16); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.clearRect.zero + desc: clearRect of zero pixels has no effect + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.clearRect(0, 0, 100, 0); + ctx.clearRect(0, 0, 0, 50); + ctx.clearRect(0, 0, 0, 0); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.clearRect.negative + desc: clearRect of negative sizes works + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.clearRect(0, 0, 50, 25); + ctx.clearRect(100, 0, -50, 25); + ctx.clearRect(0, 50, 50, -25); + ctx.clearRect(100, 50, -50, -25); + @assert pixel 25,12 == 0,0,0,0; + @assert pixel 75,12 == 0,0,0,0; + @assert pixel 25,37 == 0,0,0,0; + @assert pixel 75,37 == 0,0,0,0; + +- name: 2d.clearRect.transform + desc: clearRect is affected by transforms + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(10, 10); + ctx.translate(0, 5); + ctx.clearRect(0, -5, 10, 5); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.clearRect.globalalpha + desc: clearRect is not affected by globalAlpha + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalAlpha = 0.1; + ctx.clearRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.clearRect.globalcomposite + desc: clearRect is not affected by globalCompositeOperation + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-atop'; + ctx.clearRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.clearRect.clip + desc: clearRect is affected by clipping regions + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(0, 0, 16, 16); + ctx.clip(); + ctx.clearRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 16); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.clearRect.shadow + desc: clearRect does not draw shadows + testing: + - 2d.clearRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#f00'; + ctx.shadowBlur = 0; + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 50; + ctx.clearRect(0, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.clearRect.nonfinite + desc: clearRect() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @nonfinite ctx.clearRect(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillRect.basic + desc: fillRect works + testing: + - 2d.fillRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillRect.path + desc: fillRect does not affect the current path + testing: + - 2d.fillRect + code: | + ctx.beginPath(); + ctx.rect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 16, 16); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillRect.zero + desc: fillRect of zero pixels has no effect + testing: + - 2d.fillRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 0); + ctx.fillRect(0, 0, 0, 50); + ctx.fillRect(0, 0, 0, 0); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillRect.negative + desc: fillRect of negative sizes works + testing: + - 2d.fillRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 25); + ctx.fillRect(100, 0, -50, 25); + ctx.fillRect(0, 50, 50, -25); + ctx.fillRect(100, 50, -50, -25); + @assert pixel 25,12 == 0,255,0,255; + @assert pixel 75,12 == 0,255,0,255; + @assert pixel 25,37 == 0,255,0,255; + @assert pixel 75,37 == 0,255,0,255; + +- name: 2d.fillRect.transform + desc: fillRect is affected by transforms + testing: + - 2d.fillRect + code: | + ctx.scale(10, 10); + ctx.translate(0, 5); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, -5, 10, 5); + @assert pixel 50,25 == 0,255,0,255; + +# don't bother testing globalalpha, globalcomposite because they're already heavily used by other test cases + +- name: 2d.fillRect.clip + desc: fillRect is affected by clipping regions + testing: + - 2d.fillRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(0, 0, 16, 16); + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 16); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillRect.shadow + desc: fillRect draws shadows + testing: + - 2d.fillRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.shadowColor = '#0f0'; + ctx.shadowBlur = 0; + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 50; + ctx.fillRect(0, -50, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.fillRect.nonfinite + desc: fillRect() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + @nonfinite ctx.fillRect(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.basic + desc: strokeRect works + testing: + - 2d.strokeRect + code: | + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.strokeRect(25, 24, 50, 2); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.path + desc: strokeRect does not affect the current path + testing: + - 2d.strokeRect + code: | + ctx.beginPath(); + ctx.rect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 5; + ctx.strokeRect(0, 0, 16, 16); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.zero.1 + desc: strokeRect of 0x0 pixels draws nothing + testing: + - 2d.strokeRect + code: | + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 250; + ctx.strokeRect(50, 25, 0, 0); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.strokeRect.zero.2 + desc: strokeRect of 0x0 pixels draws nothing, including caps and joins + testing: + - 2d.strokeRect + code: | + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 250; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.strokeRect(50, 25, 0, 0); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.strokeRect.zero.3 + desc: strokeRect of Nx0 pixels draws a straight line + testing: + - 2d.strokeRect + code: | + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.strokeRect(0, 25, 100, 0); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.zero.4 + desc: strokeRect of Nx0 pixels draws a closed line with no caps + testing: + - 2d.strokeRect + code: | + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 250; + ctx.lineCap = 'round'; + ctx.strokeRect(100, 25, 100, 0); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.strokeRect.zero.5 + desc: strokeRect of Nx0 pixels draws a closed line with joins + testing: + - 2d.strokeRect + code: | + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 250; + ctx.lineJoin = 'round'; + ctx.strokeRect(100, 25, 100, 0); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.negative + desc: strokeRect of negative sizes works + testing: + - 2d.strokeRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 25; + ctx.strokeRect(12, 12, 26, 1); + ctx.strokeRect(88, 12, -26, 1); + ctx.strokeRect(12, 38, 26, -1); + ctx.strokeRect(88, 38, -26, -1); + @assert pixel 25,12 == 0,255,0,255; + @assert pixel 75,12 == 0,255,0,255; + @assert pixel 25,37 == 0,255,0,255; + @assert pixel 75,37 == 0,255,0,255; + +- name: 2d.strokeRect.transform + desc: fillRect is affected by transforms + testing: + - 2d.strokeRect + code: | + ctx.scale(10, 10); + ctx.translate(0, 5); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 5; + ctx.strokeRect(2.5, -2.6, 5, 0.2); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.globalalpha + desc: strokeRect is affected by globalAlpha + testing: + - 2d.strokeRect + code: | + ctx.globalAlpha = 0; + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.strokeRect(25, 24, 50, 2); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.strokeRect.globalcomposite + desc: strokeRect is not affected by globalCompositeOperation + testing: + - 2d.strokeRect + code: | + ctx.globalCompositeOperation = 'source-in'; + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.strokeRect(25, 24, 50, 2); + @assert pixel 50,25 == 0,0,0,0; + +- name: 2d.strokeRect.clip + desc: strokeRect is affected by clipping regions + testing: + - 2d.strokeRect + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(0, 0, 16, 16); + ctx.clip(); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.strokeRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 16, 16); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.shadow + desc: strokeRect draws shadows + testing: + - 2d.strokeRect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.shadowColor = '#0f0'; + ctx.shadowBlur = 0; + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 50; + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.strokeRect(0, -75, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.strokeRect.nonfinite + desc: strokeRect() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 150; + @nonfinite ctx.strokeRect(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + @assert pixel 50,25 == 0,255,0,255; + + +- name: 2d.drawImage.3arg + testing: + - 2d.drawImage.defaultsource + - 2d.drawImage.defaultdest + images: + - red.png + - green.png + code: | + var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 0, 0); + ctx.drawImage(response1, -100, 0); + ctx.drawImage(response1, 100, 0); + ctx.drawImage(response1, 0, -50); + ctx.drawImage(response1, 0, 50); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.5arg + testing: + - 2d.drawImage.defaultsource + images: + - red.png + - green.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 50, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 50, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.9arg.basic + testing: + - 2d.drawImage.paint + images: + - green.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0, 100, 50, 0, 0, 100, 50); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.9arg.sourcepos + testing: + - 2d.drawImage.paint + images: + - rgrg-256x256.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 140, 20, 100, 50, 0, 0, 100, 50); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.9arg.sourcesize + testing: + - 2d.drawImage.paint + images: + - rgrg-256x256.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/rgrg-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0, 256, 256, 0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 51, 26); + ctx.fillRect(49, 24, 51, 26); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + @assert pixel 20,20 ==~ 0,255,0,255; + @assert pixel 80,20 ==~ 0,255,0,255; + @assert pixel 20,30 ==~ 0,255,0,255; + @assert pixel 80,30 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.9arg.destpos + testing: + - 2d.drawImage.paint + images: + - red.png + - green.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 0, 0, 100, 50, 0, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, -100, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 100, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, -50, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, 50, 100, 50); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.9arg.destsize + testing: + - 2d.drawImage.paint + images: + - red.png + - green.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 1, 1, 1, 1, 0, 0, 100, 50); + ctx.drawImage(response1, 0, 0, 100, 50, -50, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 100, 0, 50, 50); + ctx.drawImage(response1, 0, 0, 100, 50, 0, -25, 100, 25); + ctx.drawImage(response1, 0, 0, 100, 50, 0, 50, 100, 25); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.canvas + testing: + - 2d.drawImage.paint + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.drawImage(offscreenCanvas2, 0, 0); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + +- name: 2d.drawImage.self.1 + testing: + - 2d.drawImage.self + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50); + ctx.drawImage(offscreenCanvas, 50, 0); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + +- name: 2d.drawImage.self.2 + testing: + - 2d.drawImage.self + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 1, 100, 49); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 1); + ctx.drawImage(offscreenCanvas, 0, 1); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 2); + @assert pixel 0,0 ==~ 0,255,0,255; + @assert pixel 99,0 ==~ 0,255,0,255; + @assert pixel 0,49 ==~ 0,255,0,255; + @assert pixel 99,49 ==~ 0,255,0,255; + +- name: 2d.drawImage.null + testing: + - 2d.drawImage.IDL + code: | + @assert throws TypeError ctx.drawImage(null, 0, 0); + +- name: 2d.drawImage.zerocanvas + testing: + - 2d.drawImage.zerocanvas + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var offscreenCanvas2 = new OffscreenCanvas(0, 10); + ctx.drawImage(offscreenCanvas2, 0, 0); + offscreenCanvas2.width = 10; + offscreenCanvas2.height = 0; + ctx.drawImage(offscreenCanvas2, 0, 0); + offscreenCanvas2.width = 0; + offscreenCanvas2.height = 0; + ctx.drawImage(offscreenCanvas2, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.drawImage.wrongtype + desc: Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError + testing: + - 2d.drawImage.IDL + code: | + @assert throws TypeError ctx.drawImage(undefined, 0, 0); + @assert throws TypeError ctx.drawImage(0, 0, 0); + @assert throws TypeError ctx.drawImage("", 0, 0); + +- name: 2d.drawImage.floatsource + testing: + - 2d.drawImage.paint + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 10.1, 10.1, 0.1, 0.1, 0, 0, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.zerosource + desc: drawImage with zero-sized source rectangle throws INDEX_SIZE_ERR + testing: + - 2d.drawImage.zerosource + images: + - red.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + @assert throws INDEX_SIZE_ERR ctx.drawImage(response, 10, 10, 0, 1, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response, 10, 10, 1, 0, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response, 10, 10, 0, 0, 0, 0, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.zerosource.image + desc: drawImage with zero-sized source rectangle from image throws INDEX_SIZE_ERR + testing: + - 2d.drawImage.zerosource + images: + - red-zerowidth.svg + - red-zeroheight.svg + - red-zerosize.svg + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red-zerowidth.svg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + @assert throws INDEX_SIZE_ERR ctx.drawImage(response, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response, 0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + }); + +- name: 2d.drawImage.negativesource + desc: Negative source width/height represents the correct rectangle + testing: + - 2d.drawImage.direction + mozilla: { throws } + images: + - ggrr-256x256.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 100, 78, -100, 50, 0, 0, 50, 50); + ctx.drawImage(response, 100, 128, -100, -50, 50, 0, 50, 50); + @assert pixel 1,1 ==~ 0,255,0,255; + @assert pixel 1,48 ==~ 0,255,0,255; + @assert pixel 98,1 ==~ 0,255,0,255; + @assert pixel 98,48 ==~ 0,255,0,255; + @assert pixel 48,1 ==~ 0,255,0,255; + @assert pixel 48,48 ==~ 0,255,0,255; + @assert pixel 51,1 ==~ 0,255,0,255; + @assert pixel 51,48 ==~ 0,255,0,255; + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.negativedest + desc: Negative destination width/height represents the correct rectangle + testing: + - 2d.drawImage.direction + mozilla: { throws } + images: + - ggrr-256x256.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 100, 78, 50, 50, 0, 50, 50, -50); + ctx.drawImage(response, 100, 128, 50, -50, 100, 50, -50, -50); + @assert pixel 1,1 ==~ 0,255,0,255; + @assert pixel 1,48 ==~ 0,255,0,255; + @assert pixel 98,1 ==~ 0,255,0,255; + @assert pixel 98,48 ==~ 0,255,0,255; + @assert pixel 48,1 ==~ 0,255,0,255; + @assert pixel 48,48 ==~ 0,255,0,255; + @assert pixel 51,1 ==~ 0,255,0,255; + @assert pixel 51,48 ==~ 0,255,0,255; + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.negativedir + desc: Negative dimensions do not affect the direction of the image + testing: + - 2d.drawImage.direction + mozilla: { throws } + images: + - ggrr-256x256.png + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/ggrr-256x256.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 178, 50, -100, 0, 0, 50, 100); + ctx.drawImage(response, 0, 78, 50, 100, 50, 100, 50, -100); + @assert pixel 1,1 ==~ 0,255,0,255; + @assert pixel 1,48 ==~ 0,255,0,255; + @assert pixel 98,1 ==~ 0,255,0,255; + @assert pixel 98,48 ==~ 0,255,0,255; + @assert pixel 48,1 ==~ 0,255,0,255; + @assert pixel 48,48 ==~ 0,255,0,255; + @assert pixel 51,1 ==~ 0,255,0,255; + @assert pixel 51,48 ==~ 0,255,0,255; + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.outsidesource + DISABLED: fix this to match the current spec (transparent black outside source) + testing: + - 2d.drawImage.outsidesource + code: | + var promise1 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + var promise2 = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + Promise.all([promise1, promise2]).then(function(response1, response2) { + ctx.drawImage(response2, 10.5, 10.5, 89.5, 39.5, 0, 0, 100, 50); + ctx.drawImage(response2, 5.5, 5.5, -5.5, -5.5, 0, 0, 100, 50); + ctx.drawImage(response2, 100, 50, -5, -5, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, -0.001, 0, 100, 50, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 0, -0.001, 100, 50, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 0, 0, 100.001, 50, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 0, 0, 100, 50.001, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 50, 0, 50.001, 50, 0, 0, 100, 50); @moz-todo + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 0, 0, -5, 5, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 0, 0, 5, -5, 0, 0, 100, 50); + @assert throws INDEX_SIZE_ERR ctx.drawImage(response1, 110, 60, -20, -20, 0, 0, 100, 50); + @assert pixel 50,25 ==~ 0,255,0,255; @moz-todo + }); + +- name: 2d.drawImage.broken + testing: + - 2d.drawImage.incomplete.image + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/broken.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; @moz-todo + }); + +- name: 2d.drawImage.svg + desc: drawImage() of an SVG image + testing: + - 2d.drawImage.svg + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/green.svg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.animated.poster + desc: drawImage() of an APNG draws the poster frame + testing: + - 2d.drawImage.animated.image + images: + - anim-poster-gr.png + code: | + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/anim-poster-gr.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; @moz-todo + }); + +- name: 2d.drawImage.path + testing: + - 2d.drawImage.unaffect + code: | + ctx.fillStyle = '#0f0'; + ctx.rect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + ctx.fill(); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.transform + testing: + - 2d.drawImage.subject + images: + - red.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(100, 0); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.alpha + testing: + - 2d.drawImage.subject + images: + - red.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalAlpha = 0; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.clip + testing: + - 2d.drawImage.subject + images: + - red.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.rect(-10, -10, 1, 1); + ctx.clip(); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.composite + testing: + - 2d.drawImage.subject + images: + - red.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.globalCompositeOperation = 'destination-over'; + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/red.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.nowrap + desc: Stretched images do not get pixels wrapping around the edges + images: + - redtransparent.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + ctx.drawImage(response, -1950, 0, 2000, 50); + @assert pixel 45,25 ==~ 0,255,0,255; + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 55,25 ==~ 0,255,0,255; + }); + +- name: 2d.drawImage.nonfinite + desc: drawImage() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + images: + - red.png + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var promise = new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/images/redtransparent.png'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + promise.then(function(response) { + @nonfinite ctx.drawImage(<response>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>); + @nonfinite ctx.drawImage(<response>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + @nonfinite ctx.drawImage(<response>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + @assert pixel 50,25 == 0,255,0,255; + }); + +- name: 2d.imageData.create2.basic + desc: createImageData(sw, sh) exists and returns something + testing: + - 2d.imageData.create2.object + code: | + @assert ctx.createImageData(1, 1) !== null; + +- name: 2d.imageData.create1.basic + desc: createImageData(imgdata) exists and returns something + testing: + - 2d.imageData.create1.object + code: | + @assert ctx.createImageData(ctx.createImageData(1, 1)) !== null; + +- name: 2d.imageData.create2.initial + desc: createImageData(sw, sh) returns transparent black data of the right size + testing: + - 2d.imageData.create2.size + - 2d.imageData.create.initial + - 2d.imageData.initial + code: | + var imgdata = ctx.createImageData(10, 20); + @assert imgdata.data.length === imgdata.width*imgdata.height*4; + @assert imgdata.width < imgdata.height; + @assert imgdata.width > 0; + var isTransparentBlack = true; + for (var i = 0; i < imgdata.data.length; ++i) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; + @assert isTransparentBlack; + +- name: 2d.imageData.create1.initial + desc: createImageData(imgdata) returns transparent black data of the right size + testing: + - 2d.imageData.create1.size + - 2d.imageData.create.initial + - 2d.imageData.initial + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var imgdata1 = ctx.getImageData(0, 0, 10, 20); + var imgdata2 = ctx.createImageData(imgdata1); + @assert imgdata2.data.length === imgdata1.data.length; + @assert imgdata2.width === imgdata1.width; + @assert imgdata2.height === imgdata1.height; + var isTransparentBlack = true; + for (var i = 0; i < imgdata2.data.length; ++i) + if (imgdata2.data[i] !== 0) + isTransparentBlack = false; + @assert isTransparentBlack; + +- name: 2d.imageData.create2.large + desc: createImageData(sw, sh) works for sizes much larger than the canvas + testing: + - 2d.imageData.create2.size + code: | + var imgdata = ctx.createImageData(1000, 2000); + @assert imgdata.data.length === imgdata.width*imgdata.height*4; + @assert imgdata.width < imgdata.height; + @assert imgdata.width > 0; + var isTransparentBlack = true; + for (var i = 0; i < imgdata.data.length; i += 7813) // check ~1024 points (assuming normal scaling) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; + @assert isTransparentBlack; + +- name: 2d.imageData.create2.tiny + desc: createImageData(sw, sh) works for sizes smaller than one pixel + testing: + - 2d.imageData.create2.size + - 2d.imageData.one + code: | + var imgdata = ctx.createImageData(0.0001, 0.0001); + @assert imgdata.data.length === imgdata.width*imgdata.height*4; + @assert imgdata.width === 1; + @assert imgdata.height === 1; + var isTransparentBlack = true; + for (var i = 0; i < imgdata.data.length; ++i) + if (imgdata.data[i] !== 0) + isTransparentBlack = false; + @assert isTransparentBlack; + +- name: 2d.imageData.create2.negative + desc: createImageData(sw, sh) takes the absolute magnitude of the size arguments + testing: + - 2d.imageData.create2.size + code: | + var imgdata1 = ctx.createImageData(10, 20); + var imgdata2 = ctx.createImageData(-10, 20); + var imgdata3 = ctx.createImageData(10, -20); + var imgdata4 = ctx.createImageData(-10, -20); + @assert imgdata1.data.length === imgdata2.data.length; + @assert imgdata2.data.length === imgdata3.data.length; + @assert imgdata3.data.length === imgdata4.data.length; + +- name: 2d.imageData.create2.zero + desc: createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero + testing: + - 2d.imageData.getcreate.zero + code: | + @assert throws INDEX_SIZE_ERR ctx.createImageData(10, 0); + @assert throws INDEX_SIZE_ERR ctx.createImageData(0, 10); + @assert throws INDEX_SIZE_ERR ctx.createImageData(0, 0); + +- name: 2d.imageData.create2.nonfinite + desc: createImageData() throws TypeError if arguments are not finite + testing: + - 2d.imageData.getcreate.nonfinite + code: | + @nonfinite @assert throws TypeError ctx.createImageData(<10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>); + var posinfobj = { valueOf: function() { return Infinity; } }, + neginfobj = { valueOf: function() { return -Infinity; } }, + nanobj = { valueOf: function() { return -Infinity; } }; + @nonfinite @assert throws TypeError ctx.createImageData(<10 posinfobj neginfobj nanobj>, <10 posinfobj neginfobj nanobj>); + +- name: 2d.imageData.create1.zero + desc: createImageData(null) throws TypeError + testing: + - 2d.imageData.create.null + code: | + @assert throws TypeError ctx.createImageData(null); + +- name: 2d.imageData.create2.round + desc: createImageData(w, h) is rounded the same as getImageData(0, 0, w, h) + testing: + - 2d.imageData.createround + code: | + var imgdata1 = ctx.createImageData(10.01, 10.99); + var imgdata2 = ctx.getImageData(0, 0, 10.01, 10.99); + @assert imgdata1.width === imgdata2.width; + @assert imgdata1.height === imgdata2.height; + +- name: 2d.imageData.get.basic + desc: getImageData() exists and returns something + testing: + - 2d.imageData.get.basic + code: | + @assert ctx.getImageData(0, 0, 100, 50) !== null; + +- name: 2d.imageData.get.zero + desc: getImageData() throws INDEX_SIZE_ERR if size is zero + testing: + - 2d.imageData.getcreate.zero + code: | + @assert throws INDEX_SIZE_ERR ctx.getImageData(1, 1, 10, 0); + @assert throws INDEX_SIZE_ERR ctx.getImageData(1, 1, 0, 10); + @assert throws INDEX_SIZE_ERR ctx.getImageData(1, 1, 0, 0); + +- name: 2d.imageData.get.nonfinite + desc: getImageData() throws TypeError if arguments are not finite + testing: + - 2d.imageData.getcreate.nonfinite + code: | + @nonfinite @assert throws TypeError ctx.getImageData(<10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>); + var posinfobj = { valueOf: function() { return Infinity; } }, + neginfobj = { valueOf: function() { return -Infinity; } }, + nanobj = { valueOf: function() { return -Infinity; } }; + @nonfinite @assert throws TypeError ctx.getImageData(<10 posinfobj neginfobj nanobj>, <10 posinfobj neginfobj nanobj>, <10 posinfobj neginfobj nanobj>, <10 posinfobj neginfobj nanobj>); + +- name: 2d.imageData.get.source.outside + desc: getImageData() returns transparent black outside the canvas + testing: + - 2d.imageData.get.basic + - 2d.imageData.get.outside + code: | + ctx.fillStyle = '#08f'; + ctx.fillRect(0, 0, 100, 50); + var imgdata1 = ctx.getImageData(-10, 5, 1, 1); + @assert imgdata1.data[0] === 0; + @assert imgdata1.data[1] === 0; + @assert imgdata1.data[2] === 0; + @assert imgdata1.data[3] === 0; + var imgdata2 = ctx.getImageData(10, -5, 1, 1); + @assert imgdata2.data[0] === 0; + @assert imgdata2.data[1] === 0; + @assert imgdata2.data[2] === 0; + @assert imgdata2.data[3] === 0; + var imgdata3 = ctx.getImageData(200, 5, 1, 1); + @assert imgdata3.data[0] === 0; + @assert imgdata3.data[1] === 0; + @assert imgdata3.data[2] === 0; + @assert imgdata3.data[3] === 0; + var imgdata4 = ctx.getImageData(10, 60, 1, 1); + @assert imgdata4.data[0] === 0; + @assert imgdata4.data[1] === 0; + @assert imgdata4.data[2] === 0; + @assert imgdata4.data[3] === 0; + var imgdata5 = ctx.getImageData(100, 10, 1, 1); + @assert imgdata5.data[0] === 0; + @assert imgdata5.data[1] === 0; + @assert imgdata5.data[2] === 0; + @assert imgdata5.data[3] === 0; + var imgdata6 = ctx.getImageData(0, 10, 1, 1); + @assert imgdata6.data[0] === 0; + @assert imgdata6.data[1] === 136; + @assert imgdata6.data[2] === 255; + @assert imgdata6.data[3] === 255; + var imgdata7 = ctx.getImageData(-10, 10, 20, 20); + @assert imgdata7.data[ 0*4+0] === 0; + @assert imgdata7.data[ 0*4+1] === 0; + @assert imgdata7.data[ 0*4+2] === 0; + @assert imgdata7.data[ 0*4+3] === 0; + @assert imgdata7.data[ 9*4+0] === 0; + @assert imgdata7.data[ 9*4+1] === 0; + @assert imgdata7.data[ 9*4+2] === 0; + @assert imgdata7.data[ 9*4+3] === 0; + @assert imgdata7.data[10*4+0] === 0; + @assert imgdata7.data[10*4+1] === 136; + @assert imgdata7.data[10*4+2] === 255; + @assert imgdata7.data[10*4+3] === 255; + @assert imgdata7.data[19*4+0] === 0; + @assert imgdata7.data[19*4+1] === 136; + @assert imgdata7.data[19*4+2] === 255; + @assert imgdata7.data[19*4+3] === 255; + @assert imgdata7.data[20*4+0] === 0; + @assert imgdata7.data[20*4+1] === 0; + @assert imgdata7.data[20*4+2] === 0; + @assert imgdata7.data[20*4+3] === 0; + +- name: 2d.imageData.get.source.negative + desc: getImageData() works with negative width and height, and returns top-to-bottom left-to-right + testing: + - 2d.imageData.get.basic + - 2d.pixelarray.order + code: | + ctx.fillStyle = '#000'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#fff'; + ctx.fillRect(20, 10, 60, 10); + var imgdata1 = ctx.getImageData(85, 25, -10, -10); + @assert imgdata1.data[0] === 255; + @assert imgdata1.data[1] === 255; + @assert imgdata1.data[2] === 255; + @assert imgdata1.data[3] === 255; + @assert imgdata1.data[imgdata1.data.length-4+0] === 0; + @assert imgdata1.data[imgdata1.data.length-4+1] === 0; + @assert imgdata1.data[imgdata1.data.length-4+2] === 0; + @assert imgdata1.data[imgdata1.data.length-4+3] === 255; + var imgdata2 = ctx.getImageData(0, 0, -1, -1); + @assert imgdata2.data[0] === 0; + @assert imgdata2.data[1] === 0; + @assert imgdata2.data[2] === 0; + @assert imgdata2.data[3] === 0; + +- name: 2d.imageData.get.source.size + desc: getImageData() returns bigger ImageData for bigger source rectangle + testing: + - 2d.imageData.get.basic + code: | + var imgdata1 = ctx.getImageData(0, 0, 10, 10); + var imgdata2 = ctx.getImageData(0, 0, 20, 20); + @assert imgdata2.width > imgdata1.width; + @assert imgdata2.height > imgdata1.height; + +- name: 2d.imageData.get.tiny + desc: getImageData() works for sizes smaller than one pixel + testing: + - 2d.imageData.one + code: | + var imgdata = ctx.getImageData(0, 0, 0.0001, 0.0001); + @assert imgdata.data.length === imgdata.width*imgdata.height*4; + @assert imgdata.width === 1; + @assert imgdata.height === 1; + +- name: 2d.imageData.get.nonpremul + desc: getImageData() returns non-premultiplied colours + testing: + - 2d.imageData.get.premul + code: | + ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + var imgdata = ctx.getImageData(10, 10, 10, 10); + @assert imgdata.data[0] > 200; + @assert imgdata.data[1] > 200; + @assert imgdata.data[2] > 200; + @assert imgdata.data[3] > 100; + @assert imgdata.data[3] < 200; + +- name: 2d.imageData.get.range + desc: getImageData() returns values in the range [0, 255] + testing: + - 2d.pixelarray.range + - 2d.pixelarray.retrieve + code: | + ctx.fillStyle = '#000'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#fff'; + ctx.fillRect(20, 10, 60, 10); + var imgdata1 = ctx.getImageData(10, 5, 1, 1); + @assert imgdata1.data[0] === 0; + var imgdata2 = ctx.getImageData(30, 15, 1, 1); + @assert imgdata2.data[0] === 255; + +- name: 2d.imageData.get.clamp + desc: getImageData() clamps colours to the range [0, 255] + testing: + - 2d.pixelarray.range + code: | + ctx.fillStyle = 'rgb(-100, -200, -300)'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = 'rgb(256, 300, 400)'; + ctx.fillRect(20, 10, 60, 10); + var imgdata1 = ctx.getImageData(10, 5, 1, 1); + @assert imgdata1.data[0] === 0; + @assert imgdata1.data[1] === 0; + @assert imgdata1.data[2] === 0; + var imgdata2 = ctx.getImageData(30, 15, 1, 1); + @assert imgdata2.data[0] === 255; + @assert imgdata2.data[1] === 255; + @assert imgdata2.data[2] === 255; + +- name: 2d.imageData.get.length + desc: getImageData() returns a correctly-sized Uint8ClampedArray + testing: + - 2d.pixelarray.length + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + @assert imgdata.data.length === imgdata.width*imgdata.height*4; + +- name: 2d.imageData.get.order.cols + desc: getImageData() returns leftmost columns first + testing: + - 2d.pixelarray.order + code: | + ctx.fillStyle = '#fff'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#000'; + ctx.fillRect(0, 0, 2, 50); + var imgdata = ctx.getImageData(0, 0, 10, 10); + @assert imgdata.data[0] === 0; + @assert imgdata.data[Math.round(imgdata.width/2*4)] === 255; + @assert imgdata.data[Math.round((imgdata.height/2)*imgdata.width*4)] === 0; + +- name: 2d.imageData.get.order.rows + desc: getImageData() returns topmost rows first + testing: + - 2d.pixelarray.order + code: | + ctx.fillStyle = '#fff'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#000'; + ctx.fillRect(0, 0, 100, 2); + var imgdata = ctx.getImageData(0, 0, 10, 10); + @assert imgdata.data[0] === 0; + @assert imgdata.data[Math.floor(imgdata.width/2*4)] === 0; + @assert imgdata.data[(imgdata.height/2)*imgdata.width*4] === 255; + +- name: 2d.imageData.get.order.rgb + desc: getImageData() returns R then G then B + testing: + - 2d.pixelarray.order + - 2d.pixelarray.indexes + code: | + ctx.fillStyle = '#48c'; + ctx.fillRect(0, 0, 100, 50); + var imgdata = ctx.getImageData(0, 0, 10, 10); + @assert imgdata.data[0] === 0x44; + @assert imgdata.data[1] === 0x88; + @assert imgdata.data[2] === 0xCC; + @assert imgdata.data[3] === 255; + @assert imgdata.data[4] === 0x44; + @assert imgdata.data[5] === 0x88; + @assert imgdata.data[6] === 0xCC; + @assert imgdata.data[7] === 255; + +- name: 2d.imageData.get.order.alpha + desc: getImageData() returns A in the fourth component + testing: + - 2d.pixelarray.order + code: | + ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; + ctx.fillRect(0, 0, 100, 50); + var imgdata = ctx.getImageData(0, 0, 10, 10); + @assert imgdata.data[3] < 200; + @assert imgdata.data[3] > 100; + +- name: 2d.imageData.get.unaffected + desc: getImageData() is not affected by context state + testing: + - 2d.imageData.unaffected + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 50, 50) + ctx.fillStyle = '#f00'; + ctx.fillRect(50, 0, 50, 50) + ctx.save(); + ctx.translate(50, 0); + ctx.globalAlpha = 0.1; + ctx.globalCompositeOperation = 'destination-atop'; + ctx.shadowColor = '#f00'; + ctx.rect(0, 0, 5, 5); + ctx.clip(); + var imgdata = ctx.getImageData(0, 0, 50, 50); + ctx.restore(); + ctx.putImageData(imgdata, 50, 0); + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + + +- name: 2d.imageData.object.properties + desc: ImageData objects have the right properties + testing: + - 2d.imageData.type + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + @assert typeof(imgdata.width) === 'number'; + @assert typeof(imgdata.height) === 'number'; + @assert typeof(imgdata.data) === 'object'; + +- name: 2d.imageData.object.readonly + desc: ImageData objects properties are read-only + testing: + - 2d.imageData.type + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + var w = imgdata.width; + var h = imgdata.height; + var d = imgdata.data; + imgdata.width = 123; + imgdata.height = 123; + imgdata.data = [100,100,100,100]; + @assert imgdata.width === w; + @assert imgdata.height === h; + @assert imgdata.data === d; + @assert imgdata.data[0] === 0; + @assert imgdata.data[1] === 0; + @assert imgdata.data[2] === 0; + @assert imgdata.data[3] === 0; + +- name: 2d.imageData.object.set + desc: ImageData.data can be modified + testing: + - 2d.pixelarray.modify + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + imgdata.data[0] = 100; + @assert imgdata.data[0] === 100; + imgdata.data[0] = 200; + @assert imgdata.data[0] === 200; + +- name: 2d.imageData.object.undefined + desc: ImageData.data converts undefined to 0 + testing: + - 2d.pixelarray.modify + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + imgdata.data[0] = 100; + imgdata.data[0] = undefined; + @assert imgdata.data[0] === 0; + +- name: 2d.imageData.object.nan + desc: ImageData.data converts NaN to 0 + testing: + - 2d.pixelarray.modify + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + imgdata.data[0] = 100; + imgdata.data[0] = NaN; + @assert imgdata.data[0] === 0; + imgdata.data[0] = 100; + imgdata.data[0] = "cheese"; + @assert imgdata.data[0] === 0; + +- name: 2d.imageData.object.string + desc: ImageData.data converts strings to numbers with ToNumber + testing: + - 2d.pixelarray.modify + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + imgdata.data[0] = 100; + imgdata.data[0] = "110"; + @assert imgdata.data[0] === 110; + imgdata.data[0] = 100; + imgdata.data[0] = "0x78"; + @assert imgdata.data[0] === 120; + imgdata.data[0] = 100; + imgdata.data[0] = " +130e0 "; + @assert imgdata.data[0] === 130; + +- name: 2d.imageData.object.clamp + desc: ImageData.data clamps numbers to [0, 255] + testing: + - 2d.pixelarray.modify + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + imgdata.data[0] = 100; + imgdata.data[0] = 300; + @assert imgdata.data[0] === 255; + imgdata.data[0] = 100; + imgdata.data[0] = -100; + @assert imgdata.data[0] === 0; + imgdata.data[0] = 100; + imgdata.data[0] = 200+Math.pow(2, 32); + @assert imgdata.data[0] === 255; + imgdata.data[0] = 100; + imgdata.data[0] = -200-Math.pow(2, 32); + @assert imgdata.data[0] === 0; + imgdata.data[0] = 100; + imgdata.data[0] = Math.pow(10, 39); + @assert imgdata.data[0] === 255; + imgdata.data[0] = 100; + imgdata.data[0] = -Math.pow(10, 39); + @assert imgdata.data[0] === 0; + imgdata.data[0] = 100; + imgdata.data[0] = -Infinity; + @assert imgdata.data[0] === 0; + imgdata.data[0] = 100; + imgdata.data[0] = Infinity; + @assert imgdata.data[0] === 255; + +- name: 2d.imageData.object.round + desc: ImageData.data rounds numbers with round-to-zero + testing: + - 2d.pixelarray.modify + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + imgdata.data[0] = 0.499; + @assert imgdata.data[0] === 0; + imgdata.data[0] = 0.5; + @assert imgdata.data[0] === 0; + imgdata.data[0] = 0.501; + @assert imgdata.data[0] === 1; + imgdata.data[0] = 1.499; + @assert imgdata.data[0] === 1; + imgdata.data[0] = 1.5; + @assert imgdata.data[0] === 2; + imgdata.data[0] = 1.501; + @assert imgdata.data[0] === 2; + imgdata.data[0] = 2.5; + @assert imgdata.data[0] === 2; + imgdata.data[0] = 3.5; + @assert imgdata.data[0] === 4; + imgdata.data[0] = 252.5; + @assert imgdata.data[0] === 252; + imgdata.data[0] = 253.5; + @assert imgdata.data[0] === 254; + imgdata.data[0] = 254.5; + @assert imgdata.data[0] === 254; + imgdata.data[0] = 256.5; + @assert imgdata.data[0] === 255; + imgdata.data[0] = -0.5; + @assert imgdata.data[0] === 0; + imgdata.data[0] = -1.5; + @assert imgdata.data[0] === 0; + +- name: 2d.imageData.put.null + desc: putImageData() with null imagedata throws TypeError + testing: + - 2d.imageData.put.wrongtype + code: | + @assert throws TypeError ctx.putImageData(null, 0, 0); + +- name: 2d.imageData.put.nonfinite + desc: putImageData() throws TypeError if arguments are not finite + testing: + - 2d.imageData.put.nonfinite + code: | + var imgdata = ctx.getImageData(0, 0, 10, 10); + @nonfinite @assert throws TypeError ctx.putImageData(<imgdata>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>); + @nonfinite @assert throws TypeError ctx.putImageData(<imgdata>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>, <10 Infinity -Infinity NaN>); + +- name: 2d.imageData.put.basic + desc: putImageData() puts image data from getImageData() onto the canvas + testing: + - 2d.imageData.put.normal + - 2d.imageData.put.3arg + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.putImageData(imgdata, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.created + desc: putImageData() puts image data from createImageData() onto the canvas + testing: + - 2d.imageData.put.normal + code: | + var imgdata = ctx.createImageData(100, 50); + for (var i = 0; i < imgdata.data.length; i += 4) { + imgdata.data[i] = 0; + imgdata.data[i+1] = 255; + imgdata.data[i+2] = 0; + imgdata.data[i+3] = 255; + } + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.putImageData(imgdata, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.wrongtype + desc: putImageData() does not accept non-ImageData objects + testing: + - 2d.imageData.put.wrongtype + code: | + var imgdata = { width: 1, height: 1, data: [255, 0, 0, 255] }; + @assert throws TypeError ctx.putImageData(imgdata, 0, 0); + @assert throws TypeError ctx.putImageData("cheese", 0, 0); + @assert throws TypeError ctx.putImageData(42, 0, 0); + +- name: 2d.imageData.put.cross + desc: putImageData() accepts image data got from a different canvas + testing: + - 2d.imageData.put.normal + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var ctx2 = offscreenCanvas2.getContext('2d'); + ctx2.fillStyle = '#0f0'; + ctx2.fillRect(0, 0, 100, 50) + var imgdata = ctx2.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.putImageData(imgdata, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.alpha + desc: putImageData() puts non-solid image data correctly + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = 'rgba(0, 255, 0, 0.25)'; + ctx.fillRect(0, 0, 100, 50) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.putImageData(imgdata, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,64; + +- name: 2d.imageData.put.modified + desc: putImageData() puts modified image data correctly + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#f00'; + ctx.fillRect(45, 20, 10, 10) + var imgdata = ctx.getImageData(45, 20, 10, 10); + for (var i = 0, len = imgdata.width*imgdata.height*4; i < len; i += 4) + { + imgdata.data[i] = 0; + imgdata.data[i+1] = 255; + } + ctx.putImageData(imgdata, 45, 20); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.dirty.zero + desc: putImageData() with zero-sized dirty rectangle puts nothing + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + ctx.putImageData(imgdata, 0, 0, 0, 0, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.dirty.rect1 + desc: putImageData() only modifies areas inside the dirty rectangle, using width and height + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 20, 20) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#f00'; + ctx.fillRect(40, 20, 20, 20) + ctx.putImageData(imgdata, 40, 20, 0, 0, 20, 20); + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 35,25 ==~ 0,255,0,255; + @assert pixel 65,25 ==~ 0,255,0,255; + @assert pixel 50,15 ==~ 0,255,0,255; + @assert pixel 50,45 ==~ 0,255,0,255; + +- name: 2d.imageData.put.dirty.rect2 + desc: putImageData() only modifies areas inside the dirty rectangle, using x and y + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#0f0'; + ctx.fillRect(60, 30, 20, 20) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#f00'; + ctx.fillRect(40, 20, 20, 20) + ctx.putImageData(imgdata, -20, -10, 60, 30, 20, 20); + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 35,25 ==~ 0,255,0,255; + @assert pixel 65,25 ==~ 0,255,0,255; + @assert pixel 50,15 ==~ 0,255,0,255; + @assert pixel 50,45 ==~ 0,255,0,255; + +- name: 2d.imageData.put.dirty.negative + desc: putImageData() handles negative-sized dirty rectangles correctly + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 20, 20) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + ctx.fillStyle = '#f00'; + ctx.fillRect(40, 20, 20, 20) + ctx.putImageData(imgdata, 40, 20, 20, 20, -20, -20); + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 35,25 ==~ 0,255,0,255; + @assert pixel 65,25 ==~ 0,255,0,255; + @assert pixel 50,15 ==~ 0,255,0,255; + @assert pixel 50,45 ==~ 0,255,0,255; + +- name: 2d.imageData.put.dirty.outside + desc: putImageData() handles dirty rectangles outside the canvas correctly + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + ctx.putImageData(imgdata, 100, 20, 20, 20, -20, -20); + ctx.putImageData(imgdata, 200, 200, 0, 0, 100, 50); + ctx.putImageData(imgdata, 40, 20, -30, -20, 30, 20); + ctx.putImageData(imgdata, -30, 20, 0, 0, 30, 20); + @assert pixel 50,25 ==~ 0,255,0,255; + @assert pixel 98,15 ==~ 0,255,0,255; + @assert pixel 98,25 ==~ 0,255,0,255; + @assert pixel 98,45 ==~ 0,255,0,255; + @assert pixel 1,5 ==~ 0,255,0,255; + @assert pixel 1,25 ==~ 0,255,0,255; + @assert pixel 1,45 ==~ 0,255,0,255; + +- name: 2d.imageData.put.unchanged + desc: putImageData(getImageData(...), ...) has no effect + testing: + - 2d.imageData.unchanged + code: | + var i = 0; + for (var y = 0; y < 16; ++y) { + for (var x = 0; x < 16; ++x, ++i) { + ctx.fillStyle = 'rgba(' + i + ',' + (Math.floor(i*1.5) % 256) + ',' + (Math.floor(i*23.3) % 256) + ',' + (i/256) + ')'; + ctx.fillRect(x, y, 1, 1); + } + } + var imgdata1 = ctx.getImageData(0.1, 0.2, 15.8, 15.9); + var olddata = []; + for (var i = 0; i < imgdata1.data.length; ++i) + olddata[i] = imgdata1.data[i]; + ctx.putImageData(imgdata1, 0.1, 0.2); + var imgdata2 = ctx.getImageData(0.1, 0.2, 15.8, 15.9); + for (var i = 0; i < imgdata2.data.length; ++i) { + @assert olddata[i] === imgdata2.data[i]; + } + +- name: 2d.imageData.put.unaffected + desc: putImageData() is not affected by context state + testing: + - 2d.imageData.unaffected + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.globalAlpha = 0.1; + ctx.globalCompositeOperation = 'destination-atop'; + ctx.shadowColor = '#f00'; + ctx.shadowBlur = 1; + ctx.translate(100, 50); + ctx.scale(0.1, 0.1); + ctx.putImageData(imgdata, 0, 0); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.clip + desc: putImageData() is not affected by clipping regions + testing: + - 2d.imageData.unaffected + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50) + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.beginPath(); + ctx.rect(0, 0, 50, 50); + ctx.clip(); + ctx.putImageData(imgdata, 0, 0); + @assert pixel 25,25 ==~ 0,255,0,255; + @assert pixel 75,25 ==~ 0,255,0,255; + +- name: 2d.imageData.put.path + desc: putImageData() does not affect the current path + testing: + - 2d.imageData.put.normal + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50) + ctx.rect(0, 0, 100, 50); + var imgdata = ctx.getImageData(0, 0, 100, 50); + ctx.putImageData(imgdata, 0, 0); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 ==~ 0,255,0,255; + +- name: 2d.line.defaults + testing: + - 2d.lineWidth.default + - 2d.lineCap.default + - 2d.lineJoin.default + - 2d.miterLimit.default + code: | + @assert ctx.lineWidth === 1; + @assert ctx.lineCap === 'butt'; + @assert ctx.lineJoin === 'miter'; + @assert ctx.miterLimit === 10; + +- name: 2d.line.width.basic + desc: lineWidth determines the width of line strokes + testing: + - 2d.lineWidth + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 20; + // Draw a green line over a red box, to check the line is not too small + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(15, 15, 20, 20); + ctx.beginPath(); + ctx.moveTo(25, 15); + ctx.lineTo(25, 35); + ctx.stroke(); + // Draw a green box over a red line, to check the line is not too large + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(75, 15); + ctx.lineTo(75, 35); + ctx.stroke(); + ctx.fillRect(65, 15, 20, 20); + @assert pixel 14,25 == 0,255,0,255; + @assert pixel 15,25 == 0,255,0,255; + @assert pixel 16,25 == 0,255,0,255; + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 34,25 == 0,255,0,255; + @assert pixel 35,25 == 0,255,0,255; + @assert pixel 36,25 == 0,255,0,255; + @assert pixel 64,25 == 0,255,0,255; + @assert pixel 65,25 == 0,255,0,255; + @assert pixel 66,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + @assert pixel 84,25 == 0,255,0,255; + @assert pixel 85,25 == 0,255,0,255; + @assert pixel 86,25 == 0,255,0,255; + +- name: 2d.line.width.transformed + desc: Line stroke widths are affected by scale transformations + testing: + - 2d.lineWidth + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 4; + // Draw a green line over a red box, to check the line is not too small + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(15, 15, 20, 20); + ctx.save(); + ctx.scale(5, 1); + ctx.beginPath(); + ctx.moveTo(5, 15); + ctx.lineTo(5, 35); + ctx.stroke(); + ctx.restore(); + // Draw a green box over a red line, to check the line is not too large + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.save(); + ctx.scale(-5, 1); + ctx.beginPath(); + ctx.moveTo(-15, 15); + ctx.lineTo(-15, 35); + ctx.stroke(); + ctx.restore(); + ctx.fillRect(65, 15, 20, 20); + @assert pixel 14,25 == 0,255,0,255; + @assert pixel 15,25 == 0,255,0,255; + @assert pixel 16,25 == 0,255,0,255; + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 34,25 == 0,255,0,255; + @assert pixel 35,25 == 0,255,0,255; + @assert pixel 36,25 == 0,255,0,255; + @assert pixel 64,25 == 0,255,0,255; + @assert pixel 65,25 == 0,255,0,255; + @assert pixel 66,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + @assert pixel 84,25 == 0,255,0,255; + @assert pixel 85,25 == 0,255,0,255; + @assert pixel 86,25 == 0,255,0,255; + +- name: 2d.line.width.scaledefault + desc: Default lineWidth strokes are affected by scale transformations + testing: + - 2d.lineWidth + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(50, 50); + ctx.strokeStyle = '#0f0'; + ctx.moveTo(0, 0.5); + ctx.lineTo(2, 0.5); + ctx.stroke(); + @assert pixel 25,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 75,25 == 0,255,0,255; + @assert pixel 50,5 == 0,255,0,255; + @assert pixel 50,45 == 0,255,0,255; + +- name: 2d.line.width.valid + desc: Setting lineWidth to valid values works + testing: + - 2d.lineWidth.set + - 2d.lineWidth.get + code: | + ctx.lineWidth = 1.5; + @assert ctx.lineWidth === 1.5; + ctx.lineWidth = "1e1"; + @assert ctx.lineWidth === 10; + ctx.lineWidth = 1/1024; + @assert ctx.lineWidth === 1/1024; + ctx.lineWidth = 1000; + @assert ctx.lineWidth === 1000; + +- name: 2d.line.width.invalid + desc: Setting lineWidth to invalid values is ignored + testing: + - 2d.lineWidth.invalid + code: | + ctx.lineWidth = 1.5; + @assert ctx.lineWidth === 1.5; + ctx.lineWidth = 1.5; + ctx.lineWidth = 0; + @assert ctx.lineWidth === 1.5; + ctx.lineWidth = 1.5; + ctx.lineWidth = -1; + @assert ctx.lineWidth === 1.5; + ctx.lineWidth = 1.5; + ctx.lineWidth = Infinity; + @assert ctx.lineWidth === 1.5; + ctx.lineWidth = 1.5; + ctx.lineWidth = -Infinity; + @assert ctx.lineWidth === 1.5; + ctx.lineWidth = 1.5; + ctx.lineWidth = NaN; + @assert ctx.lineWidth === 1.5; + +- name: 2d.line.cap.butt + desc: lineCap 'butt' is rendered correctly + testing: + - 2d.lineCap.butt + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineCap = 'butt'; + ctx.lineWidth = 20; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(15, 15, 20, 20); + ctx.beginPath(); + ctx.moveTo(25, 15); + ctx.lineTo(25, 35); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(75, 15); + ctx.lineTo(75, 35); + ctx.stroke(); + ctx.fillRect(65, 15, 20, 20); + @assert pixel 25,14 == 0,255,0,255; + @assert pixel 25,15 == 0,255,0,255; + @assert pixel 25,16 == 0,255,0,255; + @assert pixel 25,34 == 0,255,0,255; + @assert pixel 25,35 == 0,255,0,255; + @assert pixel 25,36 == 0,255,0,255; + @assert pixel 75,14 == 0,255,0,255; + @assert pixel 75,15 == 0,255,0,255; + @assert pixel 75,16 == 0,255,0,255; + @assert pixel 75,34 == 0,255,0,255; + @assert pixel 75,35 == 0,255,0,255; + @assert pixel 75,36 == 0,255,0,255; + +- name: 2d.line.cap.round + desc: lineCap 'round' is rendered correctly + testing: + - 2d.lineCap.round + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var tol = 1; // tolerance to avoid antialiasing artifacts + ctx.lineCap = 'round'; + ctx.lineWidth = 20; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(35-tol, 15); + ctx.arc(25, 15, 10-tol, 0, Math.PI, true); + ctx.arc(25, 35, 10-tol, Math.PI, 0, true); + ctx.fill(); + ctx.beginPath(); + ctx.moveTo(25, 15); + ctx.lineTo(25, 35); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(75, 15); + ctx.lineTo(75, 35); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(85+tol, 15); + ctx.arc(75, 15, 10+tol, 0, Math.PI, true); + ctx.arc(75, 35, 10+tol, Math.PI, 0, true); + ctx.fill(); + @assert pixel 17,6 == 0,255,0,255; + @assert pixel 25,6 == 0,255,0,255; + @assert pixel 32,6 == 0,255,0,255; + @assert pixel 17,43 == 0,255,0,255; + @assert pixel 25,43 == 0,255,0,255; + @assert pixel 32,43 == 0,255,0,255; + @assert pixel 67,6 == 0,255,0,255; + @assert pixel 75,6 == 0,255,0,255; + @assert pixel 82,6 == 0,255,0,255; + @assert pixel 67,43 == 0,255,0,255; + @assert pixel 75,43 == 0,255,0,255; + @assert pixel 82,43 == 0,255,0,255; + +- name: 2d.line.cap.square + desc: lineCap 'square' is rendered correctly + testing: + - 2d.lineCap.square + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineCap = 'square'; + ctx.lineWidth = 20; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(15, 5, 20, 40); + ctx.beginPath(); + ctx.moveTo(25, 15); + ctx.lineTo(25, 35); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(75, 15); + ctx.lineTo(75, 35); + ctx.stroke(); + ctx.fillRect(65, 5, 20, 40); + @assert pixel 25,4 == 0,255,0,255; + @assert pixel 25,5 == 0,255,0,255; + @assert pixel 25,6 == 0,255,0,255; + @assert pixel 25,44 == 0,255,0,255; + @assert pixel 25,45 == 0,255,0,255; + @assert pixel 25,46 == 0,255,0,255; + @assert pixel 75,4 == 0,255,0,255; + @assert pixel 75,5 == 0,255,0,255; + @assert pixel 75,6 == 0,255,0,255; + @assert pixel 75,44 == 0,255,0,255; + @assert pixel 75,45 == 0,255,0,255; + @assert pixel 75,46 == 0,255,0,255; + +- name: 2d.line.cap.open + desc: Line caps are drawn at the corners of an unclosed rectangle + testing: + - 2d.lineCap.end + code: | + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineJoin = 'bevel'; + ctx.lineCap = 'square'; + ctx.lineWidth = 400; + ctx.beginPath(); + ctx.moveTo(200, 200); + ctx.lineTo(200, 1000); + ctx.lineTo(1000, 1000); + ctx.lineTo(1000, 200); + ctx.lineTo(200, 200); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.cap.closed + desc: Line caps are not drawn at the corners of an unclosed rectangle + testing: + - 2d.lineCap.end + code: | + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineJoin = 'bevel'; + ctx.lineCap = 'square'; + ctx.lineWidth = 400; + ctx.beginPath(); + ctx.moveTo(200, 200); + ctx.lineTo(200, 1000); + ctx.lineTo(1000, 1000); + ctx.lineTo(1000, 200); + ctx.closePath(); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.cap.valid + desc: Setting lineCap to valid values works + testing: + - 2d.lineCap.set + - 2d.lineCap.get + code: | + ctx.lineCap = 'butt' + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'round'; + @assert ctx.lineCap === 'round'; + ctx.lineCap = 'square'; + @assert ctx.lineCap === 'square'; + +- name: 2d.line.cap.invalid + desc: Setting lineCap to invalid values is ignored + testing: + - 2d.lineCap.invalid + code: | + ctx.lineCap = 'butt' + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'butt'; + ctx.lineCap = 'invalid'; + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'butt'; + ctx.lineCap = 'ROUND'; + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'butt'; + ctx.lineCap = 'round\0'; + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'butt'; + ctx.lineCap = 'round '; + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'butt'; + ctx.lineCap = ""; + @assert ctx.lineCap === 'butt'; + ctx.lineCap = 'butt'; + ctx.lineCap = 'bevel'; + @assert ctx.lineCap === 'butt'; + +- name: 2d.line.join.bevel + desc: lineJoin 'bevel' is rendered correctly + testing: + - 2d.lineJoin.common + - 2d.lineJoin.bevel + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var tol = 1; // tolerance to avoid antialiasing artifacts + ctx.lineJoin = 'bevel'; + ctx.lineWidth = 20; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(10, 10, 20, 20); + ctx.fillRect(20, 20, 20, 20); + ctx.beginPath(); + ctx.moveTo(30, 20); + ctx.lineTo(40-tol, 20); + ctx.lineTo(30, 10+tol); + ctx.fill(); + ctx.beginPath(); + ctx.moveTo(10, 20); + ctx.lineTo(30, 20); + ctx.lineTo(30, 40); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(60, 20); + ctx.lineTo(80, 20); + ctx.lineTo(80, 40); + ctx.stroke(); + ctx.fillRect(60, 10, 20, 20); + ctx.fillRect(70, 20, 20, 20); + ctx.beginPath(); + ctx.moveTo(80, 20); + ctx.lineTo(90+tol, 20); + ctx.lineTo(80, 10-tol); + ctx.fill(); + @assert pixel 34,16 == 0,255,0,255; + @assert pixel 34,15 == 0,255,0,255; + @assert pixel 35,15 == 0,255,0,255; + @assert pixel 36,15 == 0,255,0,255; + @assert pixel 36,14 == 0,255,0,255; + @assert pixel 84,16 == 0,255,0,255; + @assert pixel 84,15 == 0,255,0,255; + @assert pixel 85,15 == 0,255,0,255; + @assert pixel 86,15 == 0,255,0,255; + @assert pixel 86,14 == 0,255,0,255; + +- name: 2d.line.join.round + desc: lineJoin 'round' is rendered correctly + testing: + - 2d.lineJoin.round + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + var tol = 1; // tolerance to avoid antialiasing artifacts + ctx.lineJoin = 'round'; + ctx.lineWidth = 20; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(10, 10, 20, 20); + ctx.fillRect(20, 20, 20, 20); + ctx.beginPath(); + ctx.moveTo(30, 20); + ctx.arc(30, 20, 10-tol, 0, 2*Math.PI, true); + ctx.fill(); + ctx.beginPath(); + ctx.moveTo(10, 20); + ctx.lineTo(30, 20); + ctx.lineTo(30, 40); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(60, 20); + ctx.lineTo(80, 20); + ctx.lineTo(80, 40); + ctx.stroke(); + ctx.fillRect(60, 10, 20, 20); + ctx.fillRect(70, 20, 20, 20); + ctx.beginPath(); + ctx.moveTo(80, 20); + ctx.arc(80, 20, 10+tol, 0, 2*Math.PI, true); + ctx.fill(); + @assert pixel 36,14 == 0,255,0,255; + @assert pixel 36,13 == 0,255,0,255; + @assert pixel 37,13 == 0,255,0,255; + @assert pixel 38,13 == 0,255,0,255; + @assert pixel 38,12 == 0,255,0,255; + @assert pixel 86,14 == 0,255,0,255; + @assert pixel 86,13 == 0,255,0,255; + @assert pixel 87,13 == 0,255,0,255; + @assert pixel 88,13 == 0,255,0,255; + @assert pixel 88,12 == 0,255,0,255; + +- name: 2d.line.join.miter + desc: lineJoin 'miter' is rendered correctly + testing: + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineJoin = 'miter'; + ctx.lineWidth = 20; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(10, 10, 30, 20); + ctx.fillRect(20, 10, 20, 30); + ctx.beginPath(); + ctx.moveTo(10, 20); + ctx.lineTo(30, 20); + ctx.lineTo(30, 40); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(60, 20); + ctx.lineTo(80, 20); + ctx.lineTo(80, 40); + ctx.stroke(); + ctx.fillRect(60, 10, 30, 20); + ctx.fillRect(70, 10, 20, 30); + @assert pixel 38,12 == 0,255,0,255; + @assert pixel 39,11 == 0,255,0,255; + @assert pixel 40,10 == 0,255,0,255; + @assert pixel 41,9 == 0,255,0,255; + @assert pixel 42,8 == 0,255,0,255; + @assert pixel 88,12 == 0,255,0,255; + @assert pixel 89,11 == 0,255,0,255; + @assert pixel 90,10 == 0,255,0,255; + @assert pixel 91,9 == 0,255,0,255; + @assert pixel 92,8 == 0,255,0,255; + +- name: 2d.line.join.open + desc: Line joins are not drawn at the corner of an unclosed rectangle + testing: + - 2d.lineJoin.joins + code: | + ctx.fillStyle = '#0f0'; + ctx.strokeStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineJoin = 'miter'; + ctx.lineWidth = 200; + ctx.beginPath(); + ctx.moveTo(100, 50); + ctx.lineTo(100, 1000); + ctx.lineTo(1000, 1000); + ctx.lineTo(1000, 50); + ctx.lineTo(100, 50); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.join.closed + desc: Line joins are drawn at the corner of a closed rectangle + testing: + - 2d.lineJoin.joinclosed + code: | + ctx.fillStyle = '#f00'; + ctx.strokeStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineJoin = 'miter'; + ctx.lineWidth = 200; + ctx.beginPath(); + ctx.moveTo(100, 50); + ctx.lineTo(100, 1000); + ctx.lineTo(1000, 1000); + ctx.lineTo(1000, 50); + ctx.closePath(); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.join.parallel + desc: Line joins are drawn at 180-degree joins + testing: + - 2d.lineJoin.joins + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 300; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(-100, 25); + ctx.lineTo(0, 25); + ctx.lineTo(-100, 25); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.join.valid + desc: Setting lineJoin to valid values works + testing: + - 2d.lineJoin.set + - 2d.lineJoin.get + code: | + ctx.lineJoin = 'bevel' + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'round'; + @assert ctx.lineJoin === 'round'; + ctx.lineJoin = 'miter'; + @assert ctx.lineJoin === 'miter'; + +- name: 2d.line.join.invalid + desc: Setting lineJoin to invalid values is ignored + testing: + - 2d.lineJoin.invalid + code: | + ctx.lineJoin = 'bevel' + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'bevel'; + ctx.lineJoin = 'invalid'; + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'bevel'; + ctx.lineJoin = 'ROUND'; + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'bevel'; + ctx.lineJoin = 'round\0'; + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'bevel'; + ctx.lineJoin = 'round '; + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'bevel'; + ctx.lineJoin = ""; + @assert ctx.lineJoin === 'bevel'; + ctx.lineJoin = 'bevel'; + ctx.lineJoin = 'butt'; + @assert ctx.lineJoin === 'bevel'; + +- name: 2d.line.miter.exceeded + desc: Miter joins are not drawn when the miter limit is exceeded + testing: + - 2d.lineJoin.miterLimit + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 400; + ctx.lineJoin = 'miter'; + ctx.strokeStyle = '#f00'; + ctx.miterLimit = 1.414; + ctx.beginPath(); + ctx.moveTo(200, 1000); + ctx.lineTo(200, 200); + ctx.lineTo(1000, 201); // slightly non-right-angle to avoid being a special case + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.miter.acute + desc: Miter joins are drawn correctly with acute angles + testing: + - 2d.lineJoin.miterLimit + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 200; + ctx.lineJoin = 'miter'; + ctx.strokeStyle = '#0f0'; + ctx.miterLimit = 2.614; + ctx.beginPath(); + ctx.moveTo(100, 1000); + ctx.lineTo(100, 100); + ctx.lineTo(1000, 1000); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.miterLimit = 2.613; + ctx.beginPath(); + ctx.moveTo(100, 1000); + ctx.lineTo(100, 100); + ctx.lineTo(1000, 1000); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.miter.obtuse + desc: Miter joins are drawn correctly with obtuse angles + testing: + - 2d.lineJoin.miterLimit + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 1600; + ctx.lineJoin = 'miter'; + ctx.strokeStyle = '#0f0'; + ctx.miterLimit = 1.083; + ctx.beginPath(); + ctx.moveTo(800, 10000); + ctx.lineTo(800, 300); + ctx.lineTo(10000, -8900); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.miterLimit = 1.082; + ctx.beginPath(); + ctx.moveTo(800, 10000); + ctx.lineTo(800, 300); + ctx.lineTo(10000, -8900); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.miter.rightangle + desc: Miter joins are not drawn when the miter limit is exceeded, on exact right angles + testing: + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 400; + ctx.lineJoin = 'miter'; + ctx.strokeStyle = '#f00'; + ctx.miterLimit = 1.414; + ctx.beginPath(); + ctx.moveTo(200, 1000); + ctx.lineTo(200, 200); + ctx.lineTo(1000, 200); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.miter.lineedge + desc: Miter joins are not drawn when the miter limit is exceeded at the corners of a zero-height rectangle + testing: + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 200; + ctx.lineJoin = 'miter'; + ctx.strokeStyle = '#f00'; + ctx.miterLimit = 1.414; + ctx.beginPath(); + ctx.strokeRect(100, 25, 200, 0); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.miter.within + desc: Miter joins are drawn when the miter limit is not quite exceeded + testing: + - 2d.lineJoin.miter + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 400; + ctx.lineJoin = 'miter'; + ctx.strokeStyle = '#0f0'; + ctx.miterLimit = 1.416; + ctx.beginPath(); + ctx.moveTo(200, 1000); + ctx.lineTo(200, 200); + ctx.lineTo(1000, 201); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.miter.valid + desc: Setting miterLimit to valid values works + testing: + - 2d.miterLimit.set + - 2d.miterLimit.get + code: | + ctx.miterLimit = 1.5; + @assert ctx.miterLimit === 1.5; + ctx.miterLimit = "1e1"; + @assert ctx.miterLimit === 10; + ctx.miterLimit = 1/1024; + @assert ctx.miterLimit === 1/1024; + ctx.miterLimit = 1000; + @assert ctx.miterLimit === 1000; + +- name: 2d.line.miter.invalid + desc: Setting miterLimit to invalid values is ignored + testing: + - 2d.miterLimit.invalid + code: | + ctx.miterLimit = 1.5; + @assert ctx.miterLimit === 1.5; + ctx.miterLimit = 1.5; + ctx.miterLimit = 0; + @assert ctx.miterLimit === 1.5; + ctx.miterLimit = 1.5; + ctx.miterLimit = -1; + @assert ctx.miterLimit === 1.5; + ctx.miterLimit = 1.5; + ctx.miterLimit = Infinity; + @assert ctx.miterLimit === 1.5; + ctx.miterLimit = 1.5; + ctx.miterLimit = -Infinity; + @assert ctx.miterLimit === 1.5; + ctx.miterLimit = 1.5; + ctx.miterLimit = NaN; + @assert ctx.miterLimit === 1.5; + +- name: 2d.line.cross + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 200; + ctx.lineJoin = 'bevel'; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(110, 50); + ctx.lineTo(110, 60); + ctx.lineTo(100, 60); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + +- name: 2d.line.union + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 24); + ctx.lineTo(100, 25); + ctx.lineTo(0, 26); + ctx.closePath(); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 25,1 == 0,255,0,255; + @assert pixel 48,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 25,1 == 0,255,0,255; + @assert pixel 48,48 == 0,255,0,255; + +- name: 2d.path.initial + testing: + - 2d.path.initial + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.closePath(); + ctx.fillStyle = '#f00'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.beginPath + testing: + - 2d.path.beginPath + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.rect(0, 0, 100, 50); + ctx.beginPath(); + ctx.fillStyle = '#f00'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.moveTo.basic + testing: + - 2d.path.moveTo + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.rect(0, 0, 10, 50); + ctx.moveTo(100, 0); + ctx.lineTo(10, 0); + ctx.lineTo(10, 50); + ctx.lineTo(100, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 90,25 == 0,255,0,255; + +- name: 2d.path.moveTo.newsubpath + testing: + - 2d.path.moveTo + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.moveTo(100, 0); + ctx.moveTo(100, 50); + ctx.moveTo(0, 50); + ctx.fillStyle = '#f00'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.moveTo.multiple + testing: + - 2d.path.moveTo + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.moveTo(0, 25); + ctx.moveTo(100, 25); + ctx.moveTo(0, 25); + ctx.lineTo(100, 25); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.moveTo.nonfinite + desc: moveTo() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.moveTo(<0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.closePath.empty + testing: + - 2d.path.closePath.empty + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.closePath(); + ctx.fillStyle = '#f00'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.closePath.newline + testing: + - 2d.path.closePath.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.moveTo(-100, 25); + ctx.lineTo(-100, -100); + ctx.lineTo(200, -100); + ctx.lineTo(200, 25); + ctx.closePath(); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.closePath.nextpoint + testing: + - 2d.path.closePath.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.moveTo(-100, 25); + ctx.lineTo(-100, -1000); + ctx.closePath(); + ctx.lineTo(1000, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.lineTo.ensuresubpath.1 + desc: If there is no subpath, the point is added and nothing is drawn + testing: + - 2d.path.lineTo.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.lineTo(100, 50); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.lineTo.ensuresubpath.2 + desc: If there is no subpath, the point is added and used for subsequent drawing + testing: + - 2d.path.lineTo.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.lineTo(0, 25); + ctx.lineTo(100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.lineTo.basic + testing: + - 2d.path.lineTo.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.lineTo(100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.lineTo.nextpoint + testing: + - 2d.path.lineTo.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.moveTo(-100, -100); + ctx.lineTo(0, 25); + ctx.lineTo(100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.lineTo.nonfinite + desc: lineTo() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.lineTo(<0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,45 == 0,255,0,255; + +- name: 2d.path.lineTo.nonfinite.details + desc: lineTo() with Infinity/NaN for first arg still converts the second arg + testing: + - 2d.nonfinite + code: | + for (var arg1 of [Infinity, -Infinity, NaN]) { + var converted = false; + ctx.lineTo(arg1, { valueOf: function() { converted = true; return 0; } }); + @assert converted; + } + +- name: 2d.path.quadraticCurveTo.ensuresubpath.1 + desc: If there is no subpath, the first control point is added (and nothing is drawn up to it) + testing: + - 2d.path.quadratic.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.quadraticCurveTo(100, 50, 200, 50); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 95,45 == 0,255,0,255; @moz-todo + +- name: 2d.path.quadraticCurveTo.ensuresubpath.2 + desc: If there is no subpath, the first control point is added + testing: + - 2d.path.quadratic.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.quadraticCurveTo(0, 25, 100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 5,45 == 0,255,0,255; @moz-todo + +- name: 2d.path.quadraticCurveTo.basic + testing: + - 2d.path.quadratic.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.quadraticCurveTo(100, 25, 100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.quadraticCurveTo.shape + testing: + - 2d.path.quadratic.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 55; + ctx.beginPath(); + ctx.moveTo(-1000, 1050); + ctx.quadraticCurveTo(0, -1000, 1200, 1050); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.quadraticCurveTo.scaled + testing: + - 2d.path.quadratic.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(1000, 1000); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 0.055; + ctx.beginPath(); + ctx.moveTo(-1, 1.05); + ctx.quadraticCurveTo(0, -1, 1.2, 1.05); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.quadraticCurveTo.nonfinite + desc: quadraticCurveTo() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.quadraticCurveTo(<0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,45 == 0,255,0,255; + +- name: 2d.path.bezierCurveTo.ensuresubpath.1 + desc: If there is no subpath, the first control point is added (and nothing is drawn up to it) + testing: + - 2d.path.bezier.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.bezierCurveTo(100, 50, 200, 50, 200, 50); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 95,45 == 0,255,0,255; + +- name: 2d.path.bezierCurveTo.ensuresubpath.2 + desc: If there is no subpath, the first control point is added + testing: + - 2d.path.bezier.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.bezierCurveTo(0, 25, 100, 25, 100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 5,45 == 0,255,0,255; + +- name: 2d.path.bezierCurveTo.basic + testing: + - 2d.path.bezier.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.bezierCurveTo(100, 25, 100, 25, 100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.bezierCurveTo.shape + testing: + - 2d.path.bezier.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 55; + ctx.beginPath(); + ctx.moveTo(-2000, 3100); + ctx.bezierCurveTo(-2000, -1000, 2100, -1000, 2100, 3100); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.bezierCurveTo.scaled + testing: + - 2d.path.bezier.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(1000, 1000); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 0.055; + ctx.beginPath(); + ctx.moveTo(-2, 3.1); + ctx.bezierCurveTo(-2, -1, 2.1, -1, 2.1, 3.1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.bezierCurveTo.nonfinite + desc: bezierCurveTo() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.bezierCurveTo(<0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,45 == 0,255,0,255; + +- name: 2d.path.arcTo.ensuresubpath.1 + desc: If there is no subpath, the first control point is added (and nothing is drawn up to it) + testing: + - 2d.path.arcTo.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.arcTo(100, 50, 200, 50, 0.1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.ensuresubpath.2 + desc: If there is no subpath, the first control point is added + testing: + - 2d.path.arcTo.empty + - 2d.path.ensure + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.arcTo(0, 25, 50, 250, 0.1); // adds (x1,y1), draws nothing + ctx.lineTo(100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.coincide.1 + desc: arcTo() has no effect if P0 = P1 + testing: + - 2d.path.arcTo.coincide.01 + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(0, 25, 50, 1000, 1); + ctx.lineTo(100, 25); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.arcTo(50, 25, 100, 25, 1); + ctx.stroke(); + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + +- name: 2d.path.arcTo.coincide.2 + desc: arcTo() draws a straight line to P1 if P1 = P2 + testing: + - 2d.path.arcTo.coincide.12 + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(100, 25, 100, 25, 1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.collinear.1 + desc: arcTo() with all points on a line, and P1 between P0/P2, draws a straight line to P1 + testing: + - 2d.path.arcTo.collinear + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(100, 25, 200, 25, 1); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(-100, 25); + ctx.arcTo(0, 25, 100, 25, 1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.collinear.2 + desc: arcTo() with all points on a line, and P2 between P0/P1, draws a straight line to P1 + testing: + - 2d.path.arcTo.collinear + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(100, 25, 10, 25, 1); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 25); + ctx.arcTo(200, 25, 110, 25, 1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.collinear.3 + desc: arcTo() with all points on a line, and P0 between P1/P2, draws a straight line to P1 + testing: + - 2d.path.arcTo.collinear + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(100, 25, -100, 25, 1); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 25); + ctx.arcTo(200, 25, 0, 25, 1); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(-100, 25); + ctx.arcTo(0, 25, -200, 25, 1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.shape.curve1 + desc: arcTo() curves in the right kind of shape + testing: + - 2d.path.arcTo.shape + code: | + var tol = 1.5; // tolerance to avoid antialiasing artifacts + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 10; + ctx.beginPath(); + ctx.moveTo(10, 25); + ctx.arcTo(75, 25, 75, 60, 20); + ctx.stroke(); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.rect(10, 20, 45, 10); + ctx.moveTo(80, 45); + ctx.arc(55, 45, 25+tol, 0, -Math.PI/2, true); + ctx.arc(55, 45, 15-tol, -Math.PI/2, 0, false); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 55,19 == 0,255,0,255; + @assert pixel 55,20 == 0,255,0,255; + @assert pixel 55,21 == 0,255,0,255; + @assert pixel 64,22 == 0,255,0,255; + @assert pixel 65,21 == 0,255,0,255; + @assert pixel 72,28 == 0,255,0,255; + @assert pixel 73,27 == 0,255,0,255; + @assert pixel 78,36 == 0,255,0,255; + @assert pixel 79,35 == 0,255,0,255; + @assert pixel 80,44 == 0,255,0,255; + @assert pixel 80,45 == 0,255,0,255; + @assert pixel 80,46 == 0,255,0,255; + @assert pixel 65,45 == 0,255,0,255; + +- name: 2d.path.arcTo.shape.curve2 + desc: arcTo() curves in the right kind of shape + testing: + - 2d.path.arcTo.shape + code: | + var tol = 1.5; // tolerance to avoid antialiasing artifacts + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.rect(10, 20, 45, 10); + ctx.moveTo(80, 45); + ctx.arc(55, 45, 25-tol, 0, -Math.PI/2, true); + ctx.arc(55, 45, 15+tol, -Math.PI/2, 0, false); + ctx.fill(); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 10; + ctx.beginPath(); + ctx.moveTo(10, 25); + ctx.arcTo(75, 25, 75, 60, 20); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 55,19 == 0,255,0,255; + @assert pixel 55,20 == 0,255,0,255; + @assert pixel 55,21 == 0,255,0,255; + @assert pixel 64,22 == 0,255,0,255; + @assert pixel 65,21 == 0,255,0,255; + @assert pixel 72,28 == 0,255,0,255; + @assert pixel 73,27 == 0,255,0,255; + @assert pixel 78,36 == 0,255,0,255; + @assert pixel 79,35 == 0,255,0,255; + @assert pixel 80,44 == 0,255,0,255; + @assert pixel 80,45 == 0,255,0,255; + @assert pixel 80,46 == 0,255,0,255; + +- name: 2d.path.arcTo.shape.start + desc: arcTo() draws a straight line from P0 to P1 + testing: + - 2d.path.arcTo.shape + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(200, 25, 200, 50, 10); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arcTo.shape.end + desc: arcTo() does not draw anything from P1 to P2 + testing: + - 2d.path.arcTo.shape + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.beginPath(); + ctx.moveTo(-100, -100); + ctx.arcTo(-100, 25, 200, 25, 10); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arcTo.negative + desc: arcTo() with negative radius throws an exception + testing: + - 2d.path.arcTo.negative + code: | + @assert throws INDEX_SIZE_ERR ctx.arcTo(0, 0, 0, 0, -1); + +- name: 2d.path.arcTo.zero.1 + desc: arcTo() with zero radius draws a straight line from P0 to P1 + testing: + - 2d.path.arcTo.zeroradius + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(100, 25, 100, 100, 0); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(0, -25); + ctx.arcTo(50, -25, 50, 50, 0); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.zero.2 + desc: arcTo() with zero radius draws a straight line from P0 to P1, even when all points are collinear + testing: + - 2d.path.arcTo.zeroradius + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arcTo(100, 25, -100, 25, 0); + ctx.stroke(); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 25); + ctx.arcTo(200, 25, 50, 25, 0); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arcTo.transformation + desc: arcTo joins up to the last subpath point correctly + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 50); + ctx.translate(100, 0); + ctx.arcTo(50, 50, 50, 0, 50); + ctx.lineTo(-100, 0); + ctx.fill(); + @assert pixel 0,0 == 0,255,0,255; + @assert pixel 50,0 == 0,255,0,255; + @assert pixel 99,0 == 0,255,0,255; + @assert pixel 0,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 99,25 == 0,255,0,255; + @assert pixel 0,49 == 0,255,0,255; + @assert pixel 50,49 == 0,255,0,255; + @assert pixel 99,49 == 0,255,0,255; + +- name: 2d.path.arcTo.scale + desc: arcTo scales the curve, not just the control points + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 50); + ctx.translate(100, 0); + ctx.scale(0.1, 1); + ctx.arcTo(50, 50, 50, 0, 50); + ctx.lineTo(-1000, 0); + ctx.fill(); + @assert pixel 0,0 == 0,255,0,255; + @assert pixel 50,0 == 0,255,0,255; + @assert pixel 99,0 == 0,255,0,255; + @assert pixel 0,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 99,25 == 0,255,0,255; + @assert pixel 0,49 == 0,255,0,255; + @assert pixel 50,49 == 0,255,0,255; + @assert pixel 99,49 == 0,255,0,255; + +- name: 2d.path.arcTo.nonfinite + desc: arcTo() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.arcTo(<0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,45 == 0,255,0,255; + + +- name: 2d.path.arc.empty + desc: arc() with an empty path does not draw a straight line to the start point + testing: + - 2d.path.arc.nonempty + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.arc(200, 25, 5, 0, 2*Math.PI, true); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.nonempty + desc: arc() with a non-empty path does draw a straight line to the start point + testing: + - 2d.path.arc.nonempty + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arc(200, 25, 5, 0, 2*Math.PI, true); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.end + desc: arc() adds the end point of the arc to the subpath + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(-100, 0); + ctx.arc(-100, 0, 25, -Math.PI/2, Math.PI/2, true); + ctx.lineTo(100, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.default + desc: arc() with missing last argument defaults to clockwise + testing: + - 2d.path.arc.omitted + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 0); + ctx.arc(100, 0, 150, -Math.PI, Math.PI/2); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.angle.1 + desc: arc() draws pi/2 .. -pi anticlockwise correctly + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 0); + ctx.arc(100, 0, 150, Math.PI/2, -Math.PI, true); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.angle.2 + desc: arc() draws -3pi/2 .. -pi anticlockwise correctly + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 0); + ctx.arc(100, 0, 150, -3*Math.PI/2, -Math.PI, true); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.angle.3 + desc: arc() wraps angles mod 2pi when anticlockwise and end > start+2pi + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 0); + ctx.arc(100, 0, 150, (512+1/2)*Math.PI, (1024-1)*Math.PI, true); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.angle.4 + desc: arc() draws a full circle when clockwise and end > start+2pi + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.arc(50, 25, 60, (512+1/2)*Math.PI, (1024-1)*Math.PI, false); + ctx.fill(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.angle.5 + desc: arc() wraps angles mod 2pi when clockwise and start > end+2pi + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(100, 0); + ctx.arc(100, 0, 150, (1024-1)*Math.PI, (512+1/2)*Math.PI, false); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.angle.6 + desc: arc() draws a full circle when anticlockwise and start > end+2pi + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.arc(50, 25, 60, (1024-1)*Math.PI, (512+1/2)*Math.PI, true); + ctx.fill(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.zero.1 + desc: arc() draws nothing when startAngle = endAngle and anticlockwise + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.arc(50, 25, 50, 0, 0, true); + ctx.stroke(); + @assert pixel 50,20 == 0,255,0,255; + +- name: 2d.path.arc.zero.2 + desc: arc() draws nothing when startAngle = endAngle and clockwise + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.arc(50, 25, 50, 0, 0, false); + ctx.stroke(); + @assert pixel 50,20 == 0,255,0,255; + +- name: 2d.path.arc.twopie.1 + desc: arc() draws nothing when end = start + 2pi-e and anticlockwise + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.arc(50, 25, 50, 0, 2*Math.PI - 1e-4, true); + ctx.stroke(); + @assert pixel 50,20 == 0,255,0,255; + +- name: 2d.path.arc.twopie.2 + desc: arc() draws a full circle when end = start + 2pi-e and clockwise + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.arc(50, 25, 50, 0, 2*Math.PI - 1e-4, false); + ctx.stroke(); + @assert pixel 50,20 == 0,255,0,255; + +- name: 2d.path.arc.twopie.3 + desc: arc() draws a full circle when end = start + 2pi+e and anticlockwise + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.arc(50, 25, 50, 0, 2*Math.PI + 1e-4, true); + ctx.stroke(); + @assert pixel 50,20 == 0,255,0,255; + +- name: 2d.path.arc.twopie.4 + desc: arc() draws nothing when end = start + 2pi+e and clockwise + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.arc(50, 25, 50, 0, 2*Math.PI + 1e-4, false); + ctx.stroke(); + @assert pixel 50,20 == 0,255,0,255; + +- name: 2d.path.arc.shape.1 + desc: arc() from 0 to pi does not draw anything in the wrong half + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.arc(50, 50, 50, 0, Math.PI, false); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 20,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.shape.2 + desc: arc() from 0 to pi draws stuff in the right half + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 100; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.arc(50, 50, 50, 0, Math.PI, true); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 20,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.shape.3 + desc: arc() from 0 to -pi/2 does not draw anything in the wrong quadrant + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 100; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.arc(0, 50, 50, 0, -Math.PI/2, false); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; @moz-todo + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.shape.4 + desc: arc() from 0 to -pi/2 draws stuff in the right quadrant + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 150; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.arc(-50, 50, 100, 0, -Math.PI/2, true); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.shape.5 + desc: arc() from 0 to 5pi does not draw crazy things + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 200; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.arc(300, 0, 100, 0, 5*Math.PI, false); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.selfintersect.1 + desc: arc() with lineWidth > 2*radius is drawn sensibly + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 200; + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.arc(100, 50, 25, 0, -Math.PI/2, true); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(0, 0, 25, 0, -Math.PI/2, true); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; @moz-todo + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.selfintersect.2 + desc: arc() with lineWidth > 2*radius is drawn sensibly + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 180; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.arc(-50, 50, 25, 0, -Math.PI/2, true); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(100, 0, 25, 0, -Math.PI/2, true); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,10 == 0,255,0,255; + @assert pixel 97,1 == 0,255,0,255; + @assert pixel 97,2 == 0,255,0,255; + @assert pixel 97,3 == 0,255,0,255; + @assert pixel 2,48 == 0,255,0,255; + +- name: 2d.path.arc.negative + desc: arc() with negative radius throws INDEX_SIZE_ERR + testing: + - 2d.path.arc.negative + code: | + @assert throws INDEX_SIZE_ERR ctx.arc(0, 0, -1, 0, 0, true); + +- name: 2d.path.arc.zeroradius + desc: arc() with zero radius draws a line to the start point + testing: + - 2d.path.arc.zero + code: | + ctx.fillStyle = '#f00' + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.strokeStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 25); + ctx.arc(200, 25, 0, 0, Math.PI, true); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.arc.scale.1 + desc: Non-uniformly scaled arcs are the right shape + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(2, 0.5); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.arc(25, 50, 56, 0, 2*Math.PI, false); + ctx.fill(); + ctx.fillStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(-25, 50); + ctx.arc(-25, 50, 24, 0, 2*Math.PI, false); + ctx.moveTo(75, 50); + ctx.arc(75, 50, 24, 0, 2*Math.PI, false); + ctx.moveTo(25, -25); + ctx.arc(25, -25, 24, 0, 2*Math.PI, false); + ctx.moveTo(25, 125); + ctx.arc(25, 125, 24, 0, 2*Math.PI, false); + ctx.fill(); + @assert pixel 0,0 == 0,255,0,255; + @assert pixel 50,0 == 0,255,0,255; + @assert pixel 99,0 == 0,255,0,255; + @assert pixel 0,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 99,25 == 0,255,0,255; + @assert pixel 0,49 == 0,255,0,255; + @assert pixel 50,49 == 0,255,0,255; + @assert pixel 99,49 == 0,255,0,255; + +- name: 2d.path.arc.scale.2 + desc: Highly scaled arcs are the right shape + testing: + - 2d.path.arc.draw + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.scale(100, 100); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 1.2; + ctx.beginPath(); + ctx.arc(0, 0, 0.6, 0, Math.PI/2, false); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 50,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 98,25 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 50,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.arc.nonfinite + desc: arc() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.arc(<0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <2*Math.PI Infinity -Infinity NaN>, <true>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,45 == 0,255,0,255; + + +- name: 2d.path.rect.basic + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.rect(0, 0, 100, 50); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.newsubpath + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.moveTo(-100, 25); + ctx.lineTo(-50, 25); + ctx.rect(200, 25, 1, 1); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.closed + testing: + - 2d.path.rect.closed + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 200; + ctx.lineJoin = 'miter'; + ctx.rect(100, 50, 100, 100); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.end.1 + testing: + - 2d.path.rect.newsubpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 100; + ctx.rect(200, 100, 400, 1000); + ctx.lineTo(-2000, -1000); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.end.2 + testing: + - 2d.path.rect.newsubpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 450; + ctx.lineCap = 'round'; + ctx.lineJoin = 'bevel'; + ctx.rect(150, 150, 2000, 2000); + ctx.lineTo(160, 160); + ctx.stroke(); + @assert pixel 1,1 == 0,255,0,255; + @assert pixel 98,1 == 0,255,0,255; + @assert pixel 1,48 == 0,255,0,255; + @assert pixel 98,48 == 0,255,0,255; + +- name: 2d.path.rect.zero.1 + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.rect(0, 50, 100, 0); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.zero.2 + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.rect(50, -100, 0, 250); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.zero.3 + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.beginPath(); + ctx.rect(50, 25, 0, 0); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.zero.4 + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 50; + ctx.rect(100, 25, 0, 0); + ctx.lineTo(0, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.zero.5 + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.moveTo(0, 0); + ctx.rect(100, 25, 0, 0); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.rect.zero.6 + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineJoin = 'miter'; + ctx.miterLimit = 1.5; + ctx.lineWidth = 200; + ctx.beginPath(); + ctx.rect(100, 25, 1000, 0); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.rect.negative + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.fillStyle = '#0f0'; + ctx.rect(0, 0, 50, 25); + ctx.rect(100, 0, -50, 25); + ctx.rect(0, 50, 50, -25); + ctx.rect(100, 50, -50, -25); + ctx.fill(); + @assert pixel 25,12 == 0,255,0,255; + @assert pixel 75,12 == 0,255,0,255; + @assert pixel 25,37 == 0,255,0,255; + @assert pixel 75,37 == 0,255,0,255; + +- name: 2d.path.rect.winding + testing: + - 2d.path.rect.subpath + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.fillStyle = '#f00'; + ctx.rect(0, 0, 50, 50); + ctx.rect(100, 50, -50, -50); + ctx.rect(0, 25, 100, -25); + ctx.rect(100, 25, -100, 25); + ctx.fill(); + @assert pixel 25,12 == 0,255,0,255; + @assert pixel 75,12 == 0,255,0,255; + @assert pixel 25,37 == 0,255,0,255; + @assert pixel 75,37 == 0,255,0,255; + +- name: 2d.path.rect.selfintersect + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 90; + ctx.beginPath(); + ctx.rect(45, 20, 10, 10); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.rect.nonfinite + desc: rect() with Infinity/NaN is ignored + testing: + - 2d.nonfinite + code: | + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + @nonfinite ctx.rect(<0 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <1 Infinity -Infinity NaN>, <1 Infinity -Infinity NaN>); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 90,45 == 0,255,0,255; + +- name: 2d.path.fill.overlap + testing: + - 2d.path.fill.basic + code: | + ctx.fillStyle = '#000'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.rect(0, 0, 100, 50); + ctx.closePath(); + ctx.rect(10, 10, 80, 30); + ctx.fill(); + @assert pixel 50,25 ==~ 0,127,0,255 +/- 1; + +- name: 2d.path.fill.winding.add + testing: + - 2d.path.fill.basic + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.moveTo(-10, -10); + ctx.lineTo(110, -10); + ctx.lineTo(110, 60); + ctx.lineTo(-10, 60); + ctx.lineTo(-10, -10); + ctx.lineTo(0, 0); + ctx.lineTo(100, 0); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.fill.winding.subtract.1 + testing: + - 2d.path.fill.basic + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.moveTo(-10, -10); + ctx.lineTo(110, -10); + ctx.lineTo(110, 60); + ctx.lineTo(-10, 60); + ctx.lineTo(-10, -10); + ctx.lineTo(0, 0); + ctx.lineTo(0, 50); + ctx.lineTo(100, 50); + ctx.lineTo(100, 0); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.fill.winding.subtract.2 + testing: + - 2d.path.fill.basic + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.moveTo(-10, -10); + ctx.lineTo(110, -10); + ctx.lineTo(110, 60); + ctx.lineTo(-10, 60); + ctx.moveTo(0, 0); + ctx.lineTo(0, 50); + ctx.lineTo(100, 50); + ctx.lineTo(100, 0); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.fill.winding.subtract.3 + testing: + - 2d.path.fill.basic + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.moveTo(-10, -10); + ctx.lineTo(110, -10); + ctx.lineTo(110, 60); + ctx.lineTo(-10, 60); + ctx.lineTo(-10, -10); + ctx.lineTo(-20, -20); + ctx.lineTo(120, -20); + ctx.lineTo(120, 70); + ctx.lineTo(-20, 70); + ctx.lineTo(-20, -20); + ctx.lineTo(0, 0); + ctx.lineTo(0, 50); + ctx.lineTo(100, 50); + ctx.lineTo(100, 0); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.fill.closed.basic + testing: + - 2d.path.fill.closed + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + ctx.lineTo(100, 50); + ctx.lineTo(0, 50); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.fill.closed.unaffected + testing: + - 2d.path.fill.closed + code: | + ctx.fillStyle = '#00f'; + ctx.fillRect(0, 0, 100, 50); + ctx.moveTo(0, 0); + ctx.lineTo(100, 0); + ctx.lineTo(100, 50); + ctx.fillStyle = '#f00'; + ctx.fill(); + ctx.lineTo(0, 50); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 90,10 == 0,255,0,255; + @assert pixel 10,40 == 0,255,0,255; + +- name: 2d.path.stroke.overlap + desc: Stroked subpaths are combined before being drawn + testing: + - 2d.path.stroke.basic + code: | + ctx.fillStyle = '#000'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = 'rgba(0, 255, 0, 0.5)'; + ctx.lineWidth = 50; + ctx.moveTo(0, 20); + ctx.lineTo(100, 20); + ctx.moveTo(0, 30); + ctx.lineTo(100, 30); + ctx.stroke(); + @assert pixel 50,25 ==~ 0,127,0,255 +/- 1; + +- name: 2d.path.stroke.union + desc: Strokes in opposite directions are unioned, not subtracted + testing: + - 2d.path.stroke.basic + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#0f0'; + ctx.lineWidth = 40; + ctx.moveTo(0, 10); + ctx.lineTo(100, 10); + ctx.moveTo(100, 40); + ctx.lineTo(0, 40); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.stroke.unaffected + desc: Stroking does not start a new path or subpath + testing: + - 2d.path.stroke.basic + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.lineWidth = 50; + ctx.moveTo(-100, 25); + ctx.lineTo(-100, -100); + ctx.lineTo(200, -100); + ctx.lineTo(200, 25); + ctx.strokeStyle = '#f00'; + ctx.stroke(); + ctx.closePath(); + ctx.strokeStyle = '#0f0'; + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.stroke.scale1 + desc: Stroke line widths are scaled by the current transformation matrix + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(25, 12.5, 50, 25); + ctx.save(); + ctx.scale(50, 25); + ctx.strokeStyle = '#0f0'; + ctx.stroke(); + ctx.restore(); + ctx.beginPath(); + ctx.rect(-25, -12.5, 150, 75); + ctx.save(); + ctx.scale(50, 25); + ctx.strokeStyle = '#f00'; + ctx.stroke(); + ctx.restore(); + @assert pixel 0,0 == 0,255,0,255; + @assert pixel 50,0 == 0,255,0,255; + @assert pixel 99,0 == 0,255,0,255; + @assert pixel 0,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 99,25 == 0,255,0,255; + @assert pixel 0,49 == 0,255,0,255; + @assert pixel 50,49 == 0,255,0,255; + @assert pixel 99,49 == 0,255,0,255; + +- name: 2d.path.stroke.scale2 + desc: Stroke line widths are scaled by the current transformation matrix + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(25, 12.5, 50, 25); + ctx.save(); + ctx.rotate(Math.PI/2); + ctx.scale(25, 50); + ctx.strokeStyle = '#0f0'; + ctx.stroke(); + ctx.restore(); + ctx.beginPath(); + ctx.rect(-25, -12.5, 150, 75); + ctx.save(); + ctx.rotate(Math.PI/2); + ctx.scale(25, 50); + ctx.strokeStyle = '#f00'; + ctx.stroke(); + ctx.restore(); + @assert pixel 0,0 == 0,255,0,255; + @assert pixel 50,0 == 0,255,0,255; + @assert pixel 99,0 == 0,255,0,255; + @assert pixel 0,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 99,25 == 0,255,0,255; + @assert pixel 0,49 == 0,255,0,255; + @assert pixel 50,49 == 0,255,0,255; + @assert pixel 99,49 == 0,255,0,255; + +- name: 2d.path.stroke.skew + desc: Strokes lines are skewed by the current transformation matrix + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.save(); + ctx.beginPath(); + ctx.moveTo(49, -50); + ctx.lineTo(201, -50); + ctx.rotate(Math.PI/4); + ctx.scale(1, 283); + ctx.strokeStyle = '#0f0'; + ctx.stroke(); + ctx.restore(); + ctx.save(); + ctx.beginPath(); + ctx.translate(-150, 0); + ctx.moveTo(49, -50); + ctx.lineTo(199, -50); + ctx.rotate(Math.PI/4); + ctx.scale(1, 142); + ctx.strokeStyle = '#f00'; + ctx.stroke(); + ctx.restore(); + ctx.save(); + ctx.beginPath(); + ctx.translate(-150, 0); + ctx.moveTo(49, -50); + ctx.lineTo(199, -50); + ctx.rotate(Math.PI/4); + ctx.scale(1, 142); + ctx.strokeStyle = '#f00'; + ctx.stroke(); + ctx.restore(); + @assert pixel 0,0 == 0,255,0,255; + @assert pixel 50,0 == 0,255,0,255; + @assert pixel 99,0 == 0,255,0,255; + @assert pixel 0,25 == 0,255,0,255; + @assert pixel 50,25 == 0,255,0,255; + @assert pixel 99,25 == 0,255,0,255; + @assert pixel 0,49 == 0,255,0,255; + @assert pixel 50,49 == 0,255,0,255; + @assert pixel 99,49 == 0,255,0,255; + +- name: 2d.path.stroke.empty + desc: Empty subpaths are not stroked + testing: + - 2d.path.stroke.empty + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(40, 25); + ctx.moveTo(60, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.stroke.prune.line + desc: Zero-length line segments from lineTo are removed before stroking + testing: + - 2d.path.stroke.prune + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.lineTo(50, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.stroke.prune.closed + desc: Zero-length line segments from closed paths are removed before stroking + testing: + - 2d.path.stroke.prune + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.lineTo(50, 25); + ctx.closePath(); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.stroke.prune.curve + desc: Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking + testing: + - 2d.path.stroke.prune + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.quadraticCurveTo(50, 25, 50, 25); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.bezierCurveTo(50, 25, 50, 25, 50, 25); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.stroke.prune.arc + desc: Zero-length line segments from arcTo and arc are removed before stroking + testing: + - 2d.path.stroke.prune + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.moveTo(50, 25); + ctx.arcTo(50, 25, 150, 25, 10); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(60, 25); + ctx.arc(50, 25, 10, 0, 0, false); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.stroke.prune.rect + desc: Zero-length line segments from rect and strokeRect are removed before stroking + testing: + - 2d.path.stroke.prune + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 100; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.beginPath(); + ctx.rect(50, 25, 0, 0); + ctx.stroke(); + ctx.strokeRect(50, 25, 0, 0); + @assert pixel 50,25 == 0,255,0,255; @moz-todo + +- name: 2d.path.stroke.prune.corner + desc: Zero-length line segments are removed before stroking with miters + testing: + - 2d.path.stroke.prune + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 400; + ctx.lineJoin = 'miter'; + ctx.miterLimit = 1.4; + ctx.beginPath(); + ctx.moveTo(-1000, 200); + ctx.lineTo(-100, 200); + ctx.lineTo(-100, 200); + ctx.lineTo(-100, 200); + ctx.lineTo(-100, 1000); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.transformation.basic + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.translate(-100, 0); + ctx.rect(100, 0, 100, 50); + ctx.translate(0, -100); + ctx.fillStyle = '#0f0'; + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.transformation.multiple + desc: Transformations are applied while building paths, not when drawing + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#f00'; + ctx.translate(-100, 0); + ctx.rect(0, 0, 100, 50); + ctx.fill(); + ctx.translate(100, 0); + ctx.fill(); + ctx.beginPath(); + ctx.strokeStyle = '#f00'; + ctx.lineWidth = 50; + ctx.translate(0, -50); + ctx.moveTo(0, 25); + ctx.lineTo(100, 25); + ctx.stroke(); + ctx.translate(0, 50); + ctx.stroke(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.transformation.changing + desc: Transformations are applied while building paths, not when drawing + testing: + - 2d.path.transformation + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.moveTo(0, 0); + ctx.translate(100, 0); + ctx.lineTo(0, 0); + ctx.translate(0, 50); + ctx.lineTo(0, 0); + ctx.translate(-100, 0); + ctx.lineTo(0, 0); + ctx.translate(1000, 1000); + ctx.rotate(Math.PI/2); + ctx.scale(0.1, 0.1); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.empty + testing: + - 2d.path.clip.basic + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.basic.1 + testing: + - 2d.path.clip.basic + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(0, 0, 100, 50); + ctx.clip(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.basic.2 + testing: + - 2d.path.clip.basic + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(-100, 0, 100, 50); + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.intersect + testing: + - 2d.path.clip.basic + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.rect(0, 0, 50, 50); + ctx.clip(); + ctx.beginPath(); + ctx.rect(50, 0, 50, 50) + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.winding.1 + testing: + - 2d.path.clip.basic + code: | + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.moveTo(-10, -10); + ctx.lineTo(110, -10); + ctx.lineTo(110, 60); + ctx.lineTo(-10, 60); + ctx.lineTo(-10, -10); + ctx.lineTo(0, 0); + ctx.lineTo(0, 50); + ctx.lineTo(100, 50); + ctx.lineTo(100, 0); + ctx.clip(); + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.winding.2 + testing: + - 2d.path.clip.basic + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.beginPath(); + ctx.moveTo(-10, -10); + ctx.lineTo(110, -10); + ctx.lineTo(110, 60); + ctx.lineTo(-10, 60); + ctx.lineTo(-10, -10); + ctx.clip(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(0, 50); + ctx.lineTo(100, 50); + ctx.lineTo(100, 0); + ctx.lineTo(0, 0); + ctx.clip(); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.clip.unaffected + testing: + - 2d.path.clip.closed + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0f0'; + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(0, 50); + ctx.lineTo(100, 50); + ctx.lineTo(100, 0); + ctx.clip(); + ctx.lineTo(0, 0); + ctx.fill(); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.path.isPointInPath.basic.1 + desc: isPointInPath() detects whether the point is inside the path + testing: + - 2d.path.isPointInPath + code: | + ctx.rect(0, 0, 20, 20); + @assert ctx.isPointInPath(10, 10) === true; + @assert ctx.isPointInPath(30, 10) === false; + +- name: 2d.path.isPointInPath.basic.2 + desc: isPointInPath() detects whether the point is inside the path + testing: + - 2d.path.isPointInPath + code: | + ctx.rect(20, 0, 20, 20); + @assert ctx.isPointInPath(10, 10) === false; + @assert ctx.isPointInPath(30, 10) === true; + +- name: 2d.path.isPointInPath.edge + desc: isPointInPath() counts points on the path as being inside + testing: + - 2d.path.isPointInPath.edge + code: | + ctx.rect(0, 0, 20, 20); + @assert ctx.isPointInPath(0, 0) === true; + @assert ctx.isPointInPath(10, 0) === true; + @assert ctx.isPointInPath(20, 0) === true; + @assert ctx.isPointInPath(20, 10) === true; + @assert ctx.isPointInPath(20, 20) === true; + @assert ctx.isPointInPath(10, 20) === true; + @assert ctx.isPointInPath(0, 20) === true; + @assert ctx.isPointInPath(0, 10) === true; + @assert ctx.isPointInPath(10, -0.01) === false; + @assert ctx.isPointInPath(10, 20.01) === false; + @assert ctx.isPointInPath(-0.01, 10) === false; + @assert ctx.isPointInPath(20.01, 10) === false; + +- name: 2d.path.isPointInPath.empty + desc: isPointInPath() works when there is no path + testing: + - 2d.path.isPointInPath + code: | + @assert ctx.isPointInPath(0, 0) === false; + +- name: 2d.path.isPointInPath.subpath + desc: isPointInPath() uses the current path, not just the subpath + testing: + - 2d.path.isPointInPath + code: | + ctx.rect(0, 0, 20, 20); + ctx.beginPath(); + ctx.rect(20, 0, 20, 20); + ctx.closePath(); + ctx.rect(40, 0, 20, 20); + @assert ctx.isPointInPath(10, 10) === false; + @assert ctx.isPointInPath(30, 10) === true; + @assert ctx.isPointInPath(50, 10) === true; + +- name: 2d.path.isPointInPath.outside + desc: isPointInPath() works on paths outside the canvas + testing: + - 2d.path.isPointInPath + code: | + ctx.rect(0, -100, 20, 20); + ctx.rect(20, -10, 20, 20); + @assert ctx.isPointInPath(10, -110) === false; + @assert ctx.isPointInPath(10, -90) === true; + @assert ctx.isPointInPath(10, -70) === false; + @assert ctx.isPointInPath(30, -20) === false; + @assert ctx.isPointInPath(30, 0) === true; + @assert ctx.isPointInPath(30, 20) === false; + +- name: 2d.path.isPointInPath.unclosed + desc: isPointInPath() works on unclosed subpaths + testing: + - 2d.path.isPointInPath + code: | + ctx.moveTo(0, 0); + ctx.lineTo(20, 0); + ctx.lineTo(20, 20); + ctx.lineTo(0, 20); + @assert ctx.isPointInPath(10, 10) === true; + @assert ctx.isPointInPath(30, 10) === false; + +- name: 2d.path.isPointInPath.arc + desc: isPointInPath() works on arcs + testing: + - 2d.path.isPointInPath + code: | + ctx.arc(50, 25, 10, 0, Math.PI, false); + @assert ctx.isPointInPath(50, 10) === false; + @assert ctx.isPointInPath(50, 20) === false; + @assert ctx.isPointInPath(50, 30) === true; + @assert ctx.isPointInPath(50, 40) === false; + @assert ctx.isPointInPath(30, 20) === false; + @assert ctx.isPointInPath(70, 20) === false; + @assert ctx.isPointInPath(30, 30) === false; + @assert ctx.isPointInPath(70, 30) === false; + +- name: 2d.path.isPointInPath.bigarc + desc: isPointInPath() works on unclosed arcs larger than 2pi + opera: { bug: 320937 } + testing: + - 2d.path.isPointInPath + code: | + ctx.arc(50, 25, 10, 0, 7, false); + @assert ctx.isPointInPath(50, 10) === false; + @assert ctx.isPointInPath(50, 20) === true; + @assert ctx.isPointInPath(50, 30) === true; + @assert ctx.isPointInPath(50, 40) === false; + @assert ctx.isPointInPath(30, 20) === false; + @assert ctx.isPointInPath(70, 20) === false; + @assert ctx.isPointInPath(30, 30) === false; + @assert ctx.isPointInPath(70, 30) === false; + +- name: 2d.path.isPointInPath.bezier + desc: isPointInPath() works on Bezier curves + testing: + - 2d.path.isPointInPath + code: | + ctx.moveTo(25, 25); + ctx.bezierCurveTo(50, -50, 50, 100, 75, 25); + @assert ctx.isPointInPath(25, 20) === false; + @assert ctx.isPointInPath(25, 30) === false; + @assert ctx.isPointInPath(30, 20) === true; + @assert ctx.isPointInPath(30, 30) === false; + @assert ctx.isPointInPath(40, 2) === false; + @assert ctx.isPointInPath(40, 20) === true; + @assert ctx.isPointInPath(40, 30) === false; + @assert ctx.isPointInPath(40, 47) === false; + @assert ctx.isPointInPath(45, 20) === true; + @assert ctx.isPointInPath(45, 30) === false; + @assert ctx.isPointInPath(55, 20) === false; + @assert ctx.isPointInPath(55, 30) === true; + @assert ctx.isPointInPath(60, 2) === false; + @assert ctx.isPointInPath(60, 20) === false; + @assert ctx.isPointInPath(60, 30) === true; + @assert ctx.isPointInPath(60, 47) === false; + @assert ctx.isPointInPath(70, 20) === false; + @assert ctx.isPointInPath(70, 30) === true; + @assert ctx.isPointInPath(75, 20) === false; + @assert ctx.isPointInPath(75, 30) === false; + +- name: 2d.path.isPointInPath.winding + desc: isPointInPath() uses the non-zero winding number rule + testing: + - 2d.path.isPointInPath + code: | + // Create a square ring, using opposite windings to make a hole in the centre + ctx.moveTo(0, 0); + ctx.lineTo(50, 0); + ctx.lineTo(50, 50); + ctx.lineTo(0, 50); + ctx.lineTo(0, 0); + ctx.lineTo(10, 10); + ctx.lineTo(10, 40); + ctx.lineTo(40, 40); + ctx.lineTo(40, 10); + ctx.lineTo(10, 10); + @assert ctx.isPointInPath(5, 5) === true; + @assert ctx.isPointInPath(25, 5) === true; + @assert ctx.isPointInPath(45, 5) === true; + @assert ctx.isPointInPath(5, 25) === true; + @assert ctx.isPointInPath(25, 25) === false; + @assert ctx.isPointInPath(45, 25) === true; + @assert ctx.isPointInPath(5, 45) === true; + @assert ctx.isPointInPath(25, 45) === true; + @assert ctx.isPointInPath(45, 45) === true; + +- name: 2d.path.isPointInPath.transform.1 + desc: isPointInPath() handles transformations correctly + testing: + - 2d.path.isPointInPath + code: | + ctx.translate(50, 0); + ctx.rect(0, 0, 20, 20); + @assert ctx.isPointInPath(-40, 10) === false; + @assert ctx.isPointInPath(10, 10) === false; + @assert ctx.isPointInPath(49, 10) === false; + @assert ctx.isPointInPath(51, 10) === true; + @assert ctx.isPointInPath(69, 10) === true; + @assert ctx.isPointInPath(71, 10) === false; + +- name: 2d.path.isPointInPath.transform.2 + desc: isPointInPath() handles transformations correctly + testing: + - 2d.path.isPointInPath + code: | + ctx.rect(50, 0, 20, 20); + ctx.translate(50, 0); + @assert ctx.isPointInPath(-40, 10) === false; + @assert ctx.isPointInPath(10, 10) === false; + @assert ctx.isPointInPath(49, 10) === false; + @assert ctx.isPointInPath(51, 10) === true; + @assert ctx.isPointInPath(69, 10) === true; + @assert ctx.isPointInPath(71, 10) === false; + +- name: 2d.path.isPointInPath.transform.3 + desc: isPointInPath() handles transformations correctly + testing: + - 2d.path.isPointInPath + code: | + ctx.scale(-1, 1); + ctx.rect(-70, 0, 20, 20); + @assert ctx.isPointInPath(-40, 10) === false; + @assert ctx.isPointInPath(10, 10) === false; + @assert ctx.isPointInPath(49, 10) === false; + @assert ctx.isPointInPath(51, 10) === true; + @assert ctx.isPointInPath(69, 10) === true; + @assert ctx.isPointInPath(71, 10) === false; + +- name: 2d.path.isPointInPath.transform.4 + desc: isPointInPath() handles transformations correctly + testing: + - 2d.path.isPointInPath + code: | + ctx.translate(50, 0); + ctx.rect(50, 0, 20, 20); + ctx.translate(0, 50); + @assert ctx.isPointInPath(60, 10) === false; + @assert ctx.isPointInPath(110, 10) === true; + @assert ctx.isPointInPath(110, 60) === false; + +- name: 2d.path.isPointInPath.nonfinite + desc: isPointInPath() returns false for non-finite arguments + testing: + - 2d.path.isPointInPath.nonfinite + code: | + ctx.rect(-100, -50, 200, 100); + @assert ctx.isPointInPath(Infinity, 0) === false; + @assert ctx.isPointInPath(-Infinity, 0) === false; + @assert ctx.isPointInPath(NaN, 0) === false; + @assert ctx.isPointInPath(0, Infinity) === false; + @assert ctx.isPointInPath(0, -Infinity) === false; + @assert ctx.isPointInPath(0, NaN) === false; + @assert ctx.isPointInPath(NaN, NaN) === false; + +- name: 2d.coordinatespace + desc: Coordinate space goes from top-left to bottom-right + notes: This should not be upside down. + testing: + - 2d.coordinatespace + code: | + ctx.fillStyle = '#00f'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = '#0ff'; + ctx.fillRect(0, 0, 50, 25); + @assert pixel 25,12 == 0,255,255,255; + @assert pixel 75,12 == 0,0,255,255; + @assert pixel 25,37 == 0,0,255,255; + @assert pixel 75,37 == 0,0,255,255; + +- name: 2d.missingargs + desc: Missing arguments cause TypeError + code: | + @assert throws TypeError ctx.scale(); + @assert throws TypeError ctx.scale(1); + @assert throws TypeError ctx.rotate(); + @assert throws TypeError ctx.translate(); + @assert throws TypeError ctx.translate(0); + if (ctx.transform) { // (avoid spurious failures, since the aim here is not to test that all features are supported) + @assert throws TypeError ctx.transform(); + @assert throws TypeError ctx.transform(1); + @assert throws TypeError ctx.transform(1, 0); + @assert throws TypeError ctx.transform(1, 0, 0); + @assert throws TypeError ctx.transform(1, 0, 0, 1); + @assert throws TypeError ctx.transform(1, 0, 0, 1, 0); + } + if (ctx.setTransform) { + @assert throws TypeError ctx.setTransform(); + @assert throws TypeError ctx.setTransform(1); + @assert throws TypeError ctx.setTransform(1, 0); + @assert throws TypeError ctx.setTransform(1, 0, 0); + @assert throws TypeError ctx.setTransform(1, 0, 0, 1); + @assert throws TypeError ctx.setTransform(1, 0, 0, 1, 0); + } + @assert throws TypeError ctx.createLinearGradient(); + @assert throws TypeError ctx.createLinearGradient(0); + @assert throws TypeError ctx.createLinearGradient(0, 0); + @assert throws TypeError ctx.createLinearGradient(0, 0, 1); + @assert throws TypeError ctx.createRadialGradient(); + @assert throws TypeError ctx.createRadialGradient(0); + @assert throws TypeError ctx.createRadialGradient(0, 0); + @assert throws TypeError ctx.createRadialGradient(0, 0, 1); + @assert throws TypeError ctx.createRadialGradient(0, 0, 1, 0); + @assert throws TypeError ctx.createRadialGradient(0, 0, 1, 0, 0); + @assert throws TypeError ctx.createPattern(offscreenCanvas); + @assert throws TypeError ctx.clearRect(); + @assert throws TypeError ctx.clearRect(0); + @assert throws TypeError ctx.clearRect(0, 0); + @assert throws TypeError ctx.clearRect(0, 0, 0); + @assert throws TypeError ctx.fillRect(); + @assert throws TypeError ctx.fillRect(0); + @assert throws TypeError ctx.fillRect(0, 0); + @assert throws TypeError ctx.fillRect(0, 0, 0); + @assert throws TypeError ctx.strokeRect(); + @assert throws TypeError ctx.strokeRect(0); + @assert throws TypeError ctx.strokeRect(0, 0); + @assert throws TypeError ctx.strokeRect(0, 0, 0); + @assert throws TypeError ctx.moveTo(); + @assert throws TypeError ctx.moveTo(0); + @assert throws TypeError ctx.lineTo(); + @assert throws TypeError ctx.lineTo(0); + @assert throws TypeError ctx.quadraticCurveTo(); + @assert throws TypeError ctx.quadraticCurveTo(0); + @assert throws TypeError ctx.quadraticCurveTo(0, 0); + @assert throws TypeError ctx.quadraticCurveTo(0, 0, 0); + @assert throws TypeError ctx.bezierCurveTo(); + @assert throws TypeError ctx.bezierCurveTo(0); + @assert throws TypeError ctx.bezierCurveTo(0, 0); + @assert throws TypeError ctx.bezierCurveTo(0, 0, 0); + @assert throws TypeError ctx.bezierCurveTo(0, 0, 0, 0); + @assert throws TypeError ctx.bezierCurveTo(0, 0, 0, 0, 0); + @assert throws TypeError ctx.arcTo(); + @assert throws TypeError ctx.arcTo(0); + @assert throws TypeError ctx.arcTo(0, 0); + @assert throws TypeError ctx.arcTo(0, 0, 0); + @assert throws TypeError ctx.arcTo(0, 0, 0, 0); + @assert throws TypeError ctx.rect(); + @assert throws TypeError ctx.rect(0); + @assert throws TypeError ctx.rect(0, 0); + @assert throws TypeError ctx.rect(0, 0, 0); + @assert throws TypeError ctx.arc(); + @assert throws TypeError ctx.arc(0); + @assert throws TypeError ctx.arc(0, 0); + @assert throws TypeError ctx.arc(0, 0, 1); + @assert throws TypeError ctx.arc(0, 0, 1, 0); + @assert throws TypeError ctx.drawImage(); + @assert throws TypeError ctx.drawImage(offscreenCanvas); + @assert throws TypeError ctx.drawImage(offscreenCanvas, 0); + // TODO: n >= 3 args on drawImage could be either a valid overload, + // or too few for another overload, or too many for another + // overload - what should happen? + if (ctx.createImageData) { + @assert throws TypeError ctx.createImageData(); + @assert throws TypeError ctx.createImageData(1); + } + if (ctx.getImageData) { + @assert throws TypeError ctx.getImageData(); + @assert throws TypeError ctx.getImageData(0); + @assert throws TypeError ctx.getImageData(0, 0); + @assert throws TypeError ctx.getImageData(0, 0, 1); + } + if (ctx.putImageData) { + var imgdata = ctx.getImageData(0, 0, 1, 1); + @assert throws TypeError ctx.putImageData(); + @assert throws TypeError ctx.putImageData(imgdata); + @assert throws TypeError ctx.putImageData(imgdata, 0); + } + var g = ctx.createLinearGradient(0, 0, 0, 0); + @assert throws TypeError g.addColorStop(); @moz-todo + @assert throws TypeError g.addColorStop(0); @moz-todo + +- name: 2d.voidreturn + desc: void methods return undefined + code: | + @assert ctx.save() === undefined; + @assert ctx.restore() === undefined; + @assert ctx.scale(1, 1) === undefined; + @assert ctx.rotate(0) === undefined; + @assert ctx.translate(0, 0) === undefined; + if (ctx.transform) { // (avoid spurious failures, since the aim here is not to test that all features are supported) + @assert ctx.transform(1, 0, 0, 1, 0, 0) === undefined; + } + if (ctx.setTransform) { + @assert ctx.setTransform(1, 0, 0, 1, 0, 0) === undefined; + } + @assert ctx.clearRect(0, 0, 0, 0) === undefined; + @assert ctx.fillRect(0, 0, 0, 0) === undefined; + @assert ctx.strokeRect(0, 0, 0, 0) === undefined; + @assert ctx.beginPath() === undefined; + @assert ctx.closePath() === undefined; + @assert ctx.moveTo(0, 0) === undefined; + @assert ctx.lineTo(0, 0) === undefined; + @assert ctx.quadraticCurveTo(0, 0, 0, 0) === undefined; + @assert ctx.bezierCurveTo(0, 0, 0, 0, 0, 0) === undefined; + @assert ctx.arcTo(0, 0, 0, 0, 1) === undefined; + @assert ctx.rect(0, 0, 0, 0) === undefined; + @assert ctx.arc(0, 0, 1, 0, 0, true) === undefined; + @assert ctx.fill() === undefined; + @assert ctx.stroke() === undefined; + @assert ctx.clip() === undefined; + if (ctx.putImageData) { + @assert ctx.putImageData(ctx.getImageData(0, 0, 1, 1), 0, 0) === undefined; + } + @assert ctx.drawImage(offscreenCanvas, 0, 0, 1, 1, 0, 0, 0, 0) === undefined; + @assert ctx.createLinearGradient(0, 0, 0, 0).addColorStop(0, 'white') === undefined; + +- name: 2d.canvas.reference + desc: canvas refers back to its canvas + testing: + - 2d.canvas + code: | + @assert ctx.canvas === offscreenCanvas; + +- name: 2d.canvas.readonly + desc: canvas is readonly + testing: + - 2d.canvas.attribute + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var d = ctx.canvas; + @assert offscreenCanvas2 !== d; + ctx.canvas = offscreenCanvas2; + @assert ctx.canvas === d; + +- name: 2d.getcontext.exists + desc: The 2D context is implemented + testing: + - context.2d + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert offscreenCanvas2.getContext('2d') !== null; + +- name: 2d.getcontext.extraargs + desc: The 2D context ignores extra getContext arguments + testing: + - context.2d.extraargs + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert offscreenCanvas2.getContext('2d', false, {}, [], 1, "2") !== null; + +- name: 2d.getcontext.unique + desc: getContext('2d') returns the same object + testing: + - context.unique + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert offscreenCanvas2.getContext('2d') === offscreenCanvas2.getContext('2d'); + +- name: 2d.getcontext.shared + desc: getContext('2d') returns objects which share canvas state + testing: + - context.unique + code: | + var ctx2 = offscreenCanvas.getContext('2d'); + ctx.fillStyle = '#f00'; + ctx2.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: context.emptystring + desc: getContext with empty string returns null + testing: + - context.unrecognised + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext(""); + +- name: context.unrecognised.badname + desc: getContext with unrecognised context name returns null + testing: + - context.unrecognised + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext('This is not an implemented context in any real browser'); + +- name: context.unrecognised.badsuffix + desc: Context name "2d" plus a suffix is unrecognised + testing: + - context.unrecognised + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext("2d#"); + +- name: context.unrecognised.nullsuffix + desc: Context name "2d" plus a "\0" suffix is unrecognised + testing: + - context.unrecognised + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext("2d\0"); + +- name: context.unrecognised.unicode + desc: Context name which kind of looks like "2d" is unrecognised + testing: + - context.unrecognised + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext("2\uFF44"); + +- name: context.casesensitive + desc: Context name "2D" is unrecognised; matching is case sensitive + testing: + - context.unrecognised + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext('2D'); + +- name: context.arguments.missing + testing: + - canvas.getContext + code: | + var offscreenCanvas2 = new OffscreenCanvas(100, 50); + @assert throws TypeError offscreenCanvas2.getContext(); @moz-todo + + +- name: initial.colour + desc: Initial state is transparent black + testing: + - initial.colour + code: | + @assert pixel 20,20 == 0,0,0,0; + +- name: initial.reset.different + desc: Changing size resets canvas to transparent black + testing: + - initial.reset + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 20,20 == 255,0,0,255; + offscreenCanvas.width = 50; + @assert pixel 20,20 == 0,0,0,0; + +- name: initial.reset.same + desc: Setting size (not changing the value) resets canvas to transparent black + testing: + - initial.reset + code: | + offscreenCanvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 20,20 == 255,0,0,255; + offscreenCanvas.width = 100; + @assert pixel 20,20 == 0,0,0,0; + +- name: initial.reset.path + desc: Resetting the canvas state resets the current path + testing: + - initial.reset + code: | + offscreenCanvas.width = 100; + ctx.rect(0, 0, 100, 50); + offscreenCanvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fill(); + @assert pixel 20,20 == 0,0,0,0; + +- name: initial.reset.clip + desc: Resetting the canvas state resets the current clip region + testing: + - initial.reset + code: | + offscreenCanvas.width = 100; + ctx.rect(0, 0, 1, 1); + ctx.clip(); + offscreenCanvas.width = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 20,20 == 0,255,0,255; + +- name: initial.reset.transform + desc: Resetting the canvas state resets the current transformation matrix + testing: + - initial.reset + code: | + offscreenCanvas.width = 100; + ctx.scale(0.1, 0.1); + offscreenCanvas.width = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 20,20 == 0,255,0,255; + +- name: initial.reset.gradient + desc: Resetting the canvas state does not invalidate any existing gradients + testing: + - initial.reset + code: | + offscreenCanvas.width = 50; + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#0f0'); + offscreenCanvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: initial.reset.pattern + desc: Resetting the canvas state does not invalidate any existing patterns + testing: + - initial.reset + code: | + offscreenCanvas.width = 30; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 30, 50); + var p = ctx.createPattern(offscreenCanvas, 'repeat-x'); + offscreenCanvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = p; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: size.attributes.idl.set.zero + desc: Setting width/height IDL attributes to 0 + testing: + - size.width + - size.height + code: | + offscreenCanvas.width = 0; + offscreenCanvas.height = 0; + @assert offscreenCanvas.width === 0; + @assert offscreenCanvas.height === 0; + +- name: size.attributes.idl + desc: Getting/setting width/height IDL attributes + testing: + - size.width + - size.height + webidl: + - es-unsigned-long + code: | + offscreenCanvas.width = "100"; + offscreenCanvas.height = "100"; + @assert offscreenCanvas.width === 100; + @assert offscreenCanvas.height === 100; + offscreenCanvas.width = "+1.5e2"; + offscreenCanvas.height = "0x96"; + @assert offscreenCanvas.width === 150; + @assert offscreenCanvas.height === 150; + offscreenCanvas.width = 301.999; + offscreenCanvas.height = 301.001; + @assert offscreenCanvas.width === 301; + @assert offscreenCanvas.height === 301; + offscreenCanvas.width = "400x"; + offscreenCanvas.height = "foo"; + @assert offscreenCanvas.width === 0; + @assert offscreenCanvas.height === 0; + +- name: size.attributes.default + desc: Default width/height when attributes are missing + testing: + - size.default + - size.missing + code: | + @assert offscreenCanvas.width === 100; + @assert offscreenCanvas.height === 50; + +- name: size.attributes.reflect.setidl + desc: Setting IDL attributes updates IDL and content attributes + testing: + - size.reflect + code: | + offscreenCanvas.width = 120; + offscreenCanvas.height = 60; + @assert offscreenCanvas.width === 120; + @assert offscreenCanvas.height === 60; + +- name: size.attributes.reflect.setidlzero + desc: Setting IDL attributes to 0 updates IDL and content attributes + testing: + - size.reflect + code: | + offscreenCanvas.width = 0; + offscreenCanvas.height = 0; + @assert offscreenCanvas.width === 0; + @assert offscreenCanvas.height === 0; + +- meta: | + cases = [ + ("zero", "0", 0), + ("empty", "", None), + ("onlyspace", " ", None), + ("space", " 100", 100), + ("whitespace", "\t\f100", 100), + ("plus", "+100", 100), + ("minus", "-100", None), + ("octal", "0100", 100), + ("hex", "0x100", 0x100), + ("exp", "100e1", 100e1), + ("decimal", "100.999", 100), + ("percent", "100%", 100), + ("em", "100em", 100), + ("junk", "#!?", None), + ("trailingjunk", "100#!?", 100), + ] + def gen(name, string, exp, code): + testing = ["size.nonnegativeinteger"] + if exp is None: + testing.append("size.error") + code += "offscreenCanvas.width = '%s';\noffscreenCanvas.height = '%s';\n" % (string, string) + code += "@assert offscreenCanvas.width === 100;\n@assert offscreenCanvas.height === 50;\n" + expected = None + else: + code += "offscreenCanvas.width = '%s';\noffscreenCanvas.height = '%s';\n" % (string, string) + code += "@assert offscreenCanvas.width === %s;\n@assert offscreenCanvas.height === %s;\n" % (exp, exp) + expected = None + + if exp == 0: + expected = None # can't generate zero-sized PNGs for the expected image + + return code, testing, expected + + for name, string, exp in cases: + code = "" + code, testing, expected = gen(name, string, exp, code) + tests.append( { + "name": "size.attributes.parse.%s" % name, + "desc": "Parsing of non-negative integers", + "testing": testing, + "code": code, + } ) + +- name: size.large + testing: + - size.width + - size.height + notes: Not sure how reasonable this is, but the spec doesn't say there's an upper limit on the size. + code: | + var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long" + offscreenCanvas.width = n; + offscreenCanvas.height = n; + @assert offscreenCanvas.width === n; + @assert offscreenCanvas.height === n; diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.order.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.order.html new file mode 100644 index 00000000000..8d01b5aac6f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.order.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.order</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.order</h1> +<p class="desc">Transformations are applied in the right order</p> + + +<script> +var t = async_test("Transformations are applied in the right order"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(2, 1); +ctx.rotate(Math.PI / 2); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, -50, 50, 50); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.order.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.order.worker.js new file mode 100644 index 00000000000..e6aa169ed85 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.order.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.order +// Description:Transformations are applied in the right order +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Transformations are applied in the right order"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(2, 1); +ctx.rotate(Math.PI / 2); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, -50, 50, 50); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.direction.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.direction.html new file mode 100644 index 00000000000..81dfdadf876 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.direction.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.rotate.direction</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.rotate.direction</h1> +<p class="desc">rotate() is clockwise</p> + + +<script> +var t = async_test("rotate() is clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(Math.PI / 2); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, -100, 50, 100); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.direction.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.direction.worker.js new file mode 100644 index 00000000000..328296fce17 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.direction.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.rotate.direction +// Description:rotate() is clockwise +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rotate() is clockwise"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(Math.PI / 2); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, -100, 50, 100); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.html new file mode 100644 index 00000000000..fb6a73fbf61 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.rotate.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.rotate.nonfinite</h1> +<p class="desc">rotate() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("rotate() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.rotate(Infinity); +ctx.rotate(-Infinity); +ctx.rotate(NaN); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.worker.js new file mode 100644 index 00000000000..dbfdfc76c57 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.nonfinite.worker.js @@ -0,0 +1,28 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.rotate.nonfinite +// Description:rotate() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rotate() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.rotate(Infinity); +ctx.rotate(-Infinity); +ctx.rotate(NaN); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.radians.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.radians.html new file mode 100644 index 00000000000..55bc2930981 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.radians.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.rotate.radians</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.rotate.radians</h1> +<p class="desc">rotate() uses radians</p> + + +<script> +var t = async_test("rotate() uses radians"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(Math.PI); // should fail obviously if this is 3.1 degrees +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.radians.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.radians.worker.js new file mode 100644 index 00000000000..243ed5e46c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.radians.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.rotate.radians +// Description:rotate() uses radians +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rotate() uses radians"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(Math.PI); // should fail obviously if this is 3.1 degrees +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrap.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrap.html new file mode 100644 index 00000000000..9c1333a3611 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrap.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.rotate.wrap</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.rotate.wrap</h1> +<p class="desc">rotate() wraps large positive values correctly</p> + + +<script> +var t = async_test("rotate() wraps large positive values correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(Math.PI * (1 + 4096)); // == pi (mod 2*pi) +// We need about pi +/- 0.001 in order to get correct-looking results +// 32-bit floats can store pi*4097 with precision 2^-10, so that should +// be safe enough on reasonable implementations +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,2, 0,255,0,255, "98,2", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,47, 0,255,0,255, "98,47", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrap.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrap.worker.js new file mode 100644 index 00000000000..5a7a413a62c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrap.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.rotate.wrap +// Description:rotate() wraps large positive values correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rotate() wraps large positive values correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(Math.PI * (1 + 4096)); // == pi (mod 2*pi) +// We need about pi +/- 0.001 in order to get correct-looking results +// 32-bit floats can store pi*4097 with precision 2^-10, so that should +// be safe enough on reasonable implementations +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,2, 0,255,0,255, "98,2", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,47, 0,255,0,255, "98,47", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.html new file mode 100644 index 00000000000..108f6d83078 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.rotate.wrapnegative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.rotate.wrapnegative</h1> +<p class="desc">rotate() wraps large negative values correctly</p> + + +<script> +var t = async_test("rotate() wraps large negative values correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(-Math.PI * (1 + 4096)); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,2, 0,255,0,255, "98,2", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,47, 0,255,0,255, "98,47", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.worker.js new file mode 100644 index 00000000000..5d13b3224f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.wrapnegative.worker.js @@ -0,0 +1,27 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.rotate.wrapnegative +// Description:rotate() wraps large negative values correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rotate() wraps large negative values correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(-Math.PI * (1 + 4096)); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,2, 0,255,0,255, "98,2", "0,255,0,255"); +_assertPixel(offscreenCanvas, 98,47, 0,255,0,255, "98,47", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.zero.html new file mode 100644 index 00000000000..1d0a3e4c03c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.zero.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.rotate.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.rotate.zero</h1> +<p class="desc">rotate() by 0 does nothing</p> + + +<script> +var t = async_test("rotate() by 0 does nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(0); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.zero.worker.js new file mode 100644 index 00000000000..4b664be80ba --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.rotate.zero.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.rotate.zero +// Description:rotate() by 0 does nothing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("rotate() by 0 does nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.rotate(0); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.basic.html new file mode 100644 index 00000000000..1f760c10156 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.basic.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.scale.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.scale.basic</h1> +<p class="desc">scale() works</p> + + +<script> +var t = async_test("scale() works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(2, 4); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 12.5); +_assertPixel(offscreenCanvas, 90,40, 0,255,0,255, "90,40", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.basic.worker.js new file mode 100644 index 00000000000..d35a350caac --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.basic.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.scale.basic +// Description:scale() works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("scale() works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(2, 4); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 12.5); +_assertPixel(offscreenCanvas, 90,40, 0,255,0,255, "90,40", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.large.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.large.html new file mode 100644 index 00000000000..5383b54cf80 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.large.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.scale.large</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.scale.large</h1> +<p class="desc">scale() with large scale factors works</p> + +<p class="notes">Not really that large at all, but it hits the limits in Firefox. +<script> +var t = async_test("scale() with large scale factors works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(1e5, 1e5); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 1, 1); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.large.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.large.worker.js new file mode 100644 index 00000000000..a9225542077 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.large.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.scale.large +// Description:scale() with large scale factors works +// Note:<p class="notes">Not really that large at all, but it hits the limits in Firefox. + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("scale() with large scale factors works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(1e5, 1e5); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 1, 1); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.multiple.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.multiple.html new file mode 100644 index 00000000000..cea70306f42 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.multiple.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.scale.multiple</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.scale.multiple</h1> +<p class="desc">Multiple scale()s combine</p> + + +<script> +var t = async_test("Multiple scale()s combine"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(Math.sqrt(2), Math.sqrt(2)); +ctx.scale(Math.sqrt(2), Math.sqrt(2)); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 25); +_assertPixel(offscreenCanvas, 90,40, 0,255,0,255, "90,40", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.multiple.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.multiple.worker.js new file mode 100644 index 00000000000..1341166a3da --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.multiple.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.scale.multiple +// Description:Multiple scale()s combine +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Multiple scale()s combine"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.scale(Math.sqrt(2), Math.sqrt(2)); +ctx.scale(Math.sqrt(2), Math.sqrt(2)); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 25); +_assertPixel(offscreenCanvas, 90,40, 0,255,0,255, "90,40", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.negative.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.negative.html new file mode 100644 index 00000000000..4881383fd8c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.negative.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.scale.negative</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.scale.negative</h1> +<p class="desc">scale() with negative scale factors works</p> + + +<script> +var t = async_test("scale() with negative scale factors works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.scale(-1, 1); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-50, 0, 50, 50); +ctx.restore(); +ctx.save(); +ctx.scale(1, -1); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, -50, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.negative.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.negative.worker.js new file mode 100644 index 00000000000..27d6de0c530 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.negative.worker.js @@ -0,0 +1,33 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.scale.negative +// Description:scale() with negative scale factors works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("scale() with negative scale factors works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.scale(-1, 1); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-50, 0, 50, 50); +ctx.restore(); +ctx.save(); +ctx.scale(1, -1); +ctx.fillStyle = '#0f0'; +ctx.fillRect(50, -50, 50, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); +_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.html new file mode 100644 index 00000000000..7ffa3023233 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.scale.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.scale.nonfinite</h1> +<p class="desc">scale() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("scale() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.scale(Infinity, 0.1); +ctx.scale(-Infinity, 0.1); +ctx.scale(NaN, 0.1); +ctx.scale(0.1, Infinity); +ctx.scale(0.1, -Infinity); +ctx.scale(0.1, NaN); +ctx.scale(Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.worker.js new file mode 100644 index 00000000000..f89950fe6e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.nonfinite.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.scale.nonfinite +// Description:scale() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("scale() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.scale(Infinity, 0.1); +ctx.scale(-Infinity, 0.1); +ctx.scale(NaN, 0.1); +ctx.scale(0.1, Infinity); +ctx.scale(0.1, -Infinity); +ctx.scale(0.1, NaN); +ctx.scale(Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.zero.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.zero.html new file mode 100644 index 00000000000..092ba86d3f9 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.zero.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.scale.zero</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.scale.zero</h1> +<p class="desc">scale() with a scale factor of zero works</p> + + +<script> +var t = async_test("scale() with a scale factor of zero works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.translate(50, 0); +ctx.scale(0, 1); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.restore(); +ctx.save(); +ctx.translate(0, 25); +ctx.scale(1, 0); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.zero.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.zero.worker.js new file mode 100644 index 00000000000..2559357db00 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.scale.zero.worker.js @@ -0,0 +1,34 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.scale.zero +// Description:scale() with a scale factor of zero works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("scale() with a scale factor of zero works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.save(); +ctx.translate(50, 0); +ctx.scale(0, 1); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.restore(); +ctx.save(); +ctx.translate(0, 25); +ctx.scale(1, 0); +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.restore(); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.html new file mode 100644 index 00000000000..666b4c54a32 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.setTransform.multiple</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.setTransform.multiple</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.setTransform(1/2,0, 0,1/2, 0,0); +ctx.setTransform(2,0, 0,2, 0,0); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 25); +_assertPixel(offscreenCanvas, 75,35, 0,255,0,255, "75,35", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.worker.js new file mode 100644 index 00000000000..835301624ae --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.multiple.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.setTransform.multiple +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.setTransform(1/2,0, 0,1/2, 0,0); +ctx.setTransform(2,0, 0,2, 0,0); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 50, 25); +_assertPixel(offscreenCanvas, 75,35, 0,255,0,255, "75,35", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.html new file mode 100644 index 00000000000..fca5d5df919 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.setTransform.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.setTransform.nonfinite</h1> +<p class="desc">setTransform() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("setTransform() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.setTransform(Infinity, 0, 0, 0, 0, 0); +ctx.setTransform(-Infinity, 0, 0, 0, 0, 0); +ctx.setTransform(NaN, 0, 0, 0, 0, 0); +ctx.setTransform(0, Infinity, 0, 0, 0, 0); +ctx.setTransform(0, -Infinity, 0, 0, 0, 0); +ctx.setTransform(0, NaN, 0, 0, 0, 0); +ctx.setTransform(0, 0, Infinity, 0, 0, 0); +ctx.setTransform(0, 0, -Infinity, 0, 0, 0); +ctx.setTransform(0, 0, NaN, 0, 0, 0); +ctx.setTransform(0, 0, 0, Infinity, 0, 0); +ctx.setTransform(0, 0, 0, -Infinity, 0, 0); +ctx.setTransform(0, 0, 0, NaN, 0, 0); +ctx.setTransform(0, 0, 0, 0, Infinity, 0); +ctx.setTransform(0, 0, 0, 0, -Infinity, 0); +ctx.setTransform(0, 0, 0, 0, NaN, 0); +ctx.setTransform(0, 0, 0, 0, 0, Infinity); +ctx.setTransform(0, 0, 0, 0, 0, -Infinity); +ctx.setTransform(0, 0, 0, 0, 0, NaN); +ctx.setTransform(Infinity, Infinity, 0, 0, 0, 0); +ctx.setTransform(Infinity, Infinity, Infinity, 0, 0, 0); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, 0, 0); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, Infinity, 0); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, 0, Infinity); +ctx.setTransform(Infinity, Infinity, Infinity, 0, Infinity, 0); +ctx.setTransform(Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, Infinity, 0, 0, Infinity); +ctx.setTransform(Infinity, Infinity, 0, Infinity, 0, 0); +ctx.setTransform(Infinity, Infinity, 0, Infinity, Infinity, 0); +ctx.setTransform(Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, 0, Infinity, 0, Infinity); +ctx.setTransform(Infinity, Infinity, 0, 0, Infinity, 0); +ctx.setTransform(Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, 0, 0, 0, Infinity); +ctx.setTransform(Infinity, 0, Infinity, 0, 0, 0); +ctx.setTransform(Infinity, 0, Infinity, Infinity, 0, 0); +ctx.setTransform(Infinity, 0, Infinity, Infinity, Infinity, 0); +ctx.setTransform(Infinity, 0, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, 0, Infinity, Infinity, 0, Infinity); +ctx.setTransform(Infinity, 0, Infinity, 0, Infinity, 0); +ctx.setTransform(Infinity, 0, Infinity, 0, Infinity, Infinity); +ctx.setTransform(Infinity, 0, Infinity, 0, 0, Infinity); +ctx.setTransform(Infinity, 0, 0, Infinity, 0, 0); +ctx.setTransform(Infinity, 0, 0, Infinity, Infinity, 0); +ctx.setTransform(Infinity, 0, 0, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, 0, 0, Infinity, 0, Infinity); +ctx.setTransform(Infinity, 0, 0, 0, Infinity, 0); +ctx.setTransform(Infinity, 0, 0, 0, Infinity, Infinity); +ctx.setTransform(Infinity, 0, 0, 0, 0, Infinity); +ctx.setTransform(0, Infinity, Infinity, 0, 0, 0); +ctx.setTransform(0, Infinity, Infinity, Infinity, 0, 0); +ctx.setTransform(0, Infinity, Infinity, Infinity, Infinity, 0); +ctx.setTransform(0, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(0, Infinity, Infinity, Infinity, 0, Infinity); +ctx.setTransform(0, Infinity, Infinity, 0, Infinity, 0); +ctx.setTransform(0, Infinity, Infinity, 0, Infinity, Infinity); +ctx.setTransform(0, Infinity, Infinity, 0, 0, Infinity); +ctx.setTransform(0, Infinity, 0, Infinity, 0, 0); +ctx.setTransform(0, Infinity, 0, Infinity, Infinity, 0); +ctx.setTransform(0, Infinity, 0, Infinity, Infinity, Infinity); +ctx.setTransform(0, Infinity, 0, Infinity, 0, Infinity); +ctx.setTransform(0, Infinity, 0, 0, Infinity, 0); +ctx.setTransform(0, Infinity, 0, 0, Infinity, Infinity); +ctx.setTransform(0, Infinity, 0, 0, 0, Infinity); +ctx.setTransform(0, 0, Infinity, Infinity, 0, 0); +ctx.setTransform(0, 0, Infinity, Infinity, Infinity, 0); +ctx.setTransform(0, 0, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(0, 0, Infinity, Infinity, 0, Infinity); +ctx.setTransform(0, 0, Infinity, 0, Infinity, 0); +ctx.setTransform(0, 0, Infinity, 0, Infinity, Infinity); +ctx.setTransform(0, 0, Infinity, 0, 0, Infinity); +ctx.setTransform(0, 0, 0, Infinity, Infinity, 0); +ctx.setTransform(0, 0, 0, Infinity, Infinity, Infinity); +ctx.setTransform(0, 0, 0, Infinity, 0, Infinity); +ctx.setTransform(0, 0, 0, 0, Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.worker.js new file mode 100644 index 00000000000..12cdbca923b --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.nonfinite.worker.js @@ -0,0 +1,100 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.setTransform.nonfinite +// Description:setTransform() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("setTransform() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.setTransform(Infinity, 0, 0, 0, 0, 0); +ctx.setTransform(-Infinity, 0, 0, 0, 0, 0); +ctx.setTransform(NaN, 0, 0, 0, 0, 0); +ctx.setTransform(0, Infinity, 0, 0, 0, 0); +ctx.setTransform(0, -Infinity, 0, 0, 0, 0); +ctx.setTransform(0, NaN, 0, 0, 0, 0); +ctx.setTransform(0, 0, Infinity, 0, 0, 0); +ctx.setTransform(0, 0, -Infinity, 0, 0, 0); +ctx.setTransform(0, 0, NaN, 0, 0, 0); +ctx.setTransform(0, 0, 0, Infinity, 0, 0); +ctx.setTransform(0, 0, 0, -Infinity, 0, 0); +ctx.setTransform(0, 0, 0, NaN, 0, 0); +ctx.setTransform(0, 0, 0, 0, Infinity, 0); +ctx.setTransform(0, 0, 0, 0, -Infinity, 0); +ctx.setTransform(0, 0, 0, 0, NaN, 0); +ctx.setTransform(0, 0, 0, 0, 0, Infinity); +ctx.setTransform(0, 0, 0, 0, 0, -Infinity); +ctx.setTransform(0, 0, 0, 0, 0, NaN); +ctx.setTransform(Infinity, Infinity, 0, 0, 0, 0); +ctx.setTransform(Infinity, Infinity, Infinity, 0, 0, 0); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, 0, 0); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, Infinity, 0); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, Infinity, Infinity, 0, Infinity); +ctx.setTransform(Infinity, Infinity, Infinity, 0, Infinity, 0); +ctx.setTransform(Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, Infinity, 0, 0, Infinity); +ctx.setTransform(Infinity, Infinity, 0, Infinity, 0, 0); +ctx.setTransform(Infinity, Infinity, 0, Infinity, Infinity, 0); +ctx.setTransform(Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, 0, Infinity, 0, Infinity); +ctx.setTransform(Infinity, Infinity, 0, 0, Infinity, 0); +ctx.setTransform(Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.setTransform(Infinity, Infinity, 0, 0, 0, Infinity); +ctx.setTransform(Infinity, 0, Infinity, 0, 0, 0); +ctx.setTransform(Infinity, 0, Infinity, Infinity, 0, 0); +ctx.setTransform(Infinity, 0, Infinity, Infinity, Infinity, 0); +ctx.setTransform(Infinity, 0, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, 0, Infinity, Infinity, 0, Infinity); +ctx.setTransform(Infinity, 0, Infinity, 0, Infinity, 0); +ctx.setTransform(Infinity, 0, Infinity, 0, Infinity, Infinity); +ctx.setTransform(Infinity, 0, Infinity, 0, 0, Infinity); +ctx.setTransform(Infinity, 0, 0, Infinity, 0, 0); +ctx.setTransform(Infinity, 0, 0, Infinity, Infinity, 0); +ctx.setTransform(Infinity, 0, 0, Infinity, Infinity, Infinity); +ctx.setTransform(Infinity, 0, 0, Infinity, 0, Infinity); +ctx.setTransform(Infinity, 0, 0, 0, Infinity, 0); +ctx.setTransform(Infinity, 0, 0, 0, Infinity, Infinity); +ctx.setTransform(Infinity, 0, 0, 0, 0, Infinity); +ctx.setTransform(0, Infinity, Infinity, 0, 0, 0); +ctx.setTransform(0, Infinity, Infinity, Infinity, 0, 0); +ctx.setTransform(0, Infinity, Infinity, Infinity, Infinity, 0); +ctx.setTransform(0, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(0, Infinity, Infinity, Infinity, 0, Infinity); +ctx.setTransform(0, Infinity, Infinity, 0, Infinity, 0); +ctx.setTransform(0, Infinity, Infinity, 0, Infinity, Infinity); +ctx.setTransform(0, Infinity, Infinity, 0, 0, Infinity); +ctx.setTransform(0, Infinity, 0, Infinity, 0, 0); +ctx.setTransform(0, Infinity, 0, Infinity, Infinity, 0); +ctx.setTransform(0, Infinity, 0, Infinity, Infinity, Infinity); +ctx.setTransform(0, Infinity, 0, Infinity, 0, Infinity); +ctx.setTransform(0, Infinity, 0, 0, Infinity, 0); +ctx.setTransform(0, Infinity, 0, 0, Infinity, Infinity); +ctx.setTransform(0, Infinity, 0, 0, 0, Infinity); +ctx.setTransform(0, 0, Infinity, Infinity, 0, 0); +ctx.setTransform(0, 0, Infinity, Infinity, Infinity, 0); +ctx.setTransform(0, 0, Infinity, Infinity, Infinity, Infinity); +ctx.setTransform(0, 0, Infinity, Infinity, 0, Infinity); +ctx.setTransform(0, 0, Infinity, 0, Infinity, 0); +ctx.setTransform(0, 0, Infinity, 0, Infinity, Infinity); +ctx.setTransform(0, 0, Infinity, 0, 0, Infinity); +ctx.setTransform(0, 0, 0, Infinity, Infinity, 0); +ctx.setTransform(0, 0, 0, Infinity, Infinity, Infinity); +ctx.setTransform(0, 0, 0, Infinity, 0, Infinity); +ctx.setTransform(0, 0, 0, 0, Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.html new file mode 100644 index 00000000000..d36502d3d59 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.setTransform.skewed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.setTransform.skewed</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Create green with a red square ring inside it +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(20, 10, 60, 30); +ctx.fillStyle = '#0f0'; +ctx.fillRect(40, 20, 20, 10); +// Draw a skewed shape to fill that gap, to make sure it is aligned correctly +ctx.setTransform(1,4, 2,3, 5,6); +// Post-transform coordinates: +// [[20,10],[80,10],[80,40],[20,40],[20,10],[40,20],[40,30],[60,30],[60,20],[40,20],[20,10]]; +// Hence pre-transform coordinates: +var pts=[[-7.4,11.2],[-43.4,59.2],[-31.4,53.2],[4.6,5.2],[-7.4,11.2], + [-15.4,25.2],[-11.4,23.2],[-23.4,39.2],[-27.4,41.2],[-15.4,25.2], + [-7.4,11.2]]; +ctx.beginPath(); +ctx.moveTo(pts[0][0], pts[0][1]); +for (var i = 0; i < pts.length; ++i) + ctx.lineTo(pts[i][0], pts[i][1]); +ctx.fill(); +_assertPixel(offscreenCanvas, 21,11, 0,255,0,255, "21,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,11, 0,255,0,255, "79,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,39, 0,255,0,255, "21,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,39, 0,255,0,255, "79,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,19, 0,255,0,255, "39,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,19, 0,255,0,255, "61,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,31, 0,255,0,255, "39,31", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,31, 0,255,0,255, "61,31", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.worker.js new file mode 100644 index 00000000000..6d728bff388 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.setTransform.skewed.worker.js @@ -0,0 +1,47 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.setTransform.skewed +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test(""); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Create green with a red square ring inside it +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(20, 10, 60, 30); +ctx.fillStyle = '#0f0'; +ctx.fillRect(40, 20, 20, 10); +// Draw a skewed shape to fill that gap, to make sure it is aligned correctly +ctx.setTransform(1,4, 2,3, 5,6); +// Post-transform coordinates: +// [[20,10],[80,10],[80,40],[20,40],[20,10],[40,20],[40,30],[60,30],[60,20],[40,20],[20,10]]; +// Hence pre-transform coordinates: +var pts=[[-7.4,11.2],[-43.4,59.2],[-31.4,53.2],[4.6,5.2],[-7.4,11.2], + [-15.4,25.2],[-11.4,23.2],[-23.4,39.2],[-27.4,41.2],[-15.4,25.2], + [-7.4,11.2]]; +ctx.beginPath(); +ctx.moveTo(pts[0][0], pts[0][1]); +for (var i = 0; i < pts.length; ++i) + ctx.lineTo(pts[i][0], pts[i][1]); +ctx.fill(); +_assertPixel(offscreenCanvas, 21,11, 0,255,0,255, "21,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,11, 0,255,0,255, "79,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,39, 0,255,0,255, "21,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,39, 0,255,0,255, "79,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,19, 0,255,0,255, "39,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,19, 0,255,0,255, "61,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,31, 0,255,0,255, "39,31", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,31, 0,255,0,255, "61,31", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.identity.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.identity.html new file mode 100644 index 00000000000..b5890c10f2a --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.identity.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.transform.identity</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.transform.identity</h1> +<p class="desc">transform() with the identity matrix does nothing</p> + + +<script> +var t = async_test("transform() with the identity matrix does nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.transform(1,0, 0,1, 0,0); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.identity.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.identity.worker.js new file mode 100644 index 00000000000..166fc5b4b84 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.identity.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.transform.identity +// Description:transform() with the identity matrix does nothing +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("transform() with the identity matrix does nothing"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.transform(1,0, 0,1, 0,0); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.multiply.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.multiply.html new file mode 100644 index 00000000000..1c6d1661db5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.multiply.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.transform.multiply</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.transform.multiply</h1> +<p class="desc">transform() multiplies the CTM</p> + + +<script> +var t = async_test("transform() multiplies the CTM"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.transform(1,2, 3,4, 5,6); +ctx.transform(-2,1, 3/2,-1/2, 1,-2); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.multiply.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.multiply.worker.js new file mode 100644 index 00000000000..f01d3d992fd --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.multiply.worker.js @@ -0,0 +1,26 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.transform.multiply +// Description:transform() multiplies the CTM +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("transform() multiplies the CTM"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.transform(1,2, 3,4, 5,6); +ctx.transform(-2,1, 3/2,-1/2, 1,-2); +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.html new file mode 100644 index 00000000000..2071c73d8f1 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.transform.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.transform.nonfinite</h1> +<p class="desc">transform() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("transform() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.transform(Infinity, 0, 0, 0, 0, 0); +ctx.transform(-Infinity, 0, 0, 0, 0, 0); +ctx.transform(NaN, 0, 0, 0, 0, 0); +ctx.transform(0, Infinity, 0, 0, 0, 0); +ctx.transform(0, -Infinity, 0, 0, 0, 0); +ctx.transform(0, NaN, 0, 0, 0, 0); +ctx.transform(0, 0, Infinity, 0, 0, 0); +ctx.transform(0, 0, -Infinity, 0, 0, 0); +ctx.transform(0, 0, NaN, 0, 0, 0); +ctx.transform(0, 0, 0, Infinity, 0, 0); +ctx.transform(0, 0, 0, -Infinity, 0, 0); +ctx.transform(0, 0, 0, NaN, 0, 0); +ctx.transform(0, 0, 0, 0, Infinity, 0); +ctx.transform(0, 0, 0, 0, -Infinity, 0); +ctx.transform(0, 0, 0, 0, NaN, 0); +ctx.transform(0, 0, 0, 0, 0, Infinity); +ctx.transform(0, 0, 0, 0, 0, -Infinity); +ctx.transform(0, 0, 0, 0, 0, NaN); +ctx.transform(Infinity, Infinity, 0, 0, 0, 0); +ctx.transform(Infinity, Infinity, Infinity, 0, 0, 0); +ctx.transform(Infinity, Infinity, Infinity, Infinity, 0, 0); +ctx.transform(Infinity, Infinity, Infinity, Infinity, Infinity, 0); +ctx.transform(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.transform(Infinity, Infinity, Infinity, Infinity, 0, Infinity); +ctx.transform(Infinity, Infinity, Infinity, 0, Infinity, 0); +ctx.transform(Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.transform(Infinity, Infinity, Infinity, 0, 0, Infinity); +ctx.transform(Infinity, Infinity, 0, Infinity, 0, 0); +ctx.transform(Infinity, Infinity, 0, Infinity, Infinity, 0); +ctx.transform(Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.transform(Infinity, Infinity, 0, Infinity, 0, Infinity); +ctx.transform(Infinity, Infinity, 0, 0, Infinity, 0); +ctx.transform(Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.transform(Infinity, Infinity, 0, 0, 0, Infinity); +ctx.transform(Infinity, 0, Infinity, 0, 0, 0); +ctx.transform(Infinity, 0, Infinity, Infinity, 0, 0); +ctx.transform(Infinity, 0, Infinity, Infinity, Infinity, 0); +ctx.transform(Infinity, 0, Infinity, Infinity, Infinity, Infinity); +ctx.transform(Infinity, 0, Infinity, Infinity, 0, Infinity); +ctx.transform(Infinity, 0, Infinity, 0, Infinity, 0); +ctx.transform(Infinity, 0, Infinity, 0, Infinity, Infinity); +ctx.transform(Infinity, 0, Infinity, 0, 0, Infinity); +ctx.transform(Infinity, 0, 0, Infinity, 0, 0); +ctx.transform(Infinity, 0, 0, Infinity, Infinity, 0); +ctx.transform(Infinity, 0, 0, Infinity, Infinity, Infinity); +ctx.transform(Infinity, 0, 0, Infinity, 0, Infinity); +ctx.transform(Infinity, 0, 0, 0, Infinity, 0); +ctx.transform(Infinity, 0, 0, 0, Infinity, Infinity); +ctx.transform(Infinity, 0, 0, 0, 0, Infinity); +ctx.transform(0, Infinity, Infinity, 0, 0, 0); +ctx.transform(0, Infinity, Infinity, Infinity, 0, 0); +ctx.transform(0, Infinity, Infinity, Infinity, Infinity, 0); +ctx.transform(0, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.transform(0, Infinity, Infinity, Infinity, 0, Infinity); +ctx.transform(0, Infinity, Infinity, 0, Infinity, 0); +ctx.transform(0, Infinity, Infinity, 0, Infinity, Infinity); +ctx.transform(0, Infinity, Infinity, 0, 0, Infinity); +ctx.transform(0, Infinity, 0, Infinity, 0, 0); +ctx.transform(0, Infinity, 0, Infinity, Infinity, 0); +ctx.transform(0, Infinity, 0, Infinity, Infinity, Infinity); +ctx.transform(0, Infinity, 0, Infinity, 0, Infinity); +ctx.transform(0, Infinity, 0, 0, Infinity, 0); +ctx.transform(0, Infinity, 0, 0, Infinity, Infinity); +ctx.transform(0, Infinity, 0, 0, 0, Infinity); +ctx.transform(0, 0, Infinity, Infinity, 0, 0); +ctx.transform(0, 0, Infinity, Infinity, Infinity, 0); +ctx.transform(0, 0, Infinity, Infinity, Infinity, Infinity); +ctx.transform(0, 0, Infinity, Infinity, 0, Infinity); +ctx.transform(0, 0, Infinity, 0, Infinity, 0); +ctx.transform(0, 0, Infinity, 0, Infinity, Infinity); +ctx.transform(0, 0, Infinity, 0, 0, Infinity); +ctx.transform(0, 0, 0, Infinity, Infinity, 0); +ctx.transform(0, 0, 0, Infinity, Infinity, Infinity); +ctx.transform(0, 0, 0, Infinity, 0, Infinity); +ctx.transform(0, 0, 0, 0, Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.worker.js new file mode 100644 index 00000000000..1ee3659628c --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.nonfinite.worker.js @@ -0,0 +1,100 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.transform.nonfinite +// Description:transform() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("transform() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.transform(Infinity, 0, 0, 0, 0, 0); +ctx.transform(-Infinity, 0, 0, 0, 0, 0); +ctx.transform(NaN, 0, 0, 0, 0, 0); +ctx.transform(0, Infinity, 0, 0, 0, 0); +ctx.transform(0, -Infinity, 0, 0, 0, 0); +ctx.transform(0, NaN, 0, 0, 0, 0); +ctx.transform(0, 0, Infinity, 0, 0, 0); +ctx.transform(0, 0, -Infinity, 0, 0, 0); +ctx.transform(0, 0, NaN, 0, 0, 0); +ctx.transform(0, 0, 0, Infinity, 0, 0); +ctx.transform(0, 0, 0, -Infinity, 0, 0); +ctx.transform(0, 0, 0, NaN, 0, 0); +ctx.transform(0, 0, 0, 0, Infinity, 0); +ctx.transform(0, 0, 0, 0, -Infinity, 0); +ctx.transform(0, 0, 0, 0, NaN, 0); +ctx.transform(0, 0, 0, 0, 0, Infinity); +ctx.transform(0, 0, 0, 0, 0, -Infinity); +ctx.transform(0, 0, 0, 0, 0, NaN); +ctx.transform(Infinity, Infinity, 0, 0, 0, 0); +ctx.transform(Infinity, Infinity, Infinity, 0, 0, 0); +ctx.transform(Infinity, Infinity, Infinity, Infinity, 0, 0); +ctx.transform(Infinity, Infinity, Infinity, Infinity, Infinity, 0); +ctx.transform(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.transform(Infinity, Infinity, Infinity, Infinity, 0, Infinity); +ctx.transform(Infinity, Infinity, Infinity, 0, Infinity, 0); +ctx.transform(Infinity, Infinity, Infinity, 0, Infinity, Infinity); +ctx.transform(Infinity, Infinity, Infinity, 0, 0, Infinity); +ctx.transform(Infinity, Infinity, 0, Infinity, 0, 0); +ctx.transform(Infinity, Infinity, 0, Infinity, Infinity, 0); +ctx.transform(Infinity, Infinity, 0, Infinity, Infinity, Infinity); +ctx.transform(Infinity, Infinity, 0, Infinity, 0, Infinity); +ctx.transform(Infinity, Infinity, 0, 0, Infinity, 0); +ctx.transform(Infinity, Infinity, 0, 0, Infinity, Infinity); +ctx.transform(Infinity, Infinity, 0, 0, 0, Infinity); +ctx.transform(Infinity, 0, Infinity, 0, 0, 0); +ctx.transform(Infinity, 0, Infinity, Infinity, 0, 0); +ctx.transform(Infinity, 0, Infinity, Infinity, Infinity, 0); +ctx.transform(Infinity, 0, Infinity, Infinity, Infinity, Infinity); +ctx.transform(Infinity, 0, Infinity, Infinity, 0, Infinity); +ctx.transform(Infinity, 0, Infinity, 0, Infinity, 0); +ctx.transform(Infinity, 0, Infinity, 0, Infinity, Infinity); +ctx.transform(Infinity, 0, Infinity, 0, 0, Infinity); +ctx.transform(Infinity, 0, 0, Infinity, 0, 0); +ctx.transform(Infinity, 0, 0, Infinity, Infinity, 0); +ctx.transform(Infinity, 0, 0, Infinity, Infinity, Infinity); +ctx.transform(Infinity, 0, 0, Infinity, 0, Infinity); +ctx.transform(Infinity, 0, 0, 0, Infinity, 0); +ctx.transform(Infinity, 0, 0, 0, Infinity, Infinity); +ctx.transform(Infinity, 0, 0, 0, 0, Infinity); +ctx.transform(0, Infinity, Infinity, 0, 0, 0); +ctx.transform(0, Infinity, Infinity, Infinity, 0, 0); +ctx.transform(0, Infinity, Infinity, Infinity, Infinity, 0); +ctx.transform(0, Infinity, Infinity, Infinity, Infinity, Infinity); +ctx.transform(0, Infinity, Infinity, Infinity, 0, Infinity); +ctx.transform(0, Infinity, Infinity, 0, Infinity, 0); +ctx.transform(0, Infinity, Infinity, 0, Infinity, Infinity); +ctx.transform(0, Infinity, Infinity, 0, 0, Infinity); +ctx.transform(0, Infinity, 0, Infinity, 0, 0); +ctx.transform(0, Infinity, 0, Infinity, Infinity, 0); +ctx.transform(0, Infinity, 0, Infinity, Infinity, Infinity); +ctx.transform(0, Infinity, 0, Infinity, 0, Infinity); +ctx.transform(0, Infinity, 0, 0, Infinity, 0); +ctx.transform(0, Infinity, 0, 0, Infinity, Infinity); +ctx.transform(0, Infinity, 0, 0, 0, Infinity); +ctx.transform(0, 0, Infinity, Infinity, 0, 0); +ctx.transform(0, 0, Infinity, Infinity, Infinity, 0); +ctx.transform(0, 0, Infinity, Infinity, Infinity, Infinity); +ctx.transform(0, 0, Infinity, Infinity, 0, Infinity); +ctx.transform(0, 0, Infinity, 0, Infinity, 0); +ctx.transform(0, 0, Infinity, 0, Infinity, Infinity); +ctx.transform(0, 0, Infinity, 0, 0, Infinity); +ctx.transform(0, 0, 0, Infinity, Infinity, 0); +ctx.transform(0, 0, 0, Infinity, Infinity, Infinity); +ctx.transform(0, 0, 0, Infinity, 0, Infinity); +ctx.transform(0, 0, 0, 0, Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.skewed.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.skewed.html new file mode 100644 index 00000000000..83769e03446 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.skewed.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.transform.skewed</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.transform.skewed</h1> +<p class="desc">transform() with skewy matrix transforms correctly</p> + + +<script> +var t = async_test("transform() with skewy matrix transforms correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Create green with a red square ring inside it +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(20, 10, 60, 30); +ctx.fillStyle = '#0f0'; +ctx.fillRect(40, 20, 20, 10); +// Draw a skewed shape to fill that gap, to make sure it is aligned correctly +ctx.transform(1,4, 2,3, 5,6); +// Post-transform coordinates: +// [[20,10],[80,10],[80,40],[20,40],[20,10],[40,20],[40,30],[60,30],[60,20],[40,20],[20,10]]; +// Hence pre-transform coordinates: +var pts=[[-7.4,11.2],[-43.4,59.2],[-31.4,53.2],[4.6,5.2],[-7.4,11.2], + [-15.4,25.2],[-11.4,23.2],[-23.4,39.2],[-27.4,41.2],[-15.4,25.2], + [-7.4,11.2]]; +ctx.beginPath(); +ctx.moveTo(pts[0][0], pts[0][1]); +for (var i = 0; i < pts.length; ++i) + ctx.lineTo(pts[i][0], pts[i][1]); +ctx.fill(); +_assertPixel(offscreenCanvas, 21,11, 0,255,0,255, "21,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,11, 0,255,0,255, "79,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,39, 0,255,0,255, "21,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,39, 0,255,0,255, "79,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,19, 0,255,0,255, "39,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,19, 0,255,0,255, "61,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,31, 0,255,0,255, "39,31", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,31, 0,255,0,255, "61,31", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.skewed.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.skewed.worker.js new file mode 100644 index 00000000000..b8ae83fda7d --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.transform.skewed.worker.js @@ -0,0 +1,47 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.transform.skewed +// Description:transform() with skewy matrix transforms correctly +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("transform() with skewy matrix transforms correctly"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +// Create green with a red square ring inside it +ctx.fillStyle = '#0f0'; +ctx.fillRect(0, 0, 100, 50); +ctx.fillStyle = '#f00'; +ctx.fillRect(20, 10, 60, 30); +ctx.fillStyle = '#0f0'; +ctx.fillRect(40, 20, 20, 10); +// Draw a skewed shape to fill that gap, to make sure it is aligned correctly +ctx.transform(1,4, 2,3, 5,6); +// Post-transform coordinates: +// [[20,10],[80,10],[80,40],[20,40],[20,10],[40,20],[40,30],[60,30],[60,20],[40,20],[20,10]]; +// Hence pre-transform coordinates: +var pts=[[-7.4,11.2],[-43.4,59.2],[-31.4,53.2],[4.6,5.2],[-7.4,11.2], + [-15.4,25.2],[-11.4,23.2],[-23.4,39.2],[-27.4,41.2],[-15.4,25.2], + [-7.4,11.2]]; +ctx.beginPath(); +ctx.moveTo(pts[0][0], pts[0][1]); +for (var i = 0; i < pts.length; ++i) + ctx.lineTo(pts[i][0], pts[i][1]); +ctx.fill(); +_assertPixel(offscreenCanvas, 21,11, 0,255,0,255, "21,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,11, 0,255,0,255, "79,11", "0,255,0,255"); +_assertPixel(offscreenCanvas, 21,39, 0,255,0,255, "21,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 79,39, 0,255,0,255, "79,39", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,19, 0,255,0,255, "39,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,19, 0,255,0,255, "61,19", "0,255,0,255"); +_assertPixel(offscreenCanvas, 39,31, 0,255,0,255, "39,31", "0,255,0,255"); +_assertPixel(offscreenCanvas, 61,31, 0,255,0,255, "61,31", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.basic.html new file mode 100644 index 00000000000..2978be81495 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.basic.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.translate.basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.translate.basic</h1> +<p class="desc">translate() works</p> + + +<script> +var t = async_test("translate() works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 90,40, 0,255,0,255, "90,40", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.basic.worker.js new file mode 100644 index 00000000000..e019abb25a5 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.basic.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.translate.basic +// Description:translate() works +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("translate() works"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 50); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -50, 100, 50); +_assertPixel(offscreenCanvas, 90,40, 0,255,0,255, "90,40", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.html b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.html new file mode 100644 index 00000000000..0a90f725b34 --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.transformation.translate.nonfinite</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.transformation.translate.nonfinite</h1> +<p class="desc">translate() with Infinity/NaN is ignored</p> + + +<script> +var t = async_test("translate() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.translate(Infinity, 0.1); +ctx.translate(-Infinity, 0.1); +ctx.translate(NaN, 0.1); +ctx.translate(0.1, Infinity); +ctx.translate(0.1, -Infinity); +ctx.translate(0.1, NaN); +ctx.translate(Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +</script> diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.worker.js new file mode 100644 index 00000000000..ea26178151f --- /dev/null +++ b/tests/wpt/web-platform-tests/offscreen-canvas/transformations/2d.transformation.translate.nonfinite.worker.js @@ -0,0 +1,32 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.transformation.translate.nonfinite +// Description:translate() with Infinity/NaN is ignored +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("translate() with Infinity/NaN is ignored"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.fillStyle = '#f00'; +ctx.fillRect(0, 0, 100, 50); +ctx.translate(100, 10); +ctx.translate(Infinity, 0.1); +ctx.translate(-Infinity, 0.1); +ctx.translate(NaN, 0.1); +ctx.translate(0.1, Infinity); +ctx.translate(0.1, -Infinity); +ctx.translate(0.1, NaN); +ctx.translate(Infinity, Infinity); +ctx.fillStyle = '#0f0'; +ctx.fillRect(-100, -10, 100, 50); +_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); + +t.done(); + +}); +done(); diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html new file mode 100644 index 00000000000..fbb80e3fe76 --- /dev/null +++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html @@ -0,0 +1,26 @@ +<!doctype html> +<title>PaymentRequest <iframe allowpaymentrequest> in non-active document (cross-origin)</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/common/utils.js></script> +<iframe id="iframe" allowpaymentrequest></iframe> +<script> +async_test((t) => { + const iframe = document.getElementById('iframe'); + const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}]; + + onload = () => { + const win = window[0]; + const grabbedPaymentRequest = win.PaymentRequest; + win.location.href = make_absolute_url({ + hostname: '{{domains[www1]}}', + path: '/common/blank.html' + }); + iframe.onload = t.step_func_done(() => { + assert_throws({name: 'SecurityError'}, () => { + new grabbedPaymentRequest(...paymentArgs); + }); + }); + } +}); +</script> diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html new file mode 100644 index 00000000000..69a738ad4c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html @@ -0,0 +1,22 @@ +<!doctype html> +<title>PaymentRequest <iframe allowpaymentrequest> in non-active document (same-origin)</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<iframe id="iframe" allowpaymentrequest></iframe> +<script> +async_test((t) => { + const iframe = document.getElementById('iframe'); + const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}]; + + onload = () => { + const win = window[0]; + const grabbedPaymentRequest = win.PaymentRequest; + win.location.href = '/common/blank.html'; + iframe.onload = t.step_func_done(() => { + assert_throws({name: 'SecurityError'}, () => { + new grabbedPaymentRequest(...paymentArgs); + }); + }); + } +}); +</script> diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html new file mode 100644 index 00000000000..841880ef94f --- /dev/null +++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html @@ -0,0 +1,14 @@ +<!doctype html> +<title>PaymentRequest <iframe allowpaymentrequest> basic</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<iframe id="iframe" allowpaymentrequest></iframe> +<script> +async_test((t) => { + const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}]; + + onload = t.step_func_done(() => { + new window[0].PaymentRequest(...paymentArgs); + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/pointerevents/idlharness.html b/tests/wpt/web-platform-tests/pointerevents/idlharness.html new file mode 100644 index 00000000000..a4ba4c35f5b --- /dev/null +++ b/tests/wpt/web-platform-tests/pointerevents/idlharness.html @@ -0,0 +1,104 @@ +<!doctype html> +<meta charset=utf-8> +<title>idlharness test</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> + +<pre id='untested_idl' style='display:none'> +[PrimaryGlobal] +interface Window { +}; + +[TreatNonObjectAsNull] +callback EventHandlerNonNull = any (Event event); +typedef EventHandlerNonNull? EventHandler; + +[NoInterfaceObject] +interface GlobalEventHandlers { +}; +Window implements GlobalEventHandlers; + +interface Navigator { +}; + +interface Element { +}; + +interface HTMLElement : Element { +}; +HTMLElement implements GlobalEventHandlers; + +interface Document { +}; +Document implements GlobalEventHandlers; + +interface MouseEvent { +}; + +</pre> + +<pre id='idl'> +dictionary PointerEventInit : MouseEventInit { + long pointerId = 0; + double width = 1; + double height = 1; + float pressure = 0; + float tangentialPressure = 0; + long tiltX = 0; + long tiltY = 0; + long twist = 0; + DOMString pointerType = ""; + boolean isPrimary = false; +}; + +[Constructor(DOMString type, optional PointerEventInit eventInitDict)] +interface PointerEvent : MouseEvent { + readonly attribute long pointerId; + readonly attribute double width; + readonly attribute double height; + readonly attribute float pressure; + readonly attribute float tangentialPressure; + readonly attribute long tiltX; + readonly attribute long tiltY; + readonly attribute long twist; + readonly attribute DOMString pointerType; + readonly attribute boolean isPrimary; +}; + +partial interface Element { + void setPointerCapture(long pointerId); + void releasePointerCapture(long pointerId); + boolean hasPointerCapture(long pointerId); +}; + +partial interface GlobalEventHandlers { + attribute EventHandler ongotpointercapture; + attribute EventHandler onlostpointercapture; + attribute EventHandler onpointerdown; + attribute EventHandler onpointermove; + attribute EventHandler onpointerup; + attribute EventHandler onpointercancel; + attribute EventHandler onpointerover; + attribute EventHandler onpointerout; + attribute EventHandler onpointerenter; + attribute EventHandler onpointerleave; +}; + +partial interface Navigator { + readonly attribute long maxTouchPoints; +}; +</pre> +<script> + var idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById("untested_idl").textContent); + idl_array.add_idls(document.getElementById("idl").textContent); + + // Note that I don't bother including Document here because there are still + // a bunch of differences between browsers around Document vs HTMLDocument. + idl_array.add_objects({ + Window: ["window"], + Navigator: ["navigator"]}); + idl_array.test(); +</script> diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_boundary_events_in_capturing-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_boundary_events_in_capturing-manual.html new file mode 100644 index 00000000000..0de4d55ed13 --- /dev/null +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_boundary_events_in_capturing-manual.html @@ -0,0 +1,97 @@ +<!doctype html> +<html> + <head> + <title>Pointer Events boundary events in capturing tests</title> + <meta name="viewport" content="width=device-width"> + <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <!-- Additional helper script for common checks across event types --> + <script type="text/javascript" src="pointerevent_support.js"></script> + <script> + var detected_pointertypes = {}; + var eventList = All_Pointer_Events; + PhaseEnum = { + WaitingForDown: "down", + WaitingForFirstMove: "firstMove", + WaitingForSecondMove: "secondMove", + WaitingForUp: "up" + } + var phase = PhaseEnum.WaitingForDown; + var eventsRecieved = []; + + function resetTestState() { + eventsRecieved = []; + phase = PhaseEnum.WaitingForDown; + } + function run() { + var test_pointerEvent = setup_pointerevent_test("pointerevent boundary events in capturing", ALL_POINTERS); + var target = document.getElementById("target0"); + var listener = document.getElementById("listener"); + + eventList.forEach(function(eventName) { + on_event(target, eventName, function (event) { + if (phase == PhaseEnum.WaitingForDown) { + if (eventName == 'pointerdown') { + listener.setPointerCapture(event.pointerId); + phase = PhaseEnum.WaitingForFirstMove; + } + } else if (phase == PhaseEnum.WaitingForUp) { + if (event.type == 'pointerup') + test_pointerEvent.done(); + } else { + eventsRecieved.push(event.type + '@target'); + if (phase == PhaseEnum.WaitingForSecondMove && event.type == 'pointermove') { + test(function () { + checkPointerEventType(event); + assert_array_equals(eventsRecieved, ['lostpointercapture@listener', 'pointerout@listener', 'pointerleave@listener', 'pointerover@target', 'pointerenter@target', 'pointermove@target'], + 'lostpointercapture and pointerout/leave should be dispatched to the capturing target and pointerover/enter should be dispatched to the hit-test element before the first pointermove event after releasing pointer capture'); + }, expectedPointerType + " pointer events boundary events when releasing capture"); + phase = PhaseEnum.WaitingForUp; + } + } + }); + on_event(listener, eventName, function (event) { + if (phase == PhaseEnum.WaitingForDown) + return; + eventsRecieved.push(event.type + '@listener'); + if (phase == PhaseEnum.WaitingForFirstMove && eventName == 'pointermove') { + test(function () { + checkPointerEventType(event); + assert_array_equals(eventsRecieved, ['pointerout@target', 'pointerleave@target', 'pointerover@listener', 'pointerenter@listener', 'gotpointercapture@listener', 'pointermove@listener'], + 'pointerout/leave should be dispatched to the previous target and pointerover/enter and gotpointercapture should be dispatched to the capturing element before the first captured pointermove event'); + }, expectedPointerType + " pointer events boundary events when receiving capture"); + listener.releasePointerCapture(event.pointerId); + eventsRecieved = []; + phase = PhaseEnum.WaitingForSecondMove; + } + }); + }); + } + </script> + </head> + <body onload="run()"> + <h1>Pointer Events boundary events in capturing</h1> + <h2 id="pointerTypeDescription"></h2> + <h4> + Test Description: This test checks the boundary events of pointer events while the capturing changes. If you are using hoverable pen don't leave the range of digitizer while doing the instructions. + <ol> + <li>Move your pointer over the black square</li> + <li>Press down the pointer (i.e. press left button with mouse or touch the screen with finger or pen).</li> + <li>Drag the pointer within the black square.</li> + <li>Release the pointer.</li> + </ol> + + Test passes if the proper behavior of the events is observed. + </h4> + <div id="target0" class="touchActionNone"> + </div> + <div id="listener">Do not hover over or touch this element. </div> + <div id="complete-notice"> + <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> + <p>Refresh the page to run the tests again with a different pointer type.</p> + </div> + <div id="log"></div> + </body> +</html> + diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html deleted file mode 100644 index 754a58facfd..00000000000 --- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html +++ /dev/null @@ -1,97 +0,0 @@ -<!doctype html> -<html> - <head> - <title>Pointer Event: gotpiontercapture is fired first and asynchronously.</title> - <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> - <link rel="author" title="Microsoft" href="http://www.microsoft.com/" /> - <meta name="assert" content="After setting capture, the gotpointercapture dispatched to the capturing element before any other event is fired." /> - <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> - <!-- /resources/testharness.js --> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <!-- Additional helper script for common checks across event types --> - <script type="text/javascript" src="pointerevent_support.js"></script> - <script type="text/javascript"> - var detected_pointertypes = {}; - var test_pointerEvent = async_test("gotpointercapture event"); // set up test harness - // showPointerTypes is defined in pointerevent_support.js - // Requirements: the callback function will reference the test_pointerEvent object and - // will fail unless the async_test is created with the var name "test_pointerEvent". - add_completion_callback(showPointerTypes); - - var target0; - var listener; - var pointerdown_event; - var detected_pointerEvents = new Array(); - var eventRcvd = false; - var isWaiting = false; - - - function run() { - target0 = document.getElementById("target0"); - target0.style["touchAction"] = "none"; - listener = document.getElementById("listener"); - - // listen to all events - for (var i = 0; i < All_Pointer_Events.length; i++) { - on_event(listener, All_Pointer_Events[i], function (event) { - if (event.type == "gotpointercapture") { - check_PointerEvent(event); - - // TA: 10.2 - assert_true(isWaiting, "gotpointercapture must be fired asynchronously"); - isWaiting = false; - - // if any events have been received with same pointerId before gotpointercapture, then fail - var eventsRcvd_str = ""; - if (eventRcvd) { - eventsRcvd_str = "Events received before gotpointercapture: "; - for (var i = 0; i < detected_pointerEvents.length; i++) { - eventsRcvd_str += detected_pointerEvents[i] + ", "; - } - } - test_pointerEvent.step(function () { - assert_false(eventRcvd, "no other events should be received before gotpointercapture." + eventsRcvd_str); - assert_equals(event.pointerId, pointerdown_event.pointerId, "pointerID is same for pointerdown and gotpointercapture"); - }); - } - else { - if (pointerdown_event.pointerId === event.pointerId) { - assert_false(isWaiting, event.type + " must be fired after gotpointercapture"); - detected_pointerEvents.push(event.type); - eventRcvd = true; - test_pointerEvent.done(); // complete test - } - } - }); - } - - // set pointer capture - on_event(target0, "pointerdown", function (event) { - detected_pointertypes[event.pointerType] = true; - pointerdown_event = event; - listener.setPointerCapture(event.pointerId); - isWaiting = true; - }); - } - </script> - </head> - <body onload="run()"> - <h1>Pointer Event: Dispatch gotpointercapture event</h1> - <h4>Test Description: - After pointer capture is set for a pointer, and prior to dispatching the first event for the pointer, the gotpointercapture - event must be dispatched to the element that is receiving the pointer capture. The gotpointercapture event must be dispatched asynchronously. - </h4> - <br /> - <div id="target0"> - Use the mouse, touch or pen to tap/click this box. - </div> - <div id="listener">Do not hover over or touch this element. </div> - <div id="complete-notice"> - <p>Test complete: Scroll to Summary to view Pass/Fail Results.</p> - <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> - <p>Refresh the page to run the tests again with a different pointer type.</p> - </div> - <div id="log"></div> - </body> -</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_on_event_handlers.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_on_event_handlers.html new file mode 100644 index 00000000000..268952e41c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_on_event_handlers.html @@ -0,0 +1,67 @@ +<!doctype html> +<html> + <head> + <title>PointerEvent: Constructor test</title> + <meta name="viewport" content="width=device-width"> + <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <!-- Additional helper script for common checks across event types --> + <script type="text/javascript" src="pointerevent_support.js"></script> + </head> + <body> + <h1>PointerEvent: Dispatch custom event</h1> + <h4>Test Description: This test checks if on pointer event handlers through attributes works properly using synthetic pointerevents. For valid results, this test must be run without generating real (trusted) events on the black rectangle below.</h4> + <div id="target0" + onpointercancel="window.eventHappened = 'pointercancel';" + onpointerdown="window.eventHappened = 'pointerdown';" + onpointerup="window.eventHappened = 'pointerup';" + onpointermove="window.eventHappened = 'pointermove';" + onpointerout="window.eventHappened = 'pointerout';" + onpointerover="window.eventHappened = 'pointerover';" + onpointerleave="window.eventHappened = 'pointerleave';" + onpointerenter="window.eventHappened = 'pointerenter';" + ongotpointercapture="window.eventHappened = 'gotpointercapture';" + onlostpointercapture="window.eventHappened = 'lostpointercapture';" + ></div> + <script> + window.eventHappened = ''; + + All_Pointer_Events.forEach(function(event) { + var on_event = "on" + event; + + test(function() { + const htmlElement = document.createElement("span"); + const svgElement = document.createElementNS("http://www.w3.org/2000/svg", "g"); + for (const location of [window, htmlElement, svgElement, document]) { + assert_equals(location[on_event], null, + `The default value of the property is null for a ${location.constructor.name} instance`); + } + }, "The default value of " + on_event + " is always null"); + + test(function() { + window.eventHappened = ''; + const element = document.querySelector("#target0"); + const compiledHandler = element[on_event]; + assert_equals(typeof compiledHandler, "function", "The " + on_event + " property must be a function"); + compiledHandler(); + assert_equals(window.eventHappened, event, "Calling the handler must run the code"); + }, "The " + on_event + " content attribute must be compiled into the " + on_event + " property"); + + var handlerTest = async_test("dispatching a " + event + " event must trigger element." + on_event); + const element = document.createElement("meta"); + element[on_event] = function(e) { + handlerTest.step(function() { + assert_equals(e.currentTarget, element, "The event must be fired at the <meta> element"); + }); + handlerTest.done(); + }; + element.dispatchEvent(new Event(event)); + }); + </script> + <div id="complete-notice"> + <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> + </div> + <div id="log"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_sequence_at_implicit_release_on_click-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_sequence_at_implicit_release_on_click-manual.html new file mode 100644 index 00000000000..274f9a435b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_sequence_at_implicit_release_on_click-manual.html @@ -0,0 +1,83 @@ +<!doctype html> +<html> + <head> + <title>Pointer Event: Event sequence at implicit release on click</title> + <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/> + <link rel="author" title="Google" href="http://www.google.com "/> + <meta name="assert" content="When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event."/> + <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script type="text/javascript" src="pointerevent_support.js"></script> + <script type="text/javascript"> + var detected_pointertypes = {}; + var event_log = []; + var start_logging = false; + + function resetTestState() { + detected_eventTypes = {}; + event_log = []; + start_logging = false; + } + + function run() { + var test_pointer_event = setup_pointerevent_test("Event sequence at implicit release on click", ALL_POINTERS); + + on_event(document.getElementById("done"), "click", function() { + test_pointer_event.step(function () { + var expected_events = "pointerup, lostpointercapture, pointerout, pointerleave"; + assert_equals(event_log.join(", "), expected_events); + }); + test_pointer_event.done(); + }); + + var target = document.getElementById("target"); + + All_Pointer_Events.forEach(function(eventName) { + on_event(target, eventName, function (event) { + detected_pointertypes[event.pointerType] = true; + + if (event.type == "pointerdown") { + event.target.setPointerCapture(event.pointerId); + + } else if (event.type == "gotpointercapture") { + start_logging = true; + + } else if (event.type != "pointermove" && start_logging) { + event_log.push(event.type); + } + }); + }); + } + </script> + <style> + #target { + margin: 20px; + background-color: black; + } + + #done { + margin: 20px; + background-color: green; + } + </style> + </head> + <body onload="run()"> + <h1>Pointer Event: Event sequence at implicit release on click<h1> + <h2 id="pointerTypeDescription"></h2> + <h4> + When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event. + </h4> + <ol> + <li>Click or tap on Black.</li> + <li>Click or tap on Green.</li> + </ol> + <div id="target"></div> + <div id="done"></div> + <div id="complete-notice"> + <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> + <p>The following events were logged: <span id="event-log"></span>.</p> + </div> + <div id="log"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_sequence_at_implicit_release_on_drag-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_sequence_at_implicit_release_on_drag-manual.html new file mode 100644 index 00000000000..7b8e39b94d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_sequence_at_implicit_release_on_drag-manual.html @@ -0,0 +1,84 @@ +<!doctype html> +<html> + <head> + <title>Pointer Event: Event sequence at implicit release on drag</title> + <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/> + <link rel="author" title="Google" href="http://www.google.com "/> + <meta name="assert" content="When a captured pointer is implicitly released after a drag, the boundary events should follow the lostpointercapture event."/> + <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script type="text/javascript" src="pointerevent_support.js"></script> + <script type="text/javascript"> + var detected_pointertypes = {}; + var event_log = []; + var start_logging = false; + + function resetTestState() { + detected_eventTypes = {}; + event_log = []; + start_logging = false; + } + + function run() { + var test_pointer_event = setup_pointerevent_test("Event sequence at implicit release on drag", ["touch"]); + + on_event(document.getElementById("done"), "click", function() { + test_pointer_event.step(function () { + var expected_events = "pointercancel, lostpointercapture, pointerout, pointerleave"; + assert_equals(event_log.join(", "), expected_events); + }); + test_pointer_event.done(); + }); + + var target = document.getElementById("target"); + + All_Pointer_Events.forEach(function(eventName) { + on_event(target, eventName, function (event) { + detected_pointertypes[event.pointerType] = true; + + if (event.type == "pointerdown") { + event.target.setPointerCapture(event.pointerId); + + } else if (event.type == "gotpointercapture") { + start_logging = true; + + } else if (event.type != "pointermove" && start_logging) { + event_log.push(event.type); + } + }); + }); + } + </script> + <style> + #target { + margin: 20px; + background-color: black; + touch-action: auto; + } + + #done { + margin: 20px; + background-color: green; + } + </style> + </head> + <body onload="run()"> + <h1>Pointer Event: Event sequence at implicit release on drag<h1> + <h2 id="pointerTypeDescription"></h2> + <h4> + When a captured pointer is implicitly released after a drag, the boundary events should follow the lostpointercapture event. + </h4> + <ol> + <li>Drag quickly down starting on Black.</li> + <li>Click or tap on Green.</li> + </ol> + <div id="target"></div> + <div id="done"></div> + <div id="complete-notice"> + <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> + <p>The following events were logged: <span id="event-log"></span>.</p> + </div> + <div id="log"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js index ee479c7d6ad..03332b6a7b1 100644 --- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js @@ -21,7 +21,7 @@ function check_PointerEvent(event, testNamePrefix) { if (expectedPointerType != null) { test(function () { - assert_equals(event.pointerType, expectedPointerType, "pointerType should be the same as the requested device."); + assert_equals(event.pointerType, expectedPointerType, "pointerType should be the one specified in the test page."); }, pointerTestName + " event pointerType is correct."); } @@ -201,6 +201,7 @@ function rPointerCapture(e) { var globalPointerEventTest = null; var expectedPointerType = null; +const ALL_POINTERS = ['mouse', 'touch', 'pen']; const HOVERABLE_POINTERS = ['mouse', 'pen']; const NOHOVER_POINTERS = ['touch']; @@ -225,6 +226,10 @@ MultiPointerTypeTest.prototype.done = function() { prevTest.done(); } +MultiPointerTypeTest.prototype.step = function(stepFunction) { + this.currentTest.step(stepFunction); +} + MultiPointerTypeTest.prototype.createNextTest = function() { if (this.currentTypeIndex < this.types.length) { var pointerTypeDescription = document.getElementById('pointerTypeDescription'); @@ -240,5 +245,9 @@ MultiPointerTypeTest.prototype.createNextTest = function() { function setup_pointerevent_test(testName, supportedPointerTypes) { - return globalPointerEventTest = new MultiPointerTypeTest(testName, supportedPointerTypes); + return globalPointerEventTest = new MultiPointerTypeTest(testName, supportedPointerTypes); +} + +function checkPointerEventType(event) { + assert_equals(event.pointerType, expectedPointerType, "pointerType should be the same as the requested device."); } diff --git a/tests/wpt/web-platform-tests/preload/avoid_delaying_onload_link_preload.html b/tests/wpt/web-platform-tests/preload/avoid_delaying_onload_link_preload.html new file mode 100644 index 00000000000..e92658dd267 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/avoid_delaying_onload_link_preload.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure link preload preloaded resources are not delaying onload'); +</script> +<link rel=preload href="resources/dummy.js?pipe=trickle(d5)" as=script> +<script> + window.addEventListener("load", t.step_func(function() { + assert_equals(performance.getEntriesByType("resource").length, 2); + t.done(); + })); +</script> diff --git a/tests/wpt/web-platform-tests/preload/delaying_onload_link_preload_after_discovery.html b/tests/wpt/web-platform-tests/preload/delaying_onload_link_preload_after_discovery.html new file mode 100644 index 00000000000..44a8cef9ee0 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/delaying_onload_link_preload_after_discovery.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure link preload preloaded resources are delaying onload after discovery'); +</script> +<link rel=preload href="resources/dummy.js?pipe=trickle(d5)" as=script> +<link rel=preload href="resources/square.png?pipe=trickle(d5)" as=image> +<body> +<script> + window.addEventListener("load", t.step_func(function() { + assert_equals(performance.getEntriesByType("resource").length, 4); + t.done(); + })); + var script = document.createElement("script"); + script.src = "resources/dummy.js?pipe=trickle(d5)"; + document.body.appendChild(script); + var img = new Image(); + img.src = "resources/square.png?pipe=trickle(d5)"; +</script> diff --git a/tests/wpt/web-platform-tests/preload/download_resources.html b/tests/wpt/web-platform-tests/preload/download_resources.html new file mode 100644 index 00000000000..a5f275a24b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/download_resources.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preloaded resources are downloaded'); +</script> +<link rel=preload href="resources/dummy.js" as=script> +<link rel=preload href="resources/dummy.css" as=style> +<link rel=preload href="resources/square.png" as=image> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin> +<link rel=preload href="/media/white.mp4" as=media> +<link rel=preload href="/media/sound_5.oga" as=media> +<link rel=preload href="/media/foo.vtt" as=media> +<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> +<link rel=preload href="resources/dummy.xml"> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + window.addEventListener("load", t.step_func(function() { + var entries = performance.getEntriesByType("resource"); + assert_equals(performance.getEntriesByType("resource").length, 11); + t.done(); + })); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/preload/dynamic_adding_preload.html b/tests/wpt/web-platform-tests/preload/dynamic_adding_preload.html new file mode 100644 index 00000000000..3b341b5d512 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/dynamic_adding_preload.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that a dynamically added preloaded resource is downloaded'); +</script> +<body> +<script> + t.step(function() { + var link = document.createElement("link"); + assert_true(link.relList && link.relList.supports && link.relList.supports("preload"), "relList is not defined or browser doesn't support preload."); + link.as = "script"; + link.rel = "preload"; + link.href = "resources/dummy.js"; + link.onload = t.step_func(function() { + t.step_timeout(function() { + assert_equals(performance.getEntriesByType("resource").length, 3); + t.done(); + }, 0); + }); + document.body.appendChild(link); + }); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/preload/link_header_preload.html b/tests/wpt/web-platform-tests/preload/link_header_preload.html new file mode 100644 index 00000000000..a63ffde8000 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/link_header_preload.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that Link headers preload resources'); +</script> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + window.addEventListener("load", t.step_func(function() { + var entries = performance.getEntriesByType("resource"); + assert_equals(entries.length, 6); + t.done(); + })); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/preload/link_header_preload.html.headers b/tests/wpt/web-platform-tests/preload/link_header_preload.html.headers new file mode 100644 index 00000000000..e61b22e0f7c --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/link_header_preload.html.headers @@ -0,0 +1,4 @@ +Link: </preload/resources/dummy.js>;rel=preload;as=script +Link: </preload/resources/dummy.css>;rel=preload;as=style +Link: </preload/resources/square.png>;rel=preload;as=image + diff --git a/tests/wpt/web-platform-tests/preload/link_header_preload_delay_onload.html b/tests/wpt/web-platform-tests/preload/link_header_preload_delay_onload.html new file mode 100644 index 00000000000..2ee24b802aa --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/link_header_preload_delay_onload.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that Link headers preload resources and block window.onload after resource discovery'); +</script> +<body> +<style> + #background { + width: 200px; + height: 200px; + background-image: url(resources/square.png?background); + } +</style> +<link rel="stylesheet" href="resources/dummy.css"> +<script src="resources/dummy.js"></script> +<div id="background"></div> +<script> + document.write('<img src="resources/square.png">'); + window.addEventListener("load", t.step_func(function() { + var entries = performance.getEntriesByType("resource"); + var found_background_first = false; + for (var i = 0; i < entries.length; ++i) { + var entry = entries[i]; + if (entry.name.indexOf("square") != -1) { + if (entry.name.indexOf("background") != -1) + found_background_first = true; + } + } + assert_true(found_background_first); + assert_equals(entries.length, 6); + t.done(); + })); +</script> diff --git a/tests/wpt/web-platform-tests/preload/link_header_preload_delay_onload.html.headers b/tests/wpt/web-platform-tests/preload/link_header_preload_delay_onload.html.headers new file mode 100644 index 00000000000..6dad172ff05 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/link_header_preload_delay_onload.html.headers @@ -0,0 +1,5 @@ +Link: </preload/resources/square.png?background>;rel=preload;as=image +Link: </preload/resources/dummy.js>;rel=preload;as=script +Link: </preload/resources/dummy.css>;rel=preload;as=style +Link: </preload/resources/square.png>;rel=preload;as=image + diff --git a/tests/wpt/web-platform-tests/preload/onerror_event.html b/tests/wpt/web-platform-tests/preload/onerror_event.html new file mode 100644 index 00000000000..cb2d9ff84cc --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/onerror_event.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html> +<head></head> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preloaded resources trigger the onerror event'); + var scriptFailed = false; + var styleFailed = false; + var imageFailed = false; + var fontFailed = false; + var videoFailed = false; + var audioFailed = false; + var trackFailed = false; + var gibberishFailed = false; + var noTypeFailed = false; +</script> +<link rel=preload href="non-existent/dummy.js" as=script onerror="scriptFailed = true;"> +<link rel=preload href="non-existent/dummy.css" as=style onerror="styleFailed = true;"> +<link rel=preload href="non-existent/square.png" as=image onerror="imageFailed = true;"> +<link rel=preload href="non-existent/Ahem.ttf" as=font crossorigin onerror="fontFailed = true;"> +<link rel=preload href="non-existent/test.mp4" as=video onerror="videoFailed = true;"> +<link rel=preload href="non-existent/test.oga" as=audio onerror="audioFailed = true;"> +<link rel=preload href="non-existent/security/captions.vtt" as=media onerror="trackFailed = true;"> +<link rel=preload href="non-existent/dummy.xml" as=foobarxmlthing onerror="gibberishFailed = true;"> +<link rel=preload href="non-existent/dummy.xml" onerror="noTypeFailed = true;"> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + window.onload = t.step_func(function() { + assert_true(styleFailed, "style triggered error event"); + assert_true(scriptFailed, "script triggered error event"); + assert_true(imageFailed, "image triggered error event"); + assert_true(fontFailed, "font triggered error event"); + assert_true(videoFailed, "video triggered error event"); + assert_true(audioFailed, "audio triggered error event"); + assert_true(trackFailed, "track triggered error event"); + assert_true(gibberishFailed, "gibberish as value triggered error event"); + assert_true(noTypeFailed, "empty as triggered error event"); + t.done(); + }); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/preload/onload_event.html b/tests/wpt/web-platform-tests/preload/onload_event.html new file mode 100644 index 00000000000..2f19cc2cfca --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/onload_event.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preloaded resources trigger the onload event'); + var scriptLoaded = false; + var styleLoaded = false; + var imageLoaded = false; + var fontLoaded = false; + var videoLoaded = false; + var audioLoaded = false; + var trackLoaded = false; + var gibberishLoaded = false; + var gibberishErrored = false; + var noTypeLoaded = false; +</script> +<link rel=preload href="resources/dummy.js" as=script onload="scriptLoaded = true;"> +<link rel=preload href="resources/dummy.css" as=style onload="styleLoaded = true;"> +<link rel=preload href="resources/square.png" as=image onload="imageLoaded = true;"> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin onload="fontLoaded = true;"> +<link rel=preload href="/media/white.mp4" as=media onload="videoLoaded = true;"> +<link rel=preload href="/media/sound_5.oga" as=media onload="audioLoaded = true;"> +<link rel=preload href="/media/foo.vtt" as=media onload="trackLoaded = true;"> +<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing onload="gibberishLoaded = true;" onerror="gibberishErrored = true;"> +<link rel=preload href="resources/dummy.xml" onload="noTypeLoaded = true;"> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + window.onload = t.step_func(function() { + assert_true(styleLoaded, "style triggered load event"); + assert_true(scriptLoaded, "script triggered load event"); + assert_true(imageLoaded, "image triggered load event"); + assert_true(fontLoaded, "font triggered load event"); + assert_true(videoLoaded, "video triggered load event"); + assert_true(audioLoaded, "audio triggered load event"); + assert_true(trackLoaded, "track triggered load event"); + assert_false(gibberishLoaded, "gibberish as value triggered load event"); + assert_true(gibberishErrored, "gibberish as value triggered error event"); + assert_true(noTypeLoaded, "empty as triggered load event"); + t.done(); + }); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/preload/preload-csp.sub.html b/tests/wpt/web-platform-tests/preload/preload-csp.sub.html new file mode 100644 index 00000000000..3f3b42eafa9 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/preload-csp.sub.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; font-src 'none'; style-src 'none'; img-src 'none'; media-src 'none'; connect-src 'none'"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preload requests respect CSP'); +</script> +<link rel=preload href="{{host}}:{{ports[http][1]}}/preload/resources/dummy.js" as=style> +<link rel=preload href="resources/dummy.css" as=style> +<link rel=preload href="resources/square.png" as=image> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin> +<link rel=preload href="/media/white.mp4" as=media> +<link rel=preload href="/media/sound_5.oga" as=media> +<link rel=preload href="/media/foo.vtt" as=media> +<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> +<link rel=preload href="resources/dummy.xml"> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + var assertRequestTerminated = function(url) { + var entries = performance.getEntriesByName(new URL(url, location.href).href); + assert_equals(entries.length, 0); + }; + window.onload = t.step_func(function() { + assertRequestTerminated("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js"); + assertRequestTerminated("resources/dummy.css"); + assertRequestTerminated("resources/square.png"); + assertRequestTerminated("/fonts/CanvasTest.ttf"); + assertRequestTerminated("/media/white.mp4"); + assertRequestTerminated("/media/sound_5.oga"); + assertRequestTerminated("/media/foo.vtt"); + assertRequestTerminated("resources/dummy.xml"); + t.done(); + }); +</script> + diff --git a/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html b/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html new file mode 100644 index 00000000000..76c1b53196b --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; default-src 'none'"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preload requests respect CSP'); +</script> +<link rel=preload href="{{host}}:{{ports[http][1]}}/preload/resources/dummy.js" as=style> +<link rel=preload href="resources/dummy.css" as=style> +<link rel=preload href="resources/square.png" as=image> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin> +<link rel=preload href="/media/white.mp4" as=media> +<link rel=preload href="/media/sound_5.oga" as=media> +<link rel=preload href="/media/foo.vtt" as=media> +<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> +<link rel=preload href="resources/dummy.xml"> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + var assertRequestTerminated = function(url) { + var entries = performance.getEntriesByName(new URL(url, location.href).href); + assert_equals(entries.length, 0); + }; + window.onload = t.step_func(function() { + assertRequestTerminated("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js"); + assertRequestTerminated("resources/dummy.css"); + assertRequestTerminated("resources/square.png"); + assertRequestTerminated("/fonts/CanvasTest.ttf"); + assertRequestTerminated("/media/white.mp4"); + assertRequestTerminated("/media/sound_5.oga"); + assertRequestTerminated("/media/foo.vtt"); + assertRequestTerminated("resources/dummy.xml"); + t.done(); + }); +</script> + diff --git a/tests/wpt/web-platform-tests/preload/preload_with_type.html b/tests/wpt/web-platform-tests/preload/preload_with_type.html new file mode 100644 index 00000000000..1678258ddb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/preload_with_type.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/media.js"></script> +<script> + var t = async_test('Makes sure that preloaded resources with a type attribute trigger the onload event'); + var scriptLoaded = false; + var styleLoaded = false; + var imageLoaded = false; + var fontLoaded = false; + var videoLoaded = false; + var audioLoaded = false; + var trackLoaded = false; + var gibberishLoaded = 0; + var getFormat = function(url) { + var dot = url.lastIndexOf('.'); + if (dot != -1) { + var extension = url.substring(dot + 1); + if (extension.startsWith("og")) + return "ogg"; + return extension; + } + return null; + }; + var videoURL = getVideoURI("/media/A4"); + var audioURL = getAudioURI("/media/sound_5"); + var videoFormat = getFormat(videoURL); + var audioFormat = getFormat(audioURL); +</script> +<link rel=preload href="resources/dummy.js" as=script type="text/javascript" onload="scriptLoaded = true;"> +<link rel=preload href="resources/dummy.css" as=style type="text/css" onload="styleLoaded = true;"> +<link rel=preload href="resources/square.png" as=image type="image/png" onload="imageLoaded = true;"> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font type="font/ttf" crossorigin onload="fontLoaded = true;"> +<script> + document.write('<link rel=preload href="' + videoURL + '" as=media type="video/' + videoFormat + '" onload="videoLoaded = true;">'); + document.write('<link rel=preload href="' + audioURL + '" as=media type="audio/' + audioFormat + '" onload="audioLoaded = true;">'); +</script> +<link rel=preload href="/media/foo.vtt" as=media type="text/vtt" onload="trackLoaded = true;"> +<link rel=preload href="resources/dummy.js" as=script type="application/foobar" onload="gibberishLoaded++;"> +<link rel=preload href="resources/dummy.css" as=style type="text/foobar" onload="gibberishLoaded++;"> +<link rel=preload href="resources/square.png" as=image type="image/foobar" onload="gibberishLoaded++;"> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font type="font/foobar" crossorigin onload="gibberishLoaded++;"> +<script> + document.write('<link rel=preload href="' + videoURL + '" as=media type="video/foobar" onload="gibberishLoaded++;">'); + document.write('<link rel=preload href="' + audioURL + '" as=media type="audio/foobar" onload="gibberishLoaded++;">'); +</script> +<link rel=preload href="/media/foo.vtt" as=media type="text/foobar" onload="gibberishLoaded++;"> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<script> + window.onload = t.step_func(function() { + assert_true(styleLoaded, "style triggered load event"); + assert_true(scriptLoaded, "script triggered load event"); + assert_true(imageLoaded, "image triggered load event"); + assert_true(fontLoaded, "font triggered load event"); + assert_true(videoLoaded, "video triggered load event"); + assert_true(audioLoaded, "audio triggered load event"); + assert_true(trackLoaded, "track triggered load event"); + assert_equals(gibberishLoaded, 0, "resources with gibberish type should not be loaded"); + t.done(); + }); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy.css b/tests/wpt/web-platform-tests/preload/resources/dummy.css new file mode 100644 index 00000000000..5097166a058 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/resources/dummy.css @@ -0,0 +1 @@ +/* This is just a dummy, empty CSS file */ diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy.js b/tests/wpt/web-platform-tests/preload/resources/dummy.js new file mode 100644 index 00000000000..cfcb9d89a1c --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/resources/dummy.js @@ -0,0 +1 @@ +// This is example JS content. Nothing to see here. diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy.xml b/tests/wpt/web-platform-tests/preload/resources/dummy.xml new file mode 100644 index 00000000000..0d88d0cb3ed --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/resources/dummy.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<root>Text.me</root> diff --git a/tests/wpt/web-platform-tests/preload/resources/square.png b/tests/wpt/web-platform-tests/preload/resources/square.png Binary files differnew file mode 100644 index 00000000000..01c9666a8de --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/resources/square.png diff --git a/tests/wpt/web-platform-tests/preload/single_download_late_used_preload.html b/tests/wpt/web-platform-tests/preload/single_download_late_used_preload.html new file mode 100644 index 00000000000..64e7085ce5a --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/single_download_late_used_preload.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preloaded resources are not downloaded again when used'); +</script> +<div id=result></div> +<link rel=preload href="resources/square.png" as=image> +<script> + window.addEventListener("load", t.step_func(function() { + t.step_timeout(function() { + document.getElementById("result").innerHTML = "<image src='resources/square.png'>"; + t.step_timeout(function() { + assert_equals(performance.getEntriesByType("resource").length, 3); + t.done(); + }, 1000); + }, 1000); + })); +</script> diff --git a/tests/wpt/web-platform-tests/preload/single_download_preload.html b/tests/wpt/web-platform-tests/preload/single_download_preload.html new file mode 100644 index 00000000000..0c20194b09b --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/single_download_preload.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure that preloaded resources are not downloaded again when used'); +</script> +<link rel=preload href="resources/dummy.js" as=script> +<link rel=preload href="resources/dummy.css" as=style> +<link rel=preload href="resources/square.png" as=image> +<link rel=preload href="resources/square.png?background" as=image> +<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin> +<link rel=preload href="/media/white.mp4" as=media> +<link rel=preload href="/media/sound_5.oga" as=media> +<link rel=preload href="/media/foo.vtt" as=media> +<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> +<link rel=preload href="resources/dummy.xml"> +<body> +<script src="resources/dummy.js?pipe=trickle(d5)"></script> +<style> + #background { + width: 200px; + height: 200px; + background-image: url(resources/square.png?background); + } + @font-face { + font-family:ahem; + src: url(/fonts/CanvasTest.ttf); + } + span { font-family: ahem, Arial; } +</style> +<link rel="stylesheet" href="resources/dummy.css"> +<script src="resources/dummy.js"></script> +<div id="background"></div> +<img src="resources/square.png"> +<video src="/media/white.mp4"> + <track kind=subtitles src="/media/foo.vtt" srclang=en> +</video> +<audio src="/media/sound_5.oga"></audio> +<script> + var xhr = new XMLHttpRequest(); + xhr.open("GET", "resources/dummy.xml"); + xhr.send(); + + window.addEventListener("load", t.step_func(function() { + // Audio and video show 2 extra requests as the main request is followed by a range request + assert_equals(performance.getEntriesByType("resource").length, 14); + t.done(); + })); +</script> +<span>PASS - this text is here just so that the browser will download the font.</span> diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationAvailability_onchange-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationAvailability_onchange-manual.html new file mode 100644 index 00000000000..186dbd3d9f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationAvailability_onchange-manual.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Monitoring the list of available presentation displays.</title> +<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs"> +<link rel="help" href="http://w3c.github.io/presentation-api/#monitoring-the-list-of-available-presentation-displays"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="common.js"></script> + +<p id="notice">Please wait for a moment...</p> +<p>The test passes if a "PASS" result appears.<br></p> + +<script> + // prevent the default timeout + setup({explicit_timeout: true}); + + var notice = document.getElementById('notice'); + + promise_test(function(t) { + // clean up the instruction notice when the test ends + t.add_cleanup(function() { + notice.parentNode.removeChild(notice); + }); + + // initialize a presentation request + var request = new PresentationRequest(presentationUrls); + + var availability, previousState, timeout; + + function wait() { + notice.textContent = 'Please wait for a moment... (It might take long time)'; + + // set timeout to observe the presentation availability + timeout = t.step_timeout(function() { + t.force_timeout(); + t.done(); + }, 90000); + } + + function setup() { + // save the current value of the presentation availability + previousState = availability.value; + + // show an instruction notice + notice.textContent = 'Please make your presentation displays ' + + (previousState ? 'unavailable' : 'available') + + ' and click this button: '; + var button = document.createElement('button'); + button.textContent = 'Start Monitoring'; + button.onclick = wait; + notice.appendChild(button); + } + + var check = t.step_func(function(a) { + availability = a; + setup(); + + availability.onchange = t.step_func(function(evt) { + clearTimeout(timeout); + timeout = undefined; + + // check the event and its attributes + assert_true(evt.isTrusted && !evt.bubbles && !evt.cancelable && evt instanceof Event, 'A simple event is fired.'); + assert_equals(evt.type, 'change', 'The event name is "change".'); + assert_equals(evt.target, availability, 'event.target is the presentation availability.'); + assert_not_equals(previousState, availability.value, 'Value of the presentation availability is changed.'); + setup(); + }); + + // wait until a "change" event is fired twice + var eventWatcher = new EventWatcher(t, availability, 'change'); + return eventWatcher.wait_for(['change', 'change']); + }); + + // check the change of PresentationAvailability.value twice; "true to false" and "false to true" + return request.getAvailability().then(check); + }); +</script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html index f6d912bcbc9..a4aa65e9adc 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html @@ -26,6 +26,13 @@ var request = new PresentationRequest(presentationUrls); request.start() .then(function(connection) { + + // Enable timeout again, cause no user action is needed from here. + t.step_timeout(function() { + t.force_timeout(); + t.done(); + }, 5000); + assert_true(connection instanceof PresentationConnection, 'the connection is setup'); connection.onclose = t.step_func_done(function(evt) { assert_equals(evt.type, "close"); diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html index 0d26062e8b6..3c75b969e0e 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html @@ -25,11 +25,18 @@ var request = new PresentationRequest(presentationUrls); request.start() .then(function(connection) { + + // Enable timeout again, cause no user action is needed from here. + t.step_timeout(function() { + t.force_timeout(); + t.done(); + }, 5000); + assert_true(connection instanceof PresentationConnection); connection.onconnect = t.step_func_done(function() { assert_equals(connection.state, "connected"); + connection.terminate(); }); - connection.close(); }) .catch(function(ex) { assert_unreached(ex.name + ":" + ex.message); diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html index b4f5f4e46a9..68ee6280a85 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html @@ -26,9 +26,16 @@ var request = new PresentationRequest(presentationUrls); request.start() .then(function(connection) { + + // Enable timeout again, cause no user action is needed from here. + t.step_timeout(function() { + t.force_timeout(); + t.done(); + }, 5000); + assert_true(connection instanceof PresentationConnection); - connection.onconnected = t.step_func(function(evt) { - assert_equals(evt.state, "connected"); + connection.onconnect = t.step_func(function(evt) { + assert_equals(connection.state, "connected"); connection.terminate(); }); connection.onterminate = t.step_func_done(function(evt) { diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html index 993343a58bd..23832d70f12 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html @@ -48,7 +48,7 @@ var connection = evt.connection; // check the presentation connection and its attributes assert_equals(connection.state, 'connecting', 'The initial state of the presentation connection is "connecting".'); - assert_true(!connection.id, 'The connection ID is set.'); + assert_true(!!connection.id, 'The connection ID is set.'); assert_true(typeof connection.id === 'string', 'The connection ID is a string.'); assert_true(connection instanceof PresentationConnection, 'The connection is an instance of PresentationConnection.'); }); diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html index db06cf6d86a..aca6006a8c4 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html @@ -1,72 +1,45 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>Presentation API, reconnect to presentation tests for Controlling User Agent (success - manual test)</title> +<title>Reconnect to presentation success manual test</title> <link rel="author" title="Marius Wessel" href="http://www.fokus.fraunhofer.de"> -<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent"> +<link rel="author" title="Louay Bassbouss" href="http://www.fokus.fraunhofer.de"> +<link rel="help" href="http://w3c.github.io/presentation-api/#dom-presentationrequest-reconnect"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="common.js"></script> -<ol> - <li>Start the presentation with the blue button.</li> - <li>After the presentation ist running successfully, disconnect the connected device.</li> - <li>Reconnect the device and press the green button, to start the reconnection process.</li> -</ol> - -<button id="startBtn" onclick="startPresentation()" style="background-color: #2aabd2;">Start Presentation</button> -<button id="reconnectBtn" onclick="reconnectToPresentation()" style="background-color: #5cb85c;">Reconnect Presentation - Test -</button> +<p>Click the button below to start the manual test. Select a presentation device after the selection dialog is prompted. + The test assumes that at least one presentation device is available. The test passes if a "PASS" result appears.</p> +<button id="startBtn">Start Test</button> <script> - // disable the timeout function for the tests - // and call 'done()' when the tests cases are finished. + // disable timeout for manual tests setup({explicit_timeout: true}); - - // ---------- - // DOM Object - // ---------- - var startBtn = document.getElementById("startBtn"), - reconnectBtn = document.getElementById("reconnectBtn"); - - // ------------ - // Request init - // ------------ - var request = new PresentationRequest(presentationUrls); - - - // ---------------------------------------- - // Helper Function - start the presentation - // ---------------------------------------- - var startPresentation = function () { - return request.start() - .then(function (connection) { - // save the presentation id within the - // local storage of the browser - localStorage["presId"] = connection.id; - }); - } - - // ------------------------------------------------ - // Reconnect to Presentation Test (success) - begin - // ------------------------------------------------ - var reconnectToPresentation = function () { - - promise_test(function () { - - // get the saved presentation id - // for the reconnect function if exist - if (localStorage["presId"]) var presId = localStorage["presId"]; - - return request.reconnect(presId) - .then(function (connection) { - assert_true(connection instanceof PresentationConnection); - done(); - }); - }, 'The reconnection was successful.'); - } - // ---------------------------------------------- - // Reconnect to Presentation Test (success) - end - // ---------------------------------------------- + var startBtn = document.getElementById("startBtn"); + startBtn.onclick = function () { + startBtn.disabled = true; + promise_test(function (t) { + var request = new PresentationRequest(presentationUrls); + var presentationId = null; + return request.start().then(function (connection) { + presentationId = connection.id; + + // No more user input needed, re-enable test timeout + t.step_timeout(function () { + t.force_timeout(); + t.done(); + }, 5000); + // Close connection and wait for "close" event + connection.close(); + var eventWatcher = new EventWatcher(t, connection, 'close'); + return eventWatcher.wait_for('close'); + }).then(function () { + // Connection now closed, let's reconnect to it + return request.reconnect(presentationId); + }).then(function (connection) { + assert_equals(connection.state, "connecting", "connection should be in 'connecting' state"); + assert_equals(connection.id, presentationId, "Ids of old and new connections must be equal"); + }); + }); + }; </script> - diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html index 8a4e6282410..b8458d85474 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html @@ -11,7 +11,7 @@ // ----------------------------------- promise_test(function (t) { var request = new PresentationRequest('presentation.html'); - promise_rejects(t, 'InvalidAccessError', request.start()); + return promise_rejects(t, 'InvalidAccessError', request.start()); }, "The presentation could not start, because a user gesture is required."); // ---------------------------------- // Launch New Presentation Test - end diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/presentation.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/presentation.html index ea13ded4ad9..f1eef248b84 100644 --- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/presentation.html +++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/presentation.html @@ -10,15 +10,16 @@ this.onmessage = function (evt) { this.send(evt.data); }; + }; }; - navigator.receiver.connectionList + + navigator.presentation.receiver.connectionList .then(function(list) { - list.onconnectionavailable = function(connections) { - addConnection(connections[connections.length - 1]); + list.onconnectionavailable = function(evt) { + addConnection(evt.connection); }; list.connections.map(function(connection) { addConnection(connection); }); }); - } </script> diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/common.js b/tests/wpt/web-platform-tests/referrer-policy/generic/common.js index 4b7feb4777b..0107a3857d8 100644 --- a/tests/wpt/web-platform-tests/referrer-policy/generic/common.js +++ b/tests/wpt/web-platform-tests/referrer-policy/generic/common.js @@ -111,23 +111,52 @@ function queryIframe(url, callback, referrer_policy) { window.addEventListener("message", listener); } -function queryImage(url, callback, referrer_policy) { - // For images, we'll test both images in a top-level document as well as - // images in a `srcdoc` frame to ensure that the latter has the same referrer - // as the former. - var i = document.createElement('iframe'); - i.srcdoc = "Hello, world."; - i.onload = function () { +function queryImage(url, callback, attributes, referrerPolicy) { + // For images, we'll test: + // - images in a `srcdoc` frame to ensure that it uses the referrer + // policy of its parent, + // - images in a top-level document, + // - and images in a `srcdoc` frame with its own referrer policy to + // override its parent. + + var noSrcDocPolicy = new Promise((resolve, reject) => { + var iframeWithoutOwnPolicy = document.createElement('iframe'); + iframeWithoutOwnPolicy.srcdoc = "Hello, world."; + iframeWithoutOwnPolicy.onload = function () { + var nextUrl = url + "&cache_destroyer2=" + (new Date()).getTime(); + loadImageInWindow(nextUrl, function (img) { + resolve(decodeImageData(extractImageData(img))); + }, attributes, iframeWithoutOwnPolicy.contentWindow); + }; + document.body.appendChild(iframeWithoutOwnPolicy); + }); + + // Give a srcdoc iframe a referrer policy different from the top-level page's policy. + var iframePolicy = (referrerPolicy === "no-referrer") ? "unsafe-url" : "no-referrer"; + var srcDocPolicy = new Promise((resolve, reject) => { + var iframeWithOwnPolicy = document.createElement('iframe'); + iframeWithOwnPolicy.srcdoc = "<meta name='referrer' content='" + iframePolicy + "'>Hello world."; + + iframeWithOwnPolicy.onload = function () { + var nextUrl = url + "&cache_destroyer3=" + (new Date()).getTime(); + loadImageInWindow(nextUrl, function (img) { + resolve(decodeImageData(extractImageData(img))); + }, null, iframeWithOwnPolicy.contentWindow); + }; + document.body.appendChild(iframeWithOwnPolicy); + }); + + var pagePolicy = new Promise((resolve, reject) => { loadImageInWindow(url, function (img) { - var srcdocData = decodeImageData(extractImageData(img)); - loadImageInWindow(url, function (img) { - var topLevelData = decodeImageData(extractImageData(img)); - assert_equals(srcdocData.referrer, topLevelData.referrer, "Referrer inside 'srcdoc' should be the same as embedder's referrer."); - callback(wrapResult(url, topLevelData), url); - }, referrer_policy, window); - }, referrer_policy, i.contentWindow); - }; - document.body.appendChild(i); + resolve(decodeImageData(extractImageData(img))); + }, attributes, window); + }); + + Promise.all([noSrcDocPolicy, srcDocPolicy, pagePolicy]).then(values => { + assert_equals(values[0].headers.referer, values[2].headers.referer, "Referrer inside 'srcdoc' without its own policy should be the same as embedder's referrer."); + assert_equals((iframePolicy === "no-referrer" ? undefined : document.location.href), values[1].headers.referer, "Referrer inside 'srcdoc' should use the iframe's policy if it has one"); + callback(wrapResult(url, values[2]), url); + }); } function queryXhr(url, callback) { diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js b/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js index c4cf96fb04b..887f13b0ce0 100644 --- a/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js +++ b/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js @@ -85,9 +85,9 @@ function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) { if (delivery_method in elementAttributesForDeliveryMethod) { invoker(t._subresourceUrl, callback, - elementAttributesForDeliveryMethod[delivery_method]); + elementAttributesForDeliveryMethod[delivery_method], t._scenario.referrer_policy); } else { - invoker(t._subresourceUrl, callback); + invoker(t._subresourceUrl, callback, null, t._scenario.referrer_policy); } }, diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/subresource-test/image-decoding.html b/tests/wpt/web-platform-tests/referrer-policy/generic/subresource-test/image-decoding.html index 083fb829a4a..133c0cf43d3 100644 --- a/tests/wpt/web-platform-tests/referrer-policy/generic/subresource-test/image-decoding.html +++ b/tests/wpt/web-platform-tests/referrer-policy/generic/subresource-test/image-decoding.html @@ -19,7 +19,7 @@ var messaging_test = async_test("Image is encoding headers as JSON."); var urlPath = '/referrer-policy/generic/subresource/image.py'; var url = location.protocol + "//www1." + location.hostname + ":" + location.port + - urlPath; + urlPath + "?cache_destroyer=" + (new Date()).getTime(); queryImage(url, function(message) { var pre = document.getElementById('received_message') var headers = message.headers; diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/unsupported-csp-referrer-directive.html b/tests/wpt/web-platform-tests/referrer-policy/generic/unsupported-csp-referrer-directive.html index a40dded44eb..b6c5b306765 100644 --- a/tests/wpt/web-platform-tests/referrer-policy/generic/unsupported-csp-referrer-directive.html +++ b/tests/wpt/web-platform-tests/referrer-policy/generic/unsupported-csp-referrer-directive.html @@ -16,7 +16,7 @@ <script> var test = async_test("Image has a referrer despite CSP 'referrer' directive"); - var urlPath = '/referrer-policy/generic/subresource/image.py'; + var urlPath = '/referrer-policy/generic/subresource/image.py?cache_destroyer=' + (new Date()).getTime(); var url = location.protocol + "//www1." + location.hostname + ":" + location.port + urlPath; queryImage(url, test.step_func(function(message) { diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_cached.htm b/tests/wpt/web-platform-tests/resource-timing/resource_cached.htm new file mode 100644 index 00000000000..fd61d639616 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resource_cached.htm @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8" /> +<title>Resource Timing cached resources</title> +<link rel="author" title="Google" href="http://www.google.com/" /> +<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webperftestharness.js"></script> +<script src="resources/webperftestharnessextension.js"></script> +<script> +setup({explicit_done: true}); + +// explicitly test the namespace before we start testing +test_namespace("getEntriesByType"); + +var d; +var iframe; +var iframeBody; +var image; +var random = Math.random(); + +function setup_iframe() { + iframe = document.getElementById('frameContext'); + d = iframe.contentWindow.document; + iframeBody = d.body; + iframe.addEventListener('load', onload_test, false); +} +function onload_test() { + if (window.performance.getEntriesByType === undefined) { + done(); + return; + } + var context = new PerformanceContext(iframe.contentWindow.performance); + var entries = context.getEntriesByType('resource'); + test_equals(entries.length, 2, "There should be two entries"); + if (entries.length >= 2) { + test_equals(entries[0].name, entries[1].name, "Both entries should have the same name"); + } + done(); +} +window.setup_iframe = setup_iframe; +</script> +</head> +<body> +<h1>Description</h1> +<p>This test validates that a 304 Not Modified resource appears in the buffer.</p> +<div id="log"></div> +<iframe id="frameContext" src="resources/fake_responses.html"></iframe> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html new file mode 100644 index 00000000000..fb9f63e5447 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8" /> +<title>Resource Timing connection reuse</title> +<link rel="author" title="Google" href="http://www.google.com/" /> +<link rel="help" href="https://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webperftestharness.js"></script> +<script src="resources/webperftestharnessextension.js"></script> +<script> +setup({explicit_done: true}); +var iframe; +var d; +var body; + +// explicitly test the namespace before we start testing +test_namespace("getEntriesByType"); + +function setup_iframe() { + iframe = document.getElementById('frameContext'); + d = iframe.contentWindow.document; + iframeBody = d.body; + iframe.addEventListener('load', onload_test, false); +} + +function onload_test() { + if (window.performance.getEntriesByType === undefined) { + done(); + return; + } + var context = new PerformanceContext(iframe.contentWindow.performance); + var entries = context.getEntriesByType('resource'); + + // when a persistent connection is used, follow-on resources should be included as PerformanceResourceTiming objects + test_equals(entries.length, 2, 'There should be 2 PerformanceEntries'); + + // when a persistent connection is used, for the resource that reuses the socket, connectStart and connectEnd should have the same value as fetchStart + var entry = entries[1]; + test_equals(entry.fetchStart, entry.connectStart, "connectStart and fetchStart should be the same"); + + test_equals(entry.fetchStart, entry.connectEnd, "connectEnd and fetchStart should be the same"); + + done(); +} + +window.setup_iframe = setup_iframe; +</script> +</head> +<body> +<h1>Description</h1> +<p>This test validates that connectStart and connectEnd are the same when a connection is reused (e.g. when a persistent connection is used).</p> +<div id="log"></div> +<iframe id="frameContext" src="resources/fake_responses.html"></iframe> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html b/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html new file mode 100644 index 00000000000..c669a383803 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8" /> +<title>Resource Timing initiator types with dynamic insertion</title> +<link rel="author" title="Google" href="http://www.google.com/" /> +<link rel="help" href="https://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webperftestharness.js"></script> +<script src="resources/webperftestharnessextension.js"></script> +<script> +// explicitly test the namespace before we start testing +test_namespace("getEntriesByType"); + + +var iframe; +function setup_iframe() { + iframe = document.getElementById('frameContext'); + var d = iframe.contentWindow.document; + var body = d.createElement('body'); + d.getElementsByTagName('html')[0].appendChild(body); + + var style = d.createElement('link'); + style.rel = 'stylesheet'; + style.href = 'resource_timing_test0.css'; + body.appendChild(style); + + var image = d.createElement('img'); + image.src = 'resource_timing_test0.png'; + body.appendChild(image); + + var subframe = d.createElement('iframe'); + subframe.src = 'inject_resource_test.html'; + body.appendChild(subframe); +} +function onload_test() { + if (window.performance.getEntriesByType === undefined) { + done(); + return; + } + var context = new PerformanceContext(iframe.contentWindow.performance); + var entries = context.getEntriesByType('resource'); + + var index = window.location.pathname.lastIndexOf('/'); + var pathname = window.location.pathname.substring(0, index) + '/'; + + var expected_entries = { }; + expected_entries[ pathname + 'resources/resource_timing_test0.css' ] = 'link', + expected_entries[ pathname + 'resources/resource_timing_test0.png' ] = 'img', + expected_entries[ pathname + 'resources/inject_resource_test.html' ] = 'iframe', + + test_resource_entries(entries, expected_entries); +} +window.setup_iframe = setup_iframe; +</script> +</head> +<body> +<h1>Description</h1> +<p>This test validates that initiator types are represented even when dynamically inserted.</p> +<div id="log"></div> +<iframe id="frameContext" onload="onload_test();" src="resources/inject_resource_test.html"></iframe> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.html b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.html new file mode 100644 index 00000000000..52cad6c4157 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.html @@ -0,0 +1,19 @@ +<body> +<script> +function request(type) { + var client = new XMLHttpRequest, + identifier = type == "tag" ? Math.random() : new Date().toGMTString(), + url = "fake_responses.py?" + type + "=" + identifier + client.open("GET", url, false) + client.send(null) + client.open("GET", url, false) + client.setRequestHeader(type == "tag" ? "If-None-Match" : "If-Modified-Since", identifier) + client.send(null) +} + +if(window.parent.setup_iframe) { + window.parent.setup_iframe(); + request("tag"); +} +</script> +</body> diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py new file mode 100644 index 00000000000..9f2e43df069 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py @@ -0,0 +1,19 @@ +# XMLHttpRequest/resources/conditional.py -- to fake a 304 response + +def main(request, response): + tag = request.GET.first("tag", None) + match = request.headers.get("If-None-Match", None) + date = request.GET.first("date", "") + modified = request.headers.get("If-Modified-Since", None) + if tag: + response.headers.set("ETag", '"%s"' % tag) + elif date: + response.headers.set("Last-Modified", date) + + if ((match is not None and match == tag) or + (modified is not None and modified == date)): + response.status = (304, "SUPERCOOL") + return "" + else: + response.headers.set("Content-Type", "text/plain") + return "MAYBE NOT"
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/inject_resource_test.html b/tests/wpt/web-platform-tests/resource-timing/resources/inject_resource_test.html new file mode 100644 index 00000000000..44d09675d38 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resources/inject_resource_test.html @@ -0,0 +1,7 @@ +<body> +<script> +if(window.parent.setup_iframe) { + window.parent.setup_iframe(); +} +</script> +</body> diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/webperftestharnessextension.js b/tests/wpt/web-platform-tests/resource-timing/resources/webperftestharnessextension.js new file mode 100644 index 00000000000..230f2ac6769 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resources/webperftestharnessextension.js @@ -0,0 +1,198 @@ +/* +Distributed under both the W3C Test Suite License [1] and the W3C +3-clause BSD License [2]. To contribute to a W3C Test Suite, see the +policies and contribution forms [3]. + +[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license +[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license +[3] http://www.w3.org/2004/10/27-testcases + */ + +var mark_names = [ + '', + '1', + 'abc', +]; + +var measures = [ + [''], + ['2', 1], + ['aaa', 'navigationStart', ''], +]; + +function test_method_exists(method, method_name, properties) +{ + var msg; + if (typeof method === 'function') + msg = 'performance.' + method.name + ' is supported!'; + else + msg = 'performance.' + method_name + ' is supported!'; + wp_test(function() { assert_true(typeof method === 'function', msg); }, msg, properties); +} + +function test_method_throw_exception(func_str, exception, msg) +{ + var exception_name = typeof exception === "object" ? exception.name : exception; + var msg = 'Invocation of ' + func_str + ' should throw ' + exception_name + ' Exception.'; + wp_test(function() { assert_throws(exception, function() {eval(func_str)}, msg); }, msg); +} + +function test_noless_than(value, greater_than, msg, properties) +{ + wp_test(function () { assert_true(value >= greater_than, msg); }, msg, properties); +} + +function test_fail(msg, properties) +{ + wp_test(function() { assert_unreached(); }, msg, properties); +} + +function test_resource_entries(entries, expected_entries) +{ + // This is slightly convoluted so that we can sort the output. + var actual_entries = {}; + var origin = window.location.protocol + "//" + window.location.host; + + for (var i = 0; i < entries.length; ++i) { + var entry = entries[i]; + var found = false; + for (var expected_entry in expected_entries) { + if (entry.name == origin + expected_entry) { + found = true; + if (expected_entry in actual_entries) { + test_fail(expected_entry + ' is not expected to have duplicate entries'); + } + actual_entries[expected_entry] = entry; + break; + } + } + if (!found) { + test_fail(entries[i].name + ' is not expected to be in the Resource Timing buffer'); + } + } + + sorted_urls = []; + for (var i in actual_entries) { + sorted_urls.push(i); + } + sorted_urls.sort(); + for (var i in sorted_urls) { + var url = sorted_urls[i]; + test_equals(actual_entries[url].initiatorType, + expected_entries[url], + origin + url + ' is expected to have initiatorType ' + expected_entries[url]); + } + for (var j in expected_entries) { + if (!(j in actual_entries)) { + test_fail(origin + j + ' is expected to be in the Resource Timing buffer'); + } + } +} +function performance_entrylist_checker(type) +{ + var entryType = type; + + function entry_check(entry, expectedNames) + { + var msg = 'Entry \"' + entry.name + '\" should be one that we have set.'; + wp_test(function() { assert_in_array(entry.name, expectedNames, msg); }, msg); + test_equals(entry.entryType, entryType, 'entryType should be \"' + entryType + '\".'); + if (type === "measure") { + test_true(isFinite(entry.startTime), 'startTime should be a number.'); + test_true(isFinite(entry.duration), 'duration should be a number.'); + } else if (type === "mark") { + test_greater_than(entry.startTime, 0, 'startTime should greater than 0.'); + test_equals(entry.duration, 0, 'duration of mark should be 0.'); + } + } + + function entrylist_order_check(entryList) + { + var inOrder = true; + for (var i = 0; i < entryList.length - 1; ++i) + { + if (entryList[i + 1].startTime < entryList[i].startTime) { + inOrder = false; + break; + } + } + return inOrder; + } + + function entrylist_check(entryList, expectedLength, expectedNames) + { + test_equals(entryList.length, expectedLength, 'There should be ' + expectedLength + ' entries.'); + test_true(entrylist_order_check(entryList), 'Entries in entrylist should be in order.'); + for (var i = 0; i < entryList.length; ++i) + { + entry_check(entryList[i], expectedNames); + } + } + + return{"entrylist_check":entrylist_check}; +} + +function PerformanceContext(context) +{ + this.performanceContext = context; +} + +PerformanceContext.prototype = { + initialMeasures: function(item, index, array) + { + this.performanceContext.measure.apply(this.performanceContext, item); + }, + + mark: function() + { + this.performanceContext.mark.apply(this.performanceContext, arguments); + }, + + measure: function() + { + this.performanceContext.measure.apply(this.performanceContext, arguments); + }, + + clearMarks: function() + { + this.performanceContext.clearMarks.apply(this.performanceContext, arguments); + + }, + + clearMeasures: function() + { + this.performanceContext.clearMeasures.apply(this.performanceContext, arguments); + + }, + + getEntries: function() + { + return this.performanceContext.getEntries.apply(this.performanceContext, arguments); + }, + + getEntriesByType: function() + { + return this.performanceContext.getEntriesByType.apply(this.performanceContext, arguments); + }, + + getEntriesByName: function() + { + return this.performanceContext.getEntriesByName.apply(this.performanceContext, arguments); + }, + + setResourceTimingBufferSize: function() + { + return this.performanceContext.setResourceTimingBufferSize.apply(this.performanceContext, arguments); + }, + + registerResourceTimingBufferFullCallback: function(func) + { + this.performanceContext.onresourcetimingbufferfull = func; + }, + + clearResourceTimings: function() + { + this.performanceContext.clearResourceTimings.apply(this.performanceContext, arguments); + } + +}; diff --git a/tests/wpt/web-platform-tests/service-workers/OWNERS b/tests/wpt/web-platform-tests/service-workers/OWNERS index e210b8f2d4c..13556f8107b 100644 --- a/tests/wpt/web-platform-tests/service-workers/OWNERS +++ b/tests/wpt/web-platform-tests/service-workers/OWNERS @@ -1 +1,2 @@ @ehsan +@mkruisselbrink diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/common.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/common.https.html index b00199844f7..c06e1f13a67 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/common.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/common.https.html @@ -4,7 +4,6 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script> function wait_for_message(worker) { diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/test-helpers.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/test-helpers.js index f4145e6217f..d3b81094219 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/test-helpers.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/test-helpers.js @@ -32,7 +32,7 @@ function cache_test(test_function, description) { promise_test(function(test) { return create_temporary_cache(test) - .then(test_function); + .then(function(cache) { return test_function(cache, test); }); }, description); } @@ -235,3 +235,11 @@ function assert_response_in_array(actual, expected_array, description) { } }), description); } + +// Deletes all caches, returning a promise indicating success. +function delete_all_caches() { + return self.caches.keys() + .then(function(keys) { + return Promise.all(keys.map(self.caches.delete.bind(self.caches))); + }); +} diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/testharness-helpers.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/testharness-helpers.js deleted file mode 100644 index e4885727b32..00000000000 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/testharness-helpers.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * testharness-helpers contains various useful extensions to testharness.js to - * allow them to be used across multiple tests before they have been - * upstreamed. This file is intended to be usable from both document and worker - * environments, so code should for example not rely on the DOM. - */ - -// Returns a promise that fulfills after the provided |promise| is fulfilled. -// The |test| succeeds only if |promise| rejects with an exception matching -// |code|. Accepted values for |code| follow those accepted for assert_throws(). -// The optional |description| describes the test being performed. -// -// E.g.: -// assert_promise_rejects( -// new Promise(...), // something that should throw an exception. -// 'NotFoundError', -// 'Should throw NotFoundError.'); -// -// assert_promise_rejects( -// new Promise(...), -// new TypeError(), -// 'Should throw TypeError'); -function assert_promise_rejects(promise, code, description) { - return promise.then( - function() { - throw 'assert_promise_rejects: ' + description + ' Promise did not reject.'; - }, - function(e) { - if (code !== undefined) { - assert_throws(code, function() { throw e; }, description); - } - }); -} diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-add.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-add.js index 01fd605ad36..c41c7bcef77 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-add.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-add.js @@ -1,13 +1,13 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } -cache_test(function(cache) { - return assert_promise_rejects( - cache.add(), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.add(), 'Cache.add should throw a TypeError when no arguments are given.'); }, 'Cache.add called with no arguments'); @@ -29,10 +29,11 @@ cache_test(function(cache) { }); }, 'Cache.add called with relative URL specified as a string'); -cache_test(function(cache) { - return assert_promise_rejects( - cache.add('javascript://this-is-not-http-mmkay'), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.add('javascript://this-is-not-http-mmkay'), 'Cache.add should throw a TypeError for non-HTTP/HTTPS URLs.'); }, 'Cache.add called with non-HTTP/HTTPS URL'); @@ -45,12 +46,13 @@ cache_test(function(cache) { }); }, 'Cache.add called with Request object'); -cache_test(function(cache) { +cache_test(function(cache, test) { var request = new Request('../resources/simple.txt', {method: 'POST', body: 'This is a body.'}); - return assert_promise_rejects( - cache.add(request), + return promise_rejects( + test, new TypeError(), + cache.add(request), 'Cache.add should throw a TypeError for non-GET requests.'); }, 'Cache.add called with POST request'); @@ -81,33 +83,37 @@ cache_test(function(cache) { }); }, 'Cache.add with request with null body (not consumed)'); -cache_test(function(cache) { - return assert_promise_rejects( - cache.add('this-does-not-exist-please-dont-create-it'), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.add('this-does-not-exist-please-dont-create-it'), 'Cache.add should reject if response is !ok'); }, 'Cache.add with request that results in a status of 404'); -cache_test(function(cache) { - return assert_promise_rejects( - cache.add('../resources/fetch-status.php?status=500'), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.add('../resources/fetch-status.php?status=500'), 'Cache.add should reject if response is !ok'); }, 'Cache.add with request that results in a status of 500'); -cache_test(function(cache) { - return assert_promise_rejects( - cache.addAll(), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.addAll(), 'Cache.addAll with no arguments should throw TypeError.'); }, 'Cache.addAll with no arguments'); -cache_test(function(cache) { +cache_test(function(cache, test) { // Assumes the existence of ../resources/simple.txt and ../resources/blank.html var urls = ['../resources/simple.txt', undefined, '../resources/blank.html']; - return assert_promise_rejects( - cache.addAll(), + return promise_rejects( + test, new TypeError(), + cache.addAll(), 'Cache.addAll should throw TypeError for an undefined argument.'); }, 'Cache.addAll with a mix of valid and undefined arguments'); @@ -202,7 +208,7 @@ cache_test(function(cache) { }); }, 'Cache.addAll with Request arguments'); -cache_test(function(cache) { +cache_test(function(cache, test) { // Assumes that ../resources/simple.txt and ../resources/blank.html exist. // The second resource does not. var urls = ['../resources/simple.txt', @@ -211,12 +217,15 @@ cache_test(function(cache) { var requests = urls.map(function(url) { return new Request(url); }); - return assert_promise_rejects( - cache.addAll(requests), + return promise_rejects( + test, new TypeError(), + cache.addAll(requests), 'Cache.addAll should reject with TypeError if any request fails') .then(function() { - return Promise.all(urls.map(function(url) { return cache.match(url); })); + return Promise.all(urls.map(function(url) { + return cache.match(url); + })); }) .then(function(matches) { assert_array_equals( @@ -226,11 +235,12 @@ cache_test(function(cache) { }); }, 'Cache.addAll with a mix of succeeding and failing requests'); -cache_test(function(cache) { +cache_test(function(cache, test) { var request = new Request('../resources/simple.txt'); - return assert_promise_rejects( - cache.addAll([request, request]), + return promise_rejects( + test, 'InvalidStateError', + cache.addAll([request, request]), 'Cache.addAll should throw InvalidStateError if the same request is added ' + 'twice.'); }, 'Cache.addAll called with the same Request object specified twice'); diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-delete.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-delete.js index 75a474c2b2c..446818c4281 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-delete.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-delete.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } @@ -17,10 +16,11 @@ function new_test_response() { return new Response('Hello world!', { status: 200 }); } -cache_test(function(cache) { - return assert_promise_rejects( - cache.delete(), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.delete(), 'Cache.delete should reject with a TypeError when called with no ' + 'arguments.'); }, 'Cache.delete with no arguments'); diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-match.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-match.js index 716bfe5a698..fbe564d952d 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-match.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-match.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-matchAll.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-matchAll.js index 2bc661a5c90..5de9a5ec2e1 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-matchAll.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-matchAll.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-put.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-put.js index 8dbaf9789d5..71a0e4d9c89 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-put.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-put.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } @@ -190,18 +189,20 @@ cache_test(function(cache) { }); }, 'Cache.put with a string request'); -cache_test(function(cache) { - return assert_promise_rejects( - cache.put(new Request(test_url), 'Hello world!'), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.put(new Request(test_url), 'Hello world!'), 'Cache.put should only accept a Response object as the response.'); }, 'Cache.put with an invalid response'); -cache_test(function(cache) { - return assert_promise_rejects( +cache_test(function(cache, test) { + return promise_rejects( + test, + new TypeError(), cache.put(new Request('file:///etc/passwd'), new Response(test_body)), - new TypeError(), 'Cache.put should reject non-HTTP/HTTPS requests with a TypeError.'); }, 'Cache.put with a non-HTTP/HTTPS request'); @@ -218,26 +219,29 @@ cache_test(function(cache) { }); }, 'Cache.put with a relative URL'); -cache_test(function(cache) { +cache_test(function(cache, test) { var request = new Request('http://example.com/foo', { method: 'HEAD' }); - return assert_promise_rejects( - cache.put(request, new Response(test_body)), + return promise_rejects( + test, new TypeError(), + cache.put(request, new Response(test_body)), 'Cache.put should throw a TypeError for non-GET requests.'); }, 'Cache.put with a non-GET request'); -cache_test(function(cache) { - return assert_promise_rejects( - cache.put(new Request(test_url), null), +cache_test(function(cache, test) { + return promise_rejects( + test, new TypeError(), + cache.put(new Request(test_url), null), 'Cache.put should throw a TypeError for a null response.'); }, 'Cache.put with a null response'); -cache_test(function(cache) { +cache_test(function(cache, test) { var request = new Request(test_url, {method: 'POST', body: test_body}); - return assert_promise_rejects( - cache.put(request, new Response(test_body)), + return promise_rejects( + test, new TypeError(), + cache.put(request, new Response(test_body)), 'Cache.put should throw a TypeError for a POST request.'); }, 'Cache.put with a POST request'); @@ -266,20 +270,22 @@ cache_test(function(cache) { }); }, 'getReader() after Cache.put'); -cache_test(function(cache) { - return assert_promise_rejects( +cache_test(function(cache, test) { + return promise_rejects( + test, + new TypeError(), cache.put(new Request(test_url), new Response(test_body, { headers: { VARY: '*' }})), - new TypeError(), 'Cache.put should reject VARY:* Responses with a TypeError.'); }, 'Cache.put with a VARY:* Response'); -cache_test(function(cache) { - return assert_promise_rejects( +cache_test(function(cache, test) { + return promise_rejects( + test, + new TypeError(), cache.put(new Request(test_url), new Response(test_body, { headers: { VARY: 'Accept-Language,*' }})), - new TypeError(), 'Cache.put should reject Responses with an embedded VARY:* with a ' + 'TypeError.'); }, 'Cache.put with an embedded VARY:* Response'); diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-keys.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-keys.js index 4d7bc623f00..ef06ccdff5c 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-keys.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-keys.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-match.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-match.js index 0052e43ca30..3c1cdd79c2b 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-match.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-match.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } @@ -61,7 +60,7 @@ promise_test(function(test) { return Promise.all(test_cache_list.map(function(key) { return self.caches.open(key); })) - .then(function() { return caches.open('x'); }) + .then(function() { return self.caches.open('x'); }) .then(function(cache) { return cache.put(transaction.request.clone(), transaction.response.clone()); @@ -100,7 +99,7 @@ promise_test(function(test) { .then(function(response) { assert_equals(response, undefined, 'The response should not be found.'); - }) + }); }, 'CacheStorageMatch with no cached entry'); promise_test(function(test) { diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage.js index 594b01b5810..521d3bbc25d 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage.js +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage.js @@ -1,6 +1,5 @@ if (self.importScripts) { importScripts('/resources/testharness.js'); - importScripts('../resources/testharness-helpers.js'); importScripts('../resources/test-helpers.js'); } @@ -31,9 +30,10 @@ promise_test(function(t) { }, 'CacheStorage.open with an empty name'); promise_test(function(t) { - return assert_promise_rejects( - self.caches.open(), + return promise_rejects( + t, new TypeError(), + self.caches.open(), 'CacheStorage.open should throw TypeError if called with no arguments.'); }, 'CacheStorage.open with no arguments'); @@ -169,20 +169,28 @@ promise_test(function(t) { }, 'CacheStorage.delete with nonexistent cache'); promise_test(function(t) { - var bad_name = 'unpaired\uD800'; - var converted_name = 'unpaired\uFFFD'; // Don't create cache with this name. - return self.caches.has(converted_name) + var unpaired_name = 'unpaired\uD800'; + var converted_name = 'unpaired\uFFFD'; + + // The test assumes that a cache with converted_name does not + // exist, but if the implementation fails the test then such + // a cache will be created. Start off in a fresh state by + // deleting all caches. + return delete_all_caches() + .then(function() { + return self.caches.has(converted_name); + }) .then(function(cache_exists) { assert_false(cache_exists, 'Test setup failure: cache should not exist'); }) - .then(function() { return self.caches.open(bad_name); }) + .then(function() { return self.caches.open(unpaired_name); }) .then(function() { return self.caches.keys(); }) .then(function(keys) { - assert_true(keys.indexOf(bad_name) !== -1, + assert_true(keys.indexOf(unpaired_name) !== -1, 'keys should include cache with bad name'); }) - .then(function() { return self.caches.has(bad_name); }) + .then(function() { return self.caches.has(unpaired_name); }) .then(function(cache_exists) { assert_true(cache_exists, 'CacheStorage names should be not be converted.'); diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/credentials.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/credentials.https.html index 7bc494eb140..7bc494eb140 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/credentials.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/credentials.https.html diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-add.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-add.https.html index d9945f9ae43..8dfb786cf35 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-add.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-add.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-add.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-delete.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-delete.https.html index 735d2cdb49b..077e6a3fdc1 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-delete.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-delete.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-delete.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-match.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-match.https.html index 0ff5c679928..ffc64984ea1 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-match.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-match.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-match.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-matchAll.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-matchAll.https.html index 372e641a52f..1288b2c0343 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-matchAll.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-matchAll.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-matchAll.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html index 1d9e02ba678..ded6e84cb53 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-put.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-keys.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-keys.https.html index b4f94bade69..669ab9105e2 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-keys.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-keys.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-storage-keys.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-match.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-match.https.html index 72005f43a35..f16c45d001e 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-match.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-match.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-storage-match.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage.https.html index 6c4f4af7fd0..b2f5c385983 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage.https.html @@ -4,6 +4,5 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script src="../resources/test-helpers.js"></script> <script src="../script-tests/cache-storage.js"></script> diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/sandboxed-iframes.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/sandboxed-iframes.https.html index 0618585217e..4a99d2af1b0 100644 --- a/tests/wpt/web-platform-tests/service-workers/cache-storage/window/sandboxed-iframes.https.html +++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/sandboxed-iframes.https.html @@ -4,7 +4,6 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="../resources/testharness-helpers.js"></script> <script> function load_iframe(src, sandbox) { diff --git a/tests/wpt/web-platform-tests/shadow-dom/slotchange-event.html b/tests/wpt/web-platform-tests/shadow-dom/slotchange-event.html index ed36bedbba0..62675dea488 100644 --- a/tests/wpt/web-platform-tests/shadow-dom/slotchange-event.html +++ b/tests/wpt/web-platform-tests/shadow-dom/slotchange-event.html @@ -3,6 +3,7 @@ <head> <title>Shadow DOM: slotchange event</title> <meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> +<meta name="author" title="Hayato Ito" href="mailto:hayato@google.com"> <link rel="help" href="https://dom.spec.whatwg.org/#signaling-slot-change"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -10,8 +11,6 @@ <body> <div id="log"></div> <script> -// FIXME: Fix these test cases once https://github.com/w3c/webcomponents/issues/571 is resolved. - function treeName(mode, connectedToDocument) { return (mode == 'open' ? 'an ' : 'a ') + mode + ' shadow root ' @@ -490,7 +489,6 @@ function testSlotchangeFiresWhenNestedSlotChange(mode, connectedToDocument) outerShadow.appendChild(document.createElement('span')); outerSlot = document.createElement('slot'); outerSlot.addEventListener('slotchange', function (event) { - event.stopPropagation(); test.step(function () { assert_equals(event.target, outerSlot, 'slotchange event\'s target must be the slot element'); }); @@ -507,7 +505,7 @@ function testSlotchangeFiresWhenNestedSlotChange(mode, connectedToDocument) innerSlot.addEventListener('slotchange', function (event) { event.stopPropagation(); test.step(function () { - assert_equals(event.target, innerSlot, 'slotchange event\'s target must be the slot element'); + assert_equals(event.target, outerSlot, 'slotchange event\'s target must be the outer slot element'); }); innerSlotEventCount++; }); @@ -521,10 +519,10 @@ function testSlotchangeFiresWhenNestedSlotChange(mode, connectedToDocument) setTimeout(function () { test.step(function () { - assert_equals(innerSlotEventCount, 1, - 'slotchange must be fired on a slot element if the assigned nodes changed'); assert_equals(outerSlotEventCount, 1, - 'slotchange must be fired on a slot element if the assigned nodes of an inner slot changed'); + 'slotchange must be fired on a slot element if the assigned nodes changed'); + assert_equals(innerSlotEventCount, 1, + 'slotchange must be fired on a slot element and must bubble'); }); test.done(); }, 1); @@ -540,70 +538,51 @@ function testSlotchangeFiresAtEndOfMicroTask(mode, connectedToDocument) var test = async_test('slotchange event must fire at the end of current microtask after mutation observers are invoked inside ' + treeName(mode, connectedToDocument) + ' when slots\'s contents change'); - var outerHost; - var innerHost; - var outerSlot; - var innerSlot; - var slotchangeEvents = []; + var host; + var slot; + var eventCount = 0; test.step(function () { - outerHost = document.createElement('div'); + host = document.createElement('div'); if (connectedToDocument) - document.body.appendChild(outerHost); - - var outerShadow = outerHost.attachShadow({'mode': mode}); - outerShadow.appendChild(document.createElement('span')); - outerSlot = document.createElement('slot'); - outerSlot.addEventListener('slotchange', function (event) { - event.stopPropagation(); - test.step(function () { - assert_equals(event.target, outerSlot, 'slotchange event\'s target must be the slot element'); - }); - slotchangeEvents.push('outer'); - }); + document.body.appendChild(host); - innerHost = document.createElement('div'); - innerHost.appendChild(outerSlot); - outerShadow.appendChild(innerHost); + var shadowRoot = host.attachShadow({'mode': mode}); + slot = document.createElement('slot'); - var innerShadow = innerHost.attachShadow({'mode': mode}); - innerShadow.appendChild(document.createElement('span')); - innerSlot = document.createElement('slot'); - innerSlot.addEventListener('slotchange', function (event) { - event.stopPropagation(); + slot.addEventListener('slotchange', function (event) { test.step(function () { - assert_equals(event.target, innerSlot, 'slotchange event\'s target must be the slot element'); + assert_equals(event.type, 'slotchange', 'slotchange event\'s type must be "slotchange"'); + assert_equals(event.target, slot, 'slotchange event\'s target must be the slot element'); }); - slotchangeEvents.push('inner'); + eventCount++; }); - innerShadow.appendChild(innerSlot); - outerHost.appendChild(document.createElement('span')); - - assert_equals(slotchangeEvents.length, 0, 'slotchange event must not be fired synchronously'); + shadowRoot.appendChild(slot); }); var element = document.createElement('div'); new MutationObserver(function () { test.step(function () { - assert_equals(slotchangeEvents.length, 0, 'slotchange event must not be fired before mutation records are delivered'); + assert_equals(eventCount, 0, 'slotchange event must not be fired before mutation records are delivered'); }); + host.appendChild(document.createElement('span')); element.setAttribute('title', 'bar'); - innerHost.appendChild(document.createElement('span')); }).observe(element, {attributes: true, attributeFilter: ['id']}); new MutationObserver(function () { test.step(function () { - assert_array_equals(slotchangeEvents, ['outer', 'inner'], 'slotchange event must be fired during a single compound microtask'); + assert_equals(eventCount, 1, 'slotchange event must be fired during a single compound microtask'); }); }).observe(element, {attributes: true, attributeFilter: ['title']}); element.setAttribute('id', 'foo'); + host.appendChild(document.createElement('div')); setTimeout(function () { test.step(function () { - assert_array_equals(slotchangeEvents, ['outer', 'inner', 'inner'], + assert_equals(eventCount, 2, 'a distinct slotchange event must be enqueued for changes made during a mutation observer delivery'); }); test.done(); @@ -614,7 +593,6 @@ testSlotchangeFiresAtEndOfMicroTask('open', true); testSlotchangeFiresAtEndOfMicroTask('closed', true); testSlotchangeFiresAtEndOfMicroTask('open', false); testSlotchangeFiresAtEndOfMicroTask('closed', false); - </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/test-009.html b/tests/wpt/web-platform-tests/shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/test-009.html index 5aa6b9218cd..57d8ec8be9c 100644 --- a/tests/wpt/web-platform-tests/shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/test-009.html +++ b/tests/wpt/web-platform-tests/shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/test-009.html @@ -194,7 +194,7 @@ test(function () { test(function () { var ctx = A_04_01_09.setup(); - assert_nodelist_contents_equal_noorder(ctx.d.querySelectorAll('div:last-child'), [ctx.d_div2], 'd.querySelectorAll(\'div:last-child\') return wrong result'); + assert_nodelist_contents_equal_noorder(ctx.d.querySelectorAll('div:last-child'), [ctx.d_div1, ctx.d_div2], 'd.querySelectorAll(\'div:last-child\') return wrong result'); assert_nodelist_contents_equal_noorder(ctx.s1.querySelectorAll('div:last-child'), [ctx.s1_div1, ctx.s1_div2], 's1.querySelectorAll(\'div:last-child\') return wrong result'); assert_nodelist_contents_equal_noorder(ctx.s2.querySelectorAll('div:last-child'), [ctx.s2_div1, ctx.s2_div2], 's2.querySelectorAll(\'div:last-child\') return wrong result'); diff --git a/tests/wpt/web-platform-tests/svg/historical.html b/tests/wpt/web-platform-tests/svg/historical.html index de15f81839f..5626dfcd13d 100644 --- a/tests/wpt/web-platform-tests/svg/historical.html +++ b/tests/wpt/web-platform-tests/svg/historical.html @@ -32,7 +32,6 @@ var mixinInterfaces = [ "SVGFitToViewBox", "SVGTests", "SVGURIReference", - "SVGUnitTypes", "SVGZoomAndPan" ] for (var name of mixinInterfaces) { @@ -81,4 +80,21 @@ for (var member of movedPathMembers) { assert_true(SVGGeometryElement.prototype.hasOwnProperty(member)) }, "SVGPathElement.prototype." + member + " must be moved to SVGGeometryElement.prototype") } + +var implementedSVGUnitTypes = [ + "SVGClipPathElement", + "SVGFilterElement", + "SVGGradientElement", + "SVGMaskElement", + "SVGPatternElement" +] +for (var name of implementedSVGUnitTypes) { + test(function() { + assert_true(name in window); + var interfaceObject = window[name]; + assert_false("SVG_UNIT_TYPE_UNKNOWN" in interfaceObject); + assert_false("SVG_UNIT_TYPE_USERSPACEONUSE" in interfaceObject); + assert_false("SVG_UNIT_TYPE_OBJECTBOUNDINGBOX" in interfaceObject); + }, name + " must not implement SVGUnitTypes") +} </script> diff --git a/tests/wpt/web-platform-tests/svg/interfaces.html b/tests/wpt/web-platform-tests/svg/interfaces.html index c4d7a2740d7..a9bf2bd6bb5 100644 --- a/tests/wpt/web-platform-tests/svg/interfaces.html +++ b/tests/wpt/web-platform-tests/svg/interfaces.html @@ -540,7 +540,6 @@ interface SVGStringList { setter void (unsigned long index, DOMString newItem); }; -[NoInterfaceObject] interface SVGUnitTypes { // Unit Types const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; @@ -921,7 +920,6 @@ interface SVGGradientElement : SVGElement { }; SVGGradientElement implements SVGURIReference; -SVGGradientElement implements SVGUnitTypes; interface SVGLinearGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength x1; @@ -964,7 +962,6 @@ interface SVGPatternElement : SVGElement { SVGPatternElement implements SVGFitToViewBox; SVGPatternElement implements SVGURIReference; -SVGPatternElement implements SVGUnitTypes; interface SVGHatchElement : SVGElement { }; @@ -1015,7 +1012,6 @@ interface SVGFilterElement : SVGElement { }; SVGFilterElement implements SVGURIReference; -SVGFilterElement implements SVGUnitTypes; [NoInterfaceObject] interface SVGFilterPrimitiveStandardAttributes { diff --git a/tests/wpt/web-platform-tests/tools/sslutils/openssl.py b/tests/wpt/web-platform-tests/tools/sslutils/openssl.py index 1b636f02272..26ed711356d 100644 --- a/tests/wpt/web-platform-tests/tools/sslutils/openssl.py +++ b/tests/wpt/web-platform-tests/tools/sslutils/openssl.py @@ -57,13 +57,7 @@ class OpenSSL(object): self.cmd += ["-config", self.conf_path] self.cmd += list(args) - # Copy the environment, converting to plain strings. Windows - # StartProcess is picky about all the keys/values being plain strings, - # but at least in MSYS shells, the os.environ dictionary can be mixed. - env = {} - for k, v in os.environ.iteritems(): - env[k.encode("utf8")] = v.encode("utf8") - + env = os.environ.copy() if self.base_conf_path is not None: env["OPENSSL_CONF"] = self.base_conf_path.encode("utf8") diff --git a/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html b/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html new file mode 100644 index 00000000000..f1f5641785e --- /dev/null +++ b/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>InputEvent Constructor Tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + var e = new InputEvent('type'); + assert_equals(e.data, null); + assert_false(e.isComposing); +}, 'InputEvent constructor without InputEventInit.'); + +test(function() { + var e = new InputEvent('type', { data: null, isComposing: true }); + assert_equals(e.data, null); + assert_true(e.isComposing); +}, 'InputEvent construtor with InputEventInit where data is null'); + +test(function() { + assert_equals(new InputEvent('type', { data: ''}).data, ''); +}, 'InputEvent construtor with InputEventInit where data is empty string'); + +test(function() { + assert_equals(new InputEvent('type', { data: 'data' }).data, 'data'); +}, 'InputEvent construtor with InputEventInit where data is non empty string'); +</script> diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/iframe-redirect-upgrade.https.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/iframe-redirect-upgrade.https.html new file mode 100644 index 00000000000..9a79825a450 --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/iframe-redirect-upgrade.https.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> +<head> +<title>Upgrade Insecure Requests: IFrames.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./support/testharness-helper.sub.js"></script> + +<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> +</head> +<body> +<script> +var tests = [ + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.FRAME)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.FRAME)), +]; + +tests.forEach(test => { + async_test(t => assert_frame_loads(t, test.url), test.name); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/iframe-upgrade.https.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/iframe-upgrade.https.html new file mode 100644 index 00000000000..8c4bb370df6 --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/iframe-upgrade.https.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> +<head> +<title>Upgrade Insecure Requests: IFrames.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./support/testharness-helper.sub.js"></script> + +<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> +</head> +<body> +<script> +var tests = [ + generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.FRAME), + generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.FRAME), + generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.FRAME), + generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.FRAME), +]; + +tests.forEach(test => { + async_test(t => assert_frame_loads(t, test.url), test.name); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/image-redirect-upgrade.https.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/image-redirect-upgrade.https.html new file mode 100644 index 00000000000..5ed75109dcd --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/image-redirect-upgrade.https.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html> +<head> +<title>Upgrade Insecure Requests: Redirected Images.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./support/testharness-helper.sub.js"></script> + +<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> +</head> +<body> +<script> +var tests = [ + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.SAME_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.INSECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE)), + generateRedirect(Host.CROSS_ORIGIN, Protocol.SECURE, generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.IMAGE)), +]; + +tests.forEach(test => { + async_test(t => assert_image_loads(t, test.url, 64, 168), test.name); + async_test(t => assert_image_loads_in_srcdoc(t, test.url, 64, 168), test.name + " in <iframe srcdoc>"); + async_test(t => assert_image_loads_in_blank(t, test.url, 64, 168), test.name + " in <iframe>"); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/image-upgrade.https.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/image-upgrade.https.html new file mode 100644 index 00000000000..515c67469a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/image-upgrade.https.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> +<title>Upgrade Insecure Requests: Images.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./support/testharness-helper.sub.js"></script> + +<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> +</head> +<body> +<script> +var tests = [ + generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE), + generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.IMAGE), + generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.IMAGE), + generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.IMAGE), +]; + +tests.forEach(test => { + async_test(t => assert_image_loads(t, test.url, 64, 168), test.name); + async_test(t => assert_image_loads_in_srcdoc(t, test.url, 64, 168), test.name + " in <iframe srcdoc>"); + async_test(t => assert_image_loads_in_blank(t, test.url, 64, 168), test.name + " in <iframe>"); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/pass.png b/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/pass.png Binary files differnew file mode 100644 index 00000000000..2fa1e0ac066 --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/pass.png diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/post-origin-to-parent.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/post-origin-to-parent.html new file mode 100644 index 00000000000..4f596ef4dce --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/post-origin-to-parent.html @@ -0,0 +1,3 @@ +<script> + parent.postMessage(window.location.origin, '*'); +</script> diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/testharness-helper.sub.js b/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/testharness-helper.sub.js new file mode 100644 index 00000000000..383506a1437 --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/support/testharness-helper.sub.js @@ -0,0 +1,115 @@ +const Host = { + SAME_ORIGIN: "same-origin", + CROSS_ORIGIN: "cross-origin", +}; + +const Protocol = { + INSECURE: "insecure", + SECURE: "secure", +}; + +const ResourceType = { + IMAGE: "image", + FRAME: "frame", + WEBSOCKET: "websocket", +}; + +// These tests rely on some unintuitive cleverness due to WPT's test setup: +// 'Upgrade-Insecure-Requests' does not upgrade the port number, so we use URLs +// in the form `http://[domain]:[https-port]`. If the upgrade fails, the load will fail, +// as we don't serve HTTP over the secure port. +function generateURL(host, protocol, resourceType) { + var url = new URL("http://{{host}}:{{ports[https][0]}}/upgrade-insecure-requests/support/"); + url.protocol = protocol == Protocol.INSECURE ? "http" : "https"; + url.hostname = host == Host.SAME_ORIGIN ? "{{host}}" : "{{domains[天気の良い日]}}"; + + if (resourceType == ResourceType.IMAGE) { + url.pathname += "pass.png"; + } else if (resourceType == ResourceType.FRAME) { + url.pathname += "post-origin-to-parent.html"; + } else if (resourceType == ResourceType.WEBSOCKET) { + url.port = {{ports[wss][0]}}; + url.protocol = protocol == Protocol.INSECURE ? "ws" : "wss"; + url.pathname = "echo"; + } + return { + name: protocol + "/" + host + " " + resourceType, + url: url.toString() + }; +} + +function generateRedirect(host, protocol, target) { + var url = "http://{{host}}:{{ports[https][0]}}/common/redirect.py?location=" + encodeURIComponent(target.url); + url.protocol = protocol == Protocol.INSECURE ? "http" : "https"; + url.hostname = host == Host.SAME_ORIGIN ? "{{host}}" : "{{domains[天気の良い日]}}"; + return { + name: protocol + "/" + host + " => " + target.name, + url: url.toString() + }; +} + +function assert_image_loads(test, url, height, width) { + var i = document.createElement('img'); + i.onload = test.step_func_done(_ => { + assert_equals(i.naturalHeight, height, "Height."); + assert_equals(i.naturalWidth, width, "Width."); + }); + i.onerror = test.unreached_func(url + " should load successfully."); + i.src = url; +} + +function assert_image_loads_in_srcdoc(test, url, height, width) { + var frame = document.createElement('iframe'); + frame.srcdoc = "yay!"; + frame.onload = _ => { + var i = frame.contentDocument.createElement('img'); + i.onload = test.step_func_done(_ => { + assert_equals(i.naturalHeight, height, "Height."); + assert_equals(i.naturalWidth, width, "Width."); + frame.remove(); + }); + i.onerror = test.unreached_func(url + " should load successfully."); + i.src = url; + }; + + document.body.appendChild(frame); +} + +function assert_image_loads_in_blank(test, url, height, width) { + var frame = document.createElement('iframe'); + frame.onload = _ => { + var i = frame.contentDocument.createElement('img'); + i.onload = test.step_func_done(_ => { + assert_equals(i.naturalHeight, height, "Height."); + assert_equals(i.naturalWidth, width, "Width."); + frame.remove(); + }); + i.onerror = test.unreached_func(url + " should load successfully."); + i.src = url; + }; + + document.body.appendChild(frame); +} + +function assert_frame_loads(test, url) { + var i = document.createElement('iframe'); + + window.addEventListener('message', test.step_func(e => { + if (e.source == i.contentWindow) { + i.remove(); + test.done(); + } + })); + + i.src = url; + document.body.appendChild(i); +} + +function assert_websocket_loads(test, url) { + var w = new WebSocket(url, "echo"); + w.onopen = test.step_func(_ => { + w.onclose = test.step_func_done(); + w.close(); + }); + w.onclose = test.unreached_func("WebSocket should not close before open is called."); +} diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/websocket-upgrade.https.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/websocket-upgrade.https.html new file mode 100644 index 00000000000..aa7237db82b --- /dev/null +++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/websocket-upgrade.https.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> +<head> +<title>Upgrade Insecure Requests: WebSockets.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./support/testharness-helper.sub.js"></script> + +<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> +</head> +<body> +<script> +var tests = [ + generateURL(Host.SAME_ORIGIN, Protocol.INSECURE, ResourceType.WEBSOCKET), + generateURL(Host.SAME_ORIGIN, Protocol.SECURE, ResourceType.WEBSOCKET), + generateURL(Host.CROSS_ORIGIN, Protocol.INSECURE, ResourceType.WEBSOCKET), + generateURL(Host.CROSS_ORIGIN, Protocol.SECURE, ResourceType.WEBSOCKET), +]; + +tests.forEach(test => { + async_test(t => assert_websocket_loads(t, test.url), test.name); +}); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/url/a-element-origin-xhtml.xhtml b/tests/wpt/web-platform-tests/url/a-element-origin-xhtml.xhtml new file mode 100644 index 00000000000..d1741bbf073 --- /dev/null +++ b/tests/wpt/web-platform-tests/url/a-element-origin-xhtml.xhtml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>URL Test</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <base id="base"/> + </head> + <body> + <div id="log"></div> + <script src="a-element-origin.js"></script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/url/a-element-origin.html b/tests/wpt/web-platform-tests/url/a-element-origin.html new file mode 100644 index 00000000000..bd2f4547ada --- /dev/null +++ b/tests/wpt/web-platform-tests/url/a-element-origin.html @@ -0,0 +1,7 @@ +<!doctype html> +<meta charset=utf-8> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<base id=base> +<div id=log></div> +<script src=a-element-origin.js></script> diff --git a/tests/wpt/web-platform-tests/url/a-element-origin.js b/tests/wpt/web-platform-tests/url/a-element-origin.js new file mode 100644 index 00000000000..a1202db5bde --- /dev/null +++ b/tests/wpt/web-platform-tests/url/a-element-origin.js @@ -0,0 +1,35 @@ +var setup = async_test("Loading data…") +setup.step(function() { + var request = new XMLHttpRequest() + request.open("GET", "urltestdata.json") + request.send() + request.responseType = "json" + request.onload = setup.step_func(function() { + runURLTests(request.response) + setup.done() + }) +}) + +function setBase(base) { + document.getElementById("base").href = base +} + +function bURL(url, base) { + base = base || "about:blank" + setBase(base) + var a = document.createElement("a") + a.setAttribute("href", url) + return a +} + +function runURLTests(urltests) { + for(var i = 0, l = urltests.length; i < l; i++) { + var expected = urltests[i] + if (typeof expected === "string" || !("origin" in expected)) continue + + test(function() { + var url = bURL(expected.input, expected.base) + assert_equals(url.origin, expected.origin, "origin") + }, "Parsing origin: <" + expected.input + "> against <" + expected.base + ">") + } +} diff --git a/tests/wpt/web-platform-tests/url/a-element.js b/tests/wpt/web-platform-tests/url/a-element.js index c77df5bf2ee..a3d78139b16 100644 --- a/tests/wpt/web-platform-tests/url/a-element.js +++ b/tests/wpt/web-platform-tests/url/a-element.js @@ -38,9 +38,6 @@ function runURLTests(urltests) { } assert_equals(url.href, expected.href, "href") - if ("origin" in expected) { - assert_equals(url.origin, expected.origin, "origin") - } assert_equals(url.protocol, expected.protocol, "protocol") assert_equals(url.username, expected.username, "username") assert_equals(url.password, expected.password, "password") diff --git a/tests/wpt/web-platform-tests/url/setters_tests.json b/tests/wpt/web-platform-tests/url/setters_tests.json index 4d650e64bb1..d24f5157f16 100644 --- a/tests/wpt/web-platform-tests/url/setters_tests.json +++ b/tests/wpt/web-platform-tests/url/setters_tests.json @@ -1118,12 +1118,12 @@ } }, { - "comment": "No percent-encoding at all (!); nuls, tabs, and newlines are removed", + "comment": "Simple percent-encoding; nuls, tabs, and newlines are removed", "href": "a:/", "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", "expected": { - "href": "a:/#\u0001\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", - "hash": "#\u0001\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé" + "href": "a:/#%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "hash": "#%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" } }, { @@ -1131,8 +1131,8 @@ "href": "http://example.net", "new_value": "%c3%89té", "expected": { - "href": "http://example.net/#%c3%89té", - "hash": "#%c3%89té" + "href": "http://example.net/#%c3%89t%C3%A9", + "hash": "#%c3%89t%C3%A9" } } ] diff --git a/tests/wpt/web-platform-tests/url/url-constructor.html b/tests/wpt/web-platform-tests/url/url-constructor.html index 8eacce6542f..490917c4f2f 100644 --- a/tests/wpt/web-platform-tests/url/url-constructor.html +++ b/tests/wpt/web-platform-tests/url/url-constructor.html @@ -37,9 +37,6 @@ function runURLTests(urltests) { var url = bURL(expected.input, expected.base) assert_equals(url.href, expected.href, "href") - if ("origin" in expected) { - assert_equals(url.origin, expected.origin, "origin") - } assert_equals(url.protocol, expected.protocol, "protocol") assert_equals(url.username, expected.username, "username") assert_equals(url.password, expected.password, "password") diff --git a/tests/wpt/web-platform-tests/url/url-origin.html b/tests/wpt/web-platform-tests/url/url-origin.html new file mode 100644 index 00000000000..f9d4b3d821d --- /dev/null +++ b/tests/wpt/web-platform-tests/url/url-origin.html @@ -0,0 +1,37 @@ +<!doctype html> +<meta charset=utf-8> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id=log></div> +<script> +function runURLOriginTests() { + var setup = async_test("Loading data…") + setup.step(function() { + var request = new XMLHttpRequest() + request.open("GET", "urltestdata.json") + request.send() + request.responseType = "json" + request.onload = setup.step_func(function() { + runURLTests(request.response) + setup.done() + }) + }) +} + +function bURL(url, base) { + return new URL(url, base || "about:blank") +} + +function runURLTests(urltests) { + for(var i = 0, l = urltests.length; i < l; i++) { + var expected = urltests[i] + if (typeof expected === "string" || !("origin" in expected)) continue + + test(function() { + var url = bURL(expected.input, expected.base) + assert_equals(url.origin, expected.origin, "origin") + }, "Origin parsing: <" + expected.input + "> against <" + expected.base + ">") + } +} +runURLOriginTests() +</script> diff --git a/tests/wpt/web-platform-tests/url/urltestdata.json b/tests/wpt/web-platform-tests/url/urltestdata.json index ed7c1de379d..50751582a19 100644 --- a/tests/wpt/web-platform-tests/url/urltestdata.json +++ b/tests/wpt/web-platform-tests/url/urltestdata.json @@ -1292,7 +1292,7 @@ { "input": "#β", "base": "http://example.org/foo/bar", - "href": "http://example.org/foo/bar#β", + "href": "http://example.org/foo/bar#%CE%B2", "origin": "http://example.org", "protocol": "http:", "username": "", @@ -1302,7 +1302,7 @@ "port": "", "pathname": "/foo/bar", "search": "", - "hash": "#β" + "hash": "#%CE%B2" }, { "input": "data:text/html,test#test", @@ -2161,7 +2161,7 @@ { "input": "http://www.google.com/foo?bar=baz# »", "base": "about:blank", - "href": "http://www.google.com/foo?bar=baz# »", + "href": "http://www.google.com/foo?bar=baz# %C2%BB", "origin": "http://www.google.com", "protocol": "http:", "username": "", @@ -2171,12 +2171,12 @@ "port": "", "pathname": "/foo", "search": "?bar=baz", - "hash": "# »" + "hash": "# %C2%BB" }, { "input": "data:test# »", "base": "about:blank", - "href": "data:test# »", + "href": "data:test# %C2%BB", "origin": "null", "protocol": "data:", "username": "", @@ -2186,7 +2186,7 @@ "port": "", "pathname": "test", "search": "", - "hash": "# »" + "hash": "# %C2%BB" }, { "input": "http://[www.google.com]/", @@ -4356,5 +4356,236 @@ "search": "", "searchParams": "", "hash": "" + }, + "# Percent encoding of fragments", + { + "input": "http://foo.bar/baz?qux#foo\bbar", + "base": "about:blank", + "href": "http://foo.bar/baz?qux#foo%08bar", + "origin": "http://foo.bar", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.bar", + "hostname": "foo.bar", + "port": "", + "pathname": "/baz", + "search": "?qux", + "searchParams": "", + "hash": "#foo%08bar" + }, + "# IPv4 parsing (via https://github.com/nodejs/node/pull/10317)", + { + "input": "http://192.168.257", + "base": "http://other.com/", + "href": "http://192.168.1.1/", + "origin": "http://192.168.1.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.1.1", + "hostname": "192.168.1.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.168.257.com", + "base": "http://other.com/", + "href": "http://192.168.257.com/", + "origin": "http://192.168.257.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.257.com", + "hostname": "192.168.257.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://256", + "base": "http://other.com/", + "href": "http://0.0.1.0/", + "origin": "http://0.0.1.0", + "protocol": "http:", + "username": "", + "password": "", + "host": "0.0.1.0", + "hostname": "0.0.1.0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://256.com", + "base": "http://other.com/", + "href": "http://256.com/", + "origin": "http://256.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "256.com", + "hostname": "256.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://999999999", + "base": "http://other.com/", + "href": "http://59.154.201.255/", + "origin": "http://59.154.201.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "59.154.201.255", + "hostname": "59.154.201.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://999999999.com", + "base": "http://other.com/", + "href": "http://999999999.com/", + "origin": "http://999999999.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "999999999.com", + "hostname": "999999999.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://10000000000", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://10000000000.com", + "base": "http://other.com/", + "href": "http://10000000000.com/", + "origin": "http://10000000000.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "10000000000.com", + "hostname": "10000000000.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://4294967295", + "base": "http://other.com/", + "href": "http://255.255.255.255/", + "origin": "http://255.255.255.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "255.255.255.255", + "hostname": "255.255.255.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://4294967296", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://0xffffffff", + "base": "http://other.com/", + "href": "http://255.255.255.255/", + "origin": "http://255.255.255.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "255.255.255.255", + "hostname": "255.255.255.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0xffffffff1", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://256.256.256.256", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://256.256.256.256.256", + "base": "http://other.com/", + "href": "http://256.256.256.256.256/", + "origin": "http://256.256.256.256.256", + "protocol": "http:", + "username": "", + "password": "", + "host": "256.256.256.256.256", + "hostname": "256.256.256.256.256", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# file URLs relative to other file URLs (via https://github.com/jsdom/whatwg-url/pull/60)", + { + "input": "pix/submit.gif", + "base": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html", + "href": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///C:/", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" } ] diff --git a/tests/wpt/web-platform-tests/vr/idlharness.html b/tests/wpt/web-platform-tests/vr/idlharness.html new file mode 100644 index 00000000000..958ca2dc425 --- /dev/null +++ b/tests/wpt/web-platform-tests/vr/idlharness.html @@ -0,0 +1,272 @@ +<!doctype html> +<html> + <head> + <meta charset=utf-8> + <title>WebVR IDL test</title> + <link rel="help" href="https://w3c.github.io/webvr/"> + + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/resources/WebIDLParser.js></script> + <script src=/resources/idlharness.js></script> +<script id="webvr_idl" type=text/plain> +// Archived version of the WebVR spec from +// https://w3c.github.io/webvr/archive/prerelease/1.1/index.html + +interface VRDisplay : EventTarget { + readonly attribute boolean isConnected; + readonly attribute boolean isPresenting; + + /** + * Dictionary of capabilities describing the VRDisplay. + */ + [SameObject] readonly attribute VRDisplayCapabilities capabilities; + + /** + * If this VRDisplay supports room-scale experiences, the optional + * stage attribute contains details on the room-scale parameters. + * The stageParameters attribute can not change between null + * and non-null once the VRDisplay is enumerated; however, + * the values within VRStageParameters may change after + * any call to VRDisplay.submitFrame as the user may re-configure + * their environment at any time. + */ + readonly attribute VRStageParameters? stageParameters; + + /** + * Return the current VREyeParameters for the given eye. + */ + VREyeParameters getEyeParameters(VREye whichEye); + + /** + * An identifier for this distinct VRDisplay. Used as an + * association point in the Gamepad API. + */ + readonly attribute unsigned long displayId; + + /** + * A display name, a user-readable name identifying it. + */ + readonly attribute DOMString displayName; + + /** + * Populates the passed VRFrameData with the information required to render + * the current frame. + */ + boolean getFrameData(VRFrameData frameData); + + /** + * Return a VRPose containing the future predicted pose of the VRDisplay + * when the current frame will be presented. The value returned will not + * change until JavaScript has returned control to the browser. + * + * The VRPose will contain the position, orientation, velocity, + * and acceleration of each of these properties. + */ + [NewObject] VRPose getPose(); + + /** + * Reset the pose for this display, treating its current position and + * orientation as the "origin/zero" values. VRPose.position, + * VRPose.orientation, and VRStageParameters.sittingToStandingTransform may be + * updated when calling resetPose(). This should be called in only + * sitting-space experiences. + */ + void resetPose(); + + /** + * z-depth defining the near plane of the eye view frustum + * enables mapping of values in the render target depth + * attachment to scene coordinates. Initially set to 0.01. + */ + attribute double depthNear; + + /** + * z-depth defining the far plane of the eye view frustum + * enables mapping of values in the render target depth + * attachment to scene coordinates. Initially set to 10000.0. + */ + attribute double depthFar; + + /** + * The callback passed to `requestAnimationFrame` will be called + * any time a new frame should be rendered. When the VRDisplay is + * presenting the callback will be called at the native refresh + * rate of the HMD. When not presenting this function acts + * identically to how window.requestAnimationFrame acts. Content should + * make no assumptions of frame rate or vsync behavior as the HMD runs + * asynchronously from other displays and at differing refresh rates. + */ + long requestAnimationFrame(FrameRequestCallback callback); + + /** + * Passing the value returned by `requestAnimationFrame` to + * `cancelAnimationFrame` will unregister the callback. + */ + void cancelAnimationFrame(long handle); + + /** + * Begin presenting to the VRDisplay. Must be called in response to a user gesture. + * Repeat calls while already presenting will update the VRLayers being displayed. + * If the number of values in the leftBounds/rightBounds arrays is not 0 or 4 for any of the passed layers the promise is rejected + * If the source of any of the layers is not present (null), the promise is rejected. + */ + Promise<void> requestPresent(sequence<VRLayer> layers); + + /** + * Stops presenting to the VRDisplay. + */ + Promise<void> exitPresent(); + + /** + * Get the layers currently being presented. + */ + sequence<VRLayer> getLayers(); + + /** + * The VRLayer provided to the VRDisplay will be captured and presented + * in the HMD. Calling this function has the same effect on the source + * canvas as any other operation that uses its source image, and canvases + * created without preserveDrawingBuffer set to true will be cleared. + */ + void submitFrame(); +}; + +typedef (HTMLCanvasElement or + OffscreenCanvas) VRSource; + +dictionary VRLayer { + VRSource? source = null; + + sequence<float> leftBounds = []; + sequence<float> rightBounds = []; +}; + +interface VRDisplayCapabilities { + readonly attribute boolean hasPosition; + readonly attribute boolean hasOrientation; + readonly attribute boolean hasExternalDisplay; + readonly attribute boolean canPresent; + readonly attribute unsigned long maxLayers; +}; + +enum VREye { + "left", + "right" +}; + +interface VRFieldOfView { + readonly attribute double upDegrees; + readonly attribute double rightDegrees; + readonly attribute double downDegrees; + readonly attribute double leftDegrees; +}; + +interface VRPose { + readonly attribute Float32Array? position; + readonly attribute Float32Array? linearVelocity; + readonly attribute Float32Array? linearAcceleration; + + readonly attribute Float32Array? orientation; + readonly attribute Float32Array? angularVelocity; + readonly attribute Float32Array? angularAcceleration; +}; + +[Constructor] +interface VRFrameData { + readonly attribute DOMHighResTimeStamp timestamp; + + readonly attribute Float32Array leftProjectionMatrix; + readonly attribute Float32Array leftViewMatrix; + + readonly attribute Float32Array rightProjectionMatrix; + readonly attribute Float32Array rightViewMatrix; + + readonly attribute VRPose pose; +}; + +interface VREyeParameters { + readonly attribute Float32Array offset; + + [SameObject] readonly attribute VRFieldOfView fieldOfView; + + readonly attribute unsigned long renderWidth; + readonly attribute unsigned long renderHeight; +}; + +interface VRStageParameters { + readonly attribute Float32Array sittingToStandingTransform; + + readonly attribute float sizeX; + readonly attribute float sizeZ; +}; + +partial interface Navigator { + Promise<sequence<VRDisplay>> getVRDisplays(); + readonly attribute FrozenArray<VRDisplay> activeVRDisplays; + readonly attribute boolean vrEnabled; +}; + +enum VRDisplayEventReason { + "mounted", + "navigation", + "requested", + "unmounted" +}; + +[Constructor(DOMString type, VRDisplayEventInit eventInitDict)] +interface VRDisplayEvent : Event { + readonly attribute VRDisplay display; + readonly attribute VRDisplayEventReason? reason; +}; + +dictionary VRDisplayEventInit : EventInit { + required VRDisplay display; + VRDisplayEventReason reason; +}; + +partial interface Window { + attribute EventHandler onvrdisplayconnect; + attribute EventHandler onvrdisplaydisconnect; + attribute EventHandler onvrdisplayactivate; + attribute EventHandler onvrdisplaydeactivate; + attribute EventHandler onvrdisplayblur; + attribute EventHandler onvrdisplayfocus; + attribute EventHandler onvrdisplaypresentchange; +}; + +partial interface HTMLIFrameElement { + attribute boolean allowvr; +}; + +partial interface Gamepad { + readonly attribute unsigned long displayId; +}; +</script> + </head> + <body> + <h1 class="instructions">Description</h1> + <p class="instructions"> + This test verifies that implementations of the WebVR API match its WebIDL definition. + </p> + + <div id='log'></div> + + <script> + setup( () => { + var idl_array = new IdlArray(); + idl_array.add_untested_idls("[PrimaryGlobal] interface Window {};"); + idl_array.add_untested_idls("interface Navigator {};"); + idl_array.add_untested_idls("interface Event {};"); + idl_array.add_untested_idls("interface EventTarget {};"); + idl_array.add_untested_idls("interface HTMLIFrameElement {};"); + idl_array.add_untested_idls("interface Gamepad {};"); + + idl_array.add_idls(document.getElementById("webvr_idl").textContent); + + idl_array.test(); + done(); + }, {explicit_done: true}); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/webmessaging/OWNERS b/tests/wpt/web-platform-tests/webmessaging/OWNERS index 94f8bf98eb4..b7d80e92a1d 100644 --- a/tests/wpt/web-platform-tests/webmessaging/OWNERS +++ b/tests/wpt/web-platform-tests/webmessaging/OWNERS @@ -1,5 +1,5 @@ @zqzhang -@plehegar @aogilvie @Ms2ger @jdm +@mkruisselbrink diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/basics.html b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/basics.html new file mode 100644 index 00000000000..ed16e32f543 --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/basics.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +async_test(t => { + let c1 = new BroadcastChannel('eventType'); + let c2 = new BroadcastChannel('eventType'); + + c2.onmessage = t.step_func(e => { + assert_true(e instanceof MessageEvent); + assert_equals(e.target, c2); + assert_equals(e.type, 'message'); + assert_equals(e.origin, location.origin, 'origin'); + assert_equals(e.data, 'hello world'); + assert_equals(e.source, null, 'source'); + t.done(); + }); + c1.postMessage('hello world'); + }, 'postMessage results in correct event'); + +async_test(t => { + let c1 = new BroadcastChannel('order'); + let c2 = new BroadcastChannel('order'); + let c3 = new BroadcastChannel('order'); + + let events = []; + let doneCount = 0; + let handler = t.step_func(e => { + events.push(e); + if (e.data == 'done') { + doneCount++; + if (doneCount == 2) { + assert_equals(events.length, 6); + assert_equals(events[0].target, c2, 'target for event 0'); + assert_equals(events[0].data, 'from c1'); + assert_equals(events[1].target, c3, 'target for event 1'); + assert_equals(events[1].data, 'from c1'); + assert_equals(events[2].target, c1, 'target for event 2'); + assert_equals(events[2].data, 'from c3'); + assert_equals(events[3].target, c2, 'target for event 3'); + assert_equals(events[3].data, 'from c3'); + assert_equals(events[4].target, c1, 'target for event 4'); + assert_equals(events[4].data, 'done'); + assert_equals(events[5].target, c3, 'target for event 5'); + assert_equals(events[5].data, 'done'); + t.done(); + } + } + }); + c1.onmessage = handler; + c2.onmessage = handler; + c3.onmessage = handler; + + c1.postMessage('from c1'); + c3.postMessage('from c3'); + c2.postMessage('done'); + }, 'messages are delivered in port creation order'); + +async_test(t => { + let c1 = new BroadcastChannel('closed'); + let c2 = new BroadcastChannel('closed'); + let c3 = new BroadcastChannel('closed'); + + c2.onmessage = t.unreached_func(); + c2.close(); + c3.onmessage = t.step_func(() => t.done()); + c1.postMessage('test'); + }, 'messages aren\'t delivered to a closed port'); + +async_test(t => { + let c1 = new BroadcastChannel('create-in-onmessage'); + let c2 = new BroadcastChannel('create-in-onmessage'); + + c2.onmessage = t.step_func(e => { + assert_equals(e.data, 'first'); + c2.close(); + let c3 = new BroadcastChannel('create-in-onmessage'); + c3.onmessage = t.step_func(event => { + assert_equals(event.data, 'done'); + t.done(); + }); + c1.postMessage('done'); + }); + c1.postMessage('first'); + c2.postMessage('second'); + }, 'closing and creating channels during message delivery works correctly'); + +// TODO(mek): Depending on https://github.com/whatwg/html/issues/1371 adjust +// this test to match the correct behavior. +async_test(t => { + let c1 = new BroadcastChannel('close-in-onmessage'); + let c2 = new BroadcastChannel('close-in-onmessage'); + let c3 = new BroadcastChannel('close-in-onmessage'); + let events = []; + c1.onmessage = e => events.push('c1: ' + e.data); + c2.onmessage = e => events.push('c2: ' + e.data); + c3.onmessage = e => events.push('c3: ' + e.data); + + // c2 closes itself when it receives the first message + c2.addEventListener('message', e => { + c2.close(); + }); + + c3.addEventListener('message', t.step_func(e => { + if (e.data == 'done') { + assert_array_equals(events, [ + 'c2: first', + 'c3: first', + 'c2: done', + 'c3: done']); + t.done(); + } + })); + c1.postMessage('first'); + c1.postMessage('done'); + }, 'Closing a channel in onmessage doesn\'t cancel already queued events'); + +</script> diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/blobs.html b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/blobs.html new file mode 100644 index 00000000000..8b50153fdb8 --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/blobs.html @@ -0,0 +1,79 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +async_test(t => { + const c1 = new BroadcastChannel('blob'); + const c2 = new BroadcastChannel('blob'); + const c3 = new BroadcastChannel('blob'); + + let readCount = 0; + c2.onmessage = t.step_func(e => { + // check blob + assert_true('blob' in e.data); + assert_true(e.data.blob instanceof Blob); + assert_equals(e.data.blob.size, 6); + const reader = new FileReader(); + reader.onerror = t.unreached_func(); + reader.onload = t.step_func(() => { + assert_equals(reader.result, 'foobar'); + if (++readCount == 2) + t.done(); + }); + reader.readAsText(e.data.blob); + }); + c3.onmessage = c2.onmessage; + c1.postMessage({blob: new Blob(['foo', 'bar'])}); + }, 'Blobs work on BroadcastChannel'); + +async_test(t => { + const c1 = new BroadcastChannel('blobworker'); + const c2 = new BroadcastChannel('blobworker'); + const events = []; + + const verifyEvents = function() { + assert_equals(events.length, 5); + assert_equals(events[0], 'from worker'); + assert_equals(events[1], 'from worker'); + assert_true(events[2].blob instanceof Blob); + assert_equals(events[2].blob.size, 11); + assert_true(events[3].blob instanceof Blob); + assert_equals(events[3].blob.size, 11); + assert_equals(events[4], 'done'); + const reader = new FileReader(); + reader.onerror = t.unreached_func(); + reader.onload = t.step_func(() => { + assert_equals(reader.result, 'hello-world'); + t.done(); + }); + reader.readAsText(events[3].blob); + }; + + let receivedDone = false; + let receivedWorkerDone = false; + + c1.onmessage = e => events.push(e.data); + c2.onmessage = e => events.push(e.data); + c2.addEventListener('message', t.step_func(e => { + if (e.data.blob) + c1.postMessage('done'); + if (e.data === 'done') + receivedDone = true; + if (receivedDone && receivedWorkerDone) + verifyEvents(); + })); + + const worker = new Worker('resources/worker.js'); + worker.onmessage = t.step_func(e => { + receivedWorkerDone = true; + if (receivedDone && receivedWorkerDone) + verifyEvents(); + }); + worker.postMessage({channel: 'blobworker'}); + worker.postMessage({blob: ['hello-world']}); + + }, 'Blobs work with workers on BroadcastChannel'); + +</script> diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/interface.html b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/interface.html new file mode 100644 index 00000000000..a552563ed66 --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/interface.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +test(() => assert_throws(new TypeError(), () => new BroadcastChannel()), + 'Should throw if no name is provided'); + +test(() => { + let c = new BroadcastChannel(null); + assert_equals(c.name, 'null'); + }, 'Null name should not throw'); + +test(() => { + let c = new BroadcastChannel(undefined); + assert_equals(c.name, 'undefined'); + }, 'Undefined name should not throw'); + +test(() => { + let c = new BroadcastChannel('fooBar'); + assert_equals(c.name, 'fooBar'); + }, 'Non-empty name should not throw'); + +test(() => { + let c = new BroadcastChannel(123); + assert_equals(c.name, '123'); + }, 'Non-string name should not throw'); + +test(() => { + let c = new BroadcastChannel(''); + assert_throws(new TypeError(), () => c.postMessage()); + }, 'postMessage without parameters should throw'); + +test(() => { + let c = new BroadcastChannel(''); + c.postMessage(null); + }, 'postMessage with null should not throw'); + +test(() => { + let c = new BroadcastChannel(''); + c.close(); + }, 'close should not throw'); + +test(() => { + let c = new BroadcastChannel(''); + c.close(); + c.close(); + }, 'close should not throw when called multiple times'); + +test(() => { + let c = new BroadcastChannel(''); + c.close(); + assert_throws('InvalidStateError', () => c.postMessage('')); + }, 'postMessage after close should throw'); + +test(() => { + let c = new BroadcastChannel(''); + assert_not_equals(c.onmessage, undefined); + }, 'BroadcastChannel should have an onmessage event'); + +test(() => { + let c = new BroadcastChannel(''); + assert_throws('DataCloneError', () => c.postMessage(Symbol())); + }, 'postMessage should throw with uncloneable data'); + +test(() => { + let c = new BroadcastChannel(''); + c.close(); + assert_throws('InvalidStateError', () => c.postMessage(Symbol())); + }, 'postMessage should throw InvalidStateError after close, even with uncloneable data'); + +</script> diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/resources/sandboxed.html b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/resources/sandboxed.html new file mode 100644 index 00000000000..e32962cdfd4 --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/resources/sandboxed.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script> +try { + let c = new BroadcastChannel('foo'); + parent.postMessage('Created', '*'); +} catch (e) { + parent.postMessage('Exception: ' + e.name, '*'); +} +</script> diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/resources/worker.js b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/resources/worker.js new file mode 100644 index 00000000000..2f0e4eaa34c --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/resources/worker.js @@ -0,0 +1,26 @@ +var c; + +function handler(e, reply) { + if (e.data.ping) { + c.postMessage(e.data.ping); + return; + } + if (e.data.blob) { + c.postMessage({blob: new Blob(e.data.blob)}); + } + c = new BroadcastChannel(e.data.channel); + let messages = []; + c.onmessage = e => { + messages.push(e.data); + if (e.data == 'done') + reply(messages); + }; + c.postMessage('from worker'); +} + +onmessage = e => handler(e, postMessage); + +onconnect = e => { + let port = e.ports[0]; + port.onmessage = e => handler(e, msg => port.postMessage(msg)); +}; diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/sandbox.html b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/sandbox.html new file mode 100644 index 00000000000..aedf3c0d6fe --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/sandbox.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Creating BroadcastChannel in an opaque origin</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +async_test(t => { + self.onmessage = t.step_func(e => { + assert_equals(e.data, 'Created'); + t.done(); + }); + }); +</script> +<iframe sandbox="allow-scripts" src="resources/sandboxed.html"></iframe> +</body> diff --git a/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/workers.html b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/workers.html new file mode 100644 index 00000000000..7ccbd395778 --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/broadcastchannel/workers.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +async_test(t => { + let c1 = new BroadcastChannel('worker'); + let c2 = new BroadcastChannel('worker'); + let events = []; + + c1.onmessage = e => events.push(e); + c2.onmessage = e => events.push(e); + + let doneCount = 0; + c2.addEventListener('message', t.step_func(e => { + if (e.data == 'from worker') { + c2.postMessage('from c2'); + c1.postMessage('done'); + } else if (e.data == 'done') { + assert_equals(events.length, 4); + assert_equals(events[0].data, 'from worker'); + assert_equals(events[0].target, c1); + assert_equals(events[1].data, 'from worker'); + assert_equals(events[1].target, c2); + assert_equals(events[2].data, 'from c2'); + assert_equals(events[3].data, 'done'); + if (++doneCount == 2) t.done(); + } + })); + + let worker = new Worker('resources/worker.js'); + worker.onmessage = t.step_func(e => { + assert_array_equals(e.data, ['from c2', 'done']); + if (++doneCount == 2) t.done(); + }); + worker.postMessage({channel: 'worker'}); + + }, 'BroadcastChannel works in workers'); + +async_test(t => { + let c1 = new BroadcastChannel('shared worker'); + let c2 = new BroadcastChannel('shared worker'); + let events = []; + + c1.onmessage = e => events.push(e); + c2.onmessage = e => events.push(e); + + let doneCount = 0; + c2.addEventListener('message', t.step_func(e => { + if (e.data == 'from worker') { + c2.postMessage('from c2'); + c1.postMessage('done'); + } else if (e.data == 'done') { + assert_equals(events.length, 4); + assert_equals(events[0].data, 'from worker'); + assert_equals(events[0].target, c1); + assert_equals(events[1].data, 'from worker'); + assert_equals(events[1].target, c2); + assert_equals(events[2].data, 'from c2'); + assert_equals(events[3].data, 'done'); + if (++doneCount == 2) t.done(); + } + })); + + let worker = new SharedWorker('resources/worker.js'); + worker.port.onmessage = t.step_func(e => { + assert_array_equals(e.data, ['from c2', 'done']); + if (++doneCount == 2) t.done(); + }); + worker.port.postMessage({channel: 'shared worker'}); + + }, 'BroadcastChannel works in shared workers'); + +async_test(t => { + let c = new BroadcastChannel('worker-close'); + let events = []; + + c.onmessage = e => events.push('c1: ' + e.data); + + let worker = new Worker('resources/worker.js'); + worker.onmessage = t.step_func(e => { + assert_array_equals(events, ['c1: from worker', 'c2: echo'], + 'messages in document'); + assert_array_equals(e.data, ['done'], 'messages in worker'); + t.done(); + }); + + c.addEventListener('message', e => { + if (e.data == 'from worker') { + c.close(); + if (self.gc) self.gc(); + window.setTimeout(() => { + let c2 = new BroadcastChannel('worker-close'); + c2.onmessage = e => { + events.push('c2: ' + e.data); + c2.postMessage('done'); + }; + worker.postMessage({ping: 'echo'}); + }, 1); + } + }); + + worker.postMessage({channel: 'worker-close'}); + + }, 'Closing and re-opening a channel works.'); + +</script> diff --git a/tests/wpt/web-platform-tests/webmessaging/message-channels/close.html b/tests/wpt/web-platform-tests/webmessaging/message-channels/close.html new file mode 100644 index 00000000000..912aacda52c --- /dev/null +++ b/tests/wpt/web-platform-tests/webmessaging/message-channels/close.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<link rel="help" href="https://html.spec.whatwg.org/multipage/comms.html#dom-messageport-close"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +// How long (in ms) these tests should wait before deciding no further messages +// will be received. +const time_to_wait_for_messages = 100; + +async_test(t => { + const c = new MessageChannel(); + c.port1.onmessage = t.unreached_func('Should not have delivered message'); + c.port1.close(); + c.port2.postMessage('TEST'); + setTimeout(t.step_func_done(), time_to_wait_for_messages); + }, 'Message sent to closed port should not arrive.'); + +async_test(t => { + const c = new MessageChannel(); + c.port1.onmessage = t.unreached_func('Should not have delivered message'); + c.port2.close(); + c.port2.postMessage('TEST'); + setTimeout(t.step_func_done(), time_to_wait_for_messages); + }, 'Message sent from closed port should not arrive.'); + +async_test(t => { + const c = new MessageChannel(); + c.port1.onmessage = t.unreached_func('Should not have delivered message'); + c.port1.close(); + const c2 = new MessageChannel(); + c2.port1.onmessage = t.step_func(e => { + e.ports[0].postMessage('TESTMSG'); + setTimeout(t.step_func_done(), time_to_wait_for_messages); + }); + c2.port2.postMessage('TEST', [c.port2]); + }, 'Message sent to closed port from transferred port should not arrive.'); + +async_test(t => { + const c = new MessageChannel(); + c.port1.onmessage = t.unreached_func('Should not have delivered message'); + c.port2.close(); + const c2 = new MessageChannel(); + c2.port1.onmessage = t.step_func(e => { + e.ports[0].postMessage('TESTMSG'); + setTimeout(t.step_func_done(), time_to_wait_for_messages); + }); + c2.port2.postMessage('TEST', [c.port2]); + }, 'Message sent from transferred closed port should not arrive.'); + +async_test(t => { + const c = new MessageChannel(); + let isClosed = false; + c.port1.onmessage = t.step_func_done(e => { + assert_true(isClosed); + assert_equals(e.data, 'TEST'); + }); + c.port2.postMessage('TEST'); + c.port2.close(); + isClosed = true; + }, 'Inflight messages should be delivered even when sending port is closed afterwards.'); + +async_test(t => { + const c = new MessageChannel(); + c.port1.onmessage = t.step_func_done(e => { + if (e.data == 'DONE') t.done(); + assert_equals(e.data, 'TEST'); + c.port1.close(); + }); + c.port2.postMessage('TEST'); + c.port2.postMessage('DONE'); + }, 'Close in onmessage should not cancel inflight messages.'); + +</script> diff --git a/tests/wpt/web-platform-tests/webmessaging/with-ports/016.html b/tests/wpt/web-platform-tests/webmessaging/with-ports/016.html index 7257c95d0d7..51cadec7c17 100644 --- a/tests/wpt/web-platform-tests/webmessaging/with-ports/016.html +++ b/tests/wpt/web-platform-tests/webmessaging/with-ports/016.html @@ -2,13 +2,18 @@ <title>origin of the script that invoked the method, data:</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<iframe src="data:text/html,"></iframe> +<iframe src="data:text/html,<script>onmessage = function(e) { parent.postMessage(e.origin, '*'); }; parent.postMessage('loaded', '*');</script>"></iframe> <div id=log></div> <script> async_test(function() { - window[0].postMessage('', '*', []); - window[0].onmessage = this.step_func(function(e) { - assert_equals(e.origin, location.protocol + '//' + location.host); + onmessage = this.step_func(function(e) { + if (e.data === 'loaded') { + window[0].postMessage('', '*'); + return; + } + + assert_equals(e.data, location.protocol + '//' + location.host); + assert_equals(e.origin, 'null'); assert_array_equals(e.ports, []); this.done(); }); diff --git a/tests/wpt/web-platform-tests/webmessaging/with-ports/019.html b/tests/wpt/web-platform-tests/webmessaging/with-ports/019.html index 2c65d58169f..e9de6c36e1f 100644 --- a/tests/wpt/web-platform-tests/webmessaging/with-ports/019.html +++ b/tests/wpt/web-platform-tests/webmessaging/with-ports/019.html @@ -5,12 +5,14 @@ <iframe src="../without-ports/019-1.html"></iframe> <div id=log></div> <script> -async_test(function() { - window[0].postMessage('', location.protocol.toUpperCase() + '//' + location.host.toUpperCase() + '/', []); - window[0].onmessage = this.step_func(function(e) { - assert_equals(e.origin, location.protocol + '//' + location.host); - assert_array_equals(e.ports, []); - this.done(); +async_test(function(test) { + onload = test.step_func(function() { + window[0].postMessage('', location.protocol.toUpperCase() + '//' + location.host.toUpperCase() + '/', []); + window[0].onmessage = test.step_func(function(e) { + assert_equals(e.origin, location.protocol + '//' + location.host); + assert_array_equals(e.ports, []); + test.done(); + }); }); }); </script> diff --git a/tests/wpt/web-platform-tests/webmessaging/with-ports/023.html b/tests/wpt/web-platform-tests/webmessaging/with-ports/023.html index 664289585da..da6a5c49a44 100644 --- a/tests/wpt/web-platform-tests/webmessaging/with-ports/023.html +++ b/tests/wpt/web-platform-tests/webmessaging/with-ports/023.html @@ -4,12 +4,8 @@ <script src="/resources/testharnessreport.js"></script> <div id=log></div> <script> -async_test(function(t) { - postMessage('', '*', null); - onmessage = t.step_func(function(e) { - assert_array_equals(e.ports, []); - this.done(); - }); +test(function(t) { + assert_throws(new TypeError, () => postMessage('', '*', null)); }); </script> diff --git a/tests/wpt/web-platform-tests/webmessaging/without-ports/016.html b/tests/wpt/web-platform-tests/webmessaging/without-ports/016.html index da1d8e59599..51cadec7c17 100644 --- a/tests/wpt/web-platform-tests/webmessaging/without-ports/016.html +++ b/tests/wpt/web-platform-tests/webmessaging/without-ports/016.html @@ -2,13 +2,18 @@ <title>origin of the script that invoked the method, data:</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<iframe src="data:text/html,"></iframe> +<iframe src="data:text/html,<script>onmessage = function(e) { parent.postMessage(e.origin, '*'); }; parent.postMessage('loaded', '*');</script>"></iframe> <div id=log></div> <script> async_test(function() { - window[0].postMessage('', '*'); - window[0].onmessage = this.step_func(function(e) { - assert_equals(e.origin, location.protocol + '//' + location.host); + onmessage = this.step_func(function(e) { + if (e.data === 'loaded') { + window[0].postMessage('', '*'); + return; + } + + assert_equals(e.data, location.protocol + '//' + location.host); + assert_equals(e.origin, 'null'); assert_array_equals(e.ports, []); this.done(); }); diff --git a/tests/wpt/web-platform-tests/webmessaging/without-ports/019.html b/tests/wpt/web-platform-tests/webmessaging/without-ports/019.html index f271a9e716a..38e7ca230ed 100644 --- a/tests/wpt/web-platform-tests/webmessaging/without-ports/019.html +++ b/tests/wpt/web-platform-tests/webmessaging/without-ports/019.html @@ -5,12 +5,14 @@ <iframe src="../without-ports/019-1.html"></iframe> <div id=log></div> <script> -async_test(function() { - window[0].postMessage('', location.protocol.toUpperCase() + '//' + location.host.toUpperCase() + '/'); - window[0].onmessage = this.step_func(function(e) { - assert_equals(e.origin, location.protocol + '//' + location.host); - assert_array_equals(e.ports, []); - this.done(); +async_test(function(test) { + onload = test.step_func(function() { + window[0].postMessage('', location.protocol.toUpperCase() + '//' + location.host.toUpperCase() + '/'); + window[0].onmessage = test.step_func(function(e) { + assert_equals(e.origin, location.protocol + '//' + location.host); + assert_array_equals(e.ports, []); + test.done(); + }); }); }); </script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDataChannelEvent-constructor.html b/tests/wpt/web-platform-tests/webrtc/RTCDataChannelEvent-constructor.html new file mode 100644 index 00000000000..997f65c4380 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/RTCDataChannelEvent-constructor.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>RTCDataChannelEvent constructor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + assert_equals(RTCDataChannelEvent.length, 2); + assert_throws( + new TypeError(), + function() { new RTCDataChannelEvent('type'); } + ); +}, 'RTCDataChannelEvent constructor without a required argument.'); + +test(function() { + assert_throws( + new TypeError(), + function() { new RTCDataChannelEvent('type', { channel: null }); } + ); +}, 'RTCDataChannelEvent constructor with channel passed as null.'); + +test(function() { + assert_throws( + new TypeError(), + function() { new RTCDataChannelEvent('type', { channel: undefined }); } + ); +}, 'RTCDataChannelEvent constructor with a channel passed as undefined.'); + +test(function() { + var pc = new RTCPeerConnection(); + var c = pc.createDataChannel(''); + var e = new RTCDataChannelEvent('type', { channel: c }); + assert_true(e instanceof RTCDataChannelEvent); + assert_equals(e.channel, c); +}, 'RTCDataChannelEvent constructor with full arguments.'); +</script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnectionIceEvent-constructor.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnectionIceEvent-constructor.html new file mode 100644 index 00000000000..22d9d4bb591 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnectionIceEvent-constructor.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>RTCPeerConnectionIceEvent constructor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + assert_equals(RTCPeerConnectionIceEvent.length, 1); + var e = new RTCPeerConnectionIceEvent('type'); + assert_equals(e.candidate, null); + assert_false(e.bubbles); + assert_false(e.cancelable); +}, 'RTCPeerConnectionIceEvent constructor with no candidate provided.'); + +test(function() { + var e = new RTCPeerConnectionIceEvent('type', { candidate: null }); + assert_equals(e.candidate, null); +}, 'RTCPeerConnectionIceEvent constructor with candidate passed as null.'); + +test(function() { + var e = new RTCPeerConnectionIceEvent('type', { candidate: undefined }); + assert_equals(e.candidate, null); +}, 'RTCPeerConnectionIceEvent constructor with candidate passed as undefined.'); + +test(function() { + var c = new RTCIceCandidate({ candidate: 'candidate', sdpMid: 'sdpMid', sdpMLineIndex: 1 }); + var e = new RTCPeerConnectionIceEvent('type', { candidate: c, url: 'url', bubbles: true, cancelable: true}); + assert_equals(e.type, 'type'); + assert_equals(e.candidate, c); + // assert_equals(e.url, 'url'); + assert_true(e.bubbles); + assert_true(e.cancelable); +}, 'RTCPeerConnectionIceEvent constructor with full arguments.'); +</script> diff --git a/tests/wpt/web-platform-tests/webrtc/simplecall.html b/tests/wpt/web-platform-tests/webrtc/simplecall.html index 94d5ea6f761..23f13d4675c 100644 --- a/tests/wpt/web-platform-tests/webrtc/simplecall.html +++ b/tests/wpt/web-platform-tests/webrtc/simplecall.html @@ -36,6 +36,14 @@ property to true in Firefox. var gFirstConnection = null; var gSecondConnection = null; + // if the remote video gets video data that implies the negotiation + // as well as the ICE and DTLS connection are up. + document.getElementById('remote-view') + .addEventListener('loadedmetadata', function() { + // Call negotiated: done. + test.done(); + }); + function getUserMediaOkCallback(localStream) { gFirstConnection = new RTCPeerConnection(null); gFirstConnection.onicecandidate = onIceCandidateToFirst; @@ -78,22 +86,15 @@ property to true in Firefox. var parsedAnswer = new RTCSessionDescription({ type: 'answer', sdp: answerSdp }); gFirstConnection.setRemoteDescription(parsedAnswer); - - // Call negotiated: done. - test.done(); }; var onIceCandidateToFirst = test.step_func(function(event) { // If event.candidate is null = no more candidates. - if (event.candidate) { - gSecondConnection.addIceCandidate(event.candidate); - } + gSecondConnection.addIceCandidate(event.candidate); }); var onIceCandidateToSecond = test.step_func(function(event) { - if (event.candidate) { - gFirstConnection.addIceCandidate(event.candidate); - } + gFirstConnection.addIceCandidate(event.candidate); }); var onRemoteStream = test.step_func(function(event) { diff --git a/tests/wpt/web-platform-tests/websockets/OWNERS b/tests/wpt/web-platform-tests/websockets/OWNERS index a2cbe188a5c..7c26b48d35e 100644 --- a/tests/wpt/web-platform-tests/websockets/OWNERS +++ b/tests/wpt/web-platform-tests/websockets/OWNERS @@ -1,6 +1,5 @@ @kristijanburnik @zcorpan -@plehegar @zqzhang @Jxck @jdm diff --git a/tests/wpt/web-platform-tests/webstorage/OWNERS b/tests/wpt/web-platform-tests/webstorage/OWNERS index 3b7fb5d888f..ccd94c4f332 100644 --- a/tests/wpt/web-platform-tests/webstorage/OWNERS +++ b/tests/wpt/web-platform-tests/webstorage/OWNERS @@ -3,7 +3,6 @@ @zqzhang @chunywang @kangxu -@plehegar @ibelem @jdm @Ms2ger diff --git a/tests/wpt/web-platform-tests/workers/opaque-origin.html b/tests/wpt/web-platform-tests/workers/opaque-origin.html new file mode 100644 index 00000000000..0474b970c96 --- /dev/null +++ b/tests/wpt/web-platform-tests/workers/opaque-origin.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +// Sandboxed iframe forwards messages from its worker, this translates those +// messages back to something fetch_tests_from_worker can parse. +const channel = new MessageChannel(); +onmessage = e => { + channel.port2.postMessage(e.data); +}; +fetch_tests_from_worker(channel.port1); +</script> +<iframe sandbox="allow-scripts" src="support/sandboxed-tests.html?pipe=sub"></iframe> +</body> diff --git a/tests/wpt/web-platform-tests/workers/support/sandboxed-tests.html b/tests/wpt/web-platform-tests/workers/support/sandboxed-tests.html new file mode 100644 index 00000000000..811c925f56f --- /dev/null +++ b/tests/wpt/web-platform-tests/workers/support/sandboxed-tests.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<script> +const channel = new BroadcastChannel('echochannel'); +channel.onmessage = e => channel.postMessage(e.data); +</script> +<div id='workersrc' style='display:none'> +importScripts("http://{{host}}:{{ports[http][0]}}/resources/testharness.js"); +onmessage = e => { + const external_blob = e.data.blob; + const external_blob_url = e.data.url; + + test(t => { + assert_equals('null', self.location.origin); + }, 'Worker has an opaque origin.'); + + async_test(t => { + const r = new FileReader(); + r.onloadend = t.step_func_done(e => assert_equals(r.result, 'from worker')); + r.readAsText(new Blob(['from worker'])); + }, 'Worker can read its own blobs.'); + + async_test(t => { + const r = new FileReader(); + r.onloadend = t.step_func_done(e => assert_equals(r.result, 'from page')); + r.readAsText(external_blob); + }, 'Worker can read its owners blobs.'); + + async_test(t => { + const request = new XMLHttpRequest(); + request.open('GET', external_blob_url); + request.onreadystatechange = t.step_func(() => { + if (request.readyState == 4) { + assert_equals(request.responseText, 'from page'); + t.done(); + } + }); + request.send(); + }, 'Worker can XHR fetch a blob.'); + + promise_test(t => + fetch(external_blob_url).then(r => r.text()).then(text => assert_equals(text, 'from page')) + , 'Worker can fetch a blob.'); + + async_test(t => { + const channel = new BroadcastChannel('echochannel'); + channel.onmessage = t.step_func_done(e => assert_equals('ping', e.data)); + channel.postMessage('ping'); + }, 'Worker can access BroadcastChannel'); + done(); +}; +</div> +<script> +// Create a worker with a blob URL to get a same opaque origin worker. +const b = new Blob([document.getElementById('workersrc').textContent]); +const url = URL.createObjectURL(b); +const worker = new Worker(url); +// Pass back any messages from the worker to our parent to collect test results. +worker.onmessage = e => { + parent.postMessage(e.data, '*'); +}; + +// Send test data to the worker. +const b2 = new Blob(['from page']); +const url2 = URL.createObjectURL(b2); +worker.postMessage({url: url2, blob: b2}); +</script> |