aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2015-04-16 12:51:35 +0200
committerMs2ger <ms2ger@gmail.com>2015-04-16 18:58:53 +0200
commit2d49203b9c8f69cd169aafb87391e3b4ab82079c (patch)
tree2fd2d6551724a56f58bcc9d2e635717ae252d509
parent53d2432c90ab9ef171dfbef8e22ed3f58fcef8f0 (diff)
downloadservo-2d49203b9c8f69cd169aafb87391e3b4ab82079c.tar.gz
servo-2d49203b9c8f69cd169aafb87391e3b4ab82079c.zip
Update web-platform-tests to revision 000905d008db2538360020335bc2dbba16d322b5.
-rw-r--r--tests/wpt/metadata/MANIFEST.json242
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/send-usp.html.ini50
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini50
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html.ini3
-rw-r--r--tests/wpt/metadata/dom/nodes/getElementsByClassName-31.htm.ini5
-rw-r--r--tests/wpt/metadata/encoding/api-replacement-encodings.html.ini1
-rw-r--r--tests/wpt/metadata/encoding/textencoder-constructor-non-utf.html.ini1
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/window-properties.html.ini90
-rw-r--r--tests/wpt/metadata/html/dom/reflection-misc.html.ini840
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/focus.html.ini5
-rw-r--r--tests/wpt/metadata/mozilla-sync1
-rw-r--r--tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js.ini5
-rw-r--r--tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html.ini3
-rw-r--r--tests/wpt/mozilla/meta/mozilla/document_characterSet_long.html.ini1
-rw-r--r--tests/wpt/mozilla/meta/mozilla/document_characterSet_short.html.ini1
-rw-r--r--tests/wpt/mozilla/meta/mozilla/enabled_disabled_selectors.html.ini2
-rw-r--r--tests/wpt/mozilla/meta/mozilla/windowproxy.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbdatabase_createObjectStore8-parameters.htm1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-aborted.js12
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-abortedonmain.js6
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js10
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overridesexpires.js15
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-runner.js3
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout.js12
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.html10
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.js39
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.worker.js5
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-aborted.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overrides.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-simple.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-twice.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html3
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html1
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/buildInlineWorker.js14
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Node-replaceChild.html13
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/window-properties.html40
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-misc.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html13
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/common.https.html51
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/blank.html2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/common-worker.js15
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/fetch-status.py2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/iframe.html13
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/simple.txt1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/test-helpers.js37
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/resources/testharness-helpers.js163
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-add.js145
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-delete.js120
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-match.js501
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-put.js324
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-keys.js36
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-match.js123
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage.js192
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-add.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-delete.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-match.https.html10
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-put.https.html10
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-keys.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-match.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-add.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-delete.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-match.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-keys.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-match.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/window/sandboxed-iframes.https.html66
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-add.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-delete.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-match.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-put.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-keys.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-match.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage.https.html8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-workers/resources/test-helpers.js222
-rw-r--r--tests/wpt/web-platform-tests/service-workers/tools/blink-import.py204
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/sourcefile.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/utils.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py2
-rw-r--r--tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/close/close-basic.html2
-rw-r--r--tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/readyState/003.html5
-rw-r--r--tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/url/003.html4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js12
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html6
100 files changed, 3807 insertions, 201 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 5584274dfb0..59233ae40ce 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -710,6 +710,14 @@
"url": "/html/semantics/forms/the-input-element/file-manual.html"
},
{
+ "path": "html/semantics/forms/the-textarea-element/textarea-select-event-manual.html",
+ "url": "/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html"
+ },
+ {
+ "path": "html/semantics/forms/the-textarea-element/textarea-select-manual.html",
+ "url": "/html/semantics/forms/the-textarea-element/textarea-select-manual.html"
+ },
+ {
"path": "html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html",
"url": "/html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html"
},
@@ -8408,10 +8416,6 @@
"url": "/IndexedDB/idbdatabase_createObjectStore7.htm"
},
{
- "path": "IndexedDB/idbdatabase_createObjectStore8-parameters.htm",
- "url": "/IndexedDB/idbdatabase_createObjectStore8-parameters.htm"
- },
- {
"path": "IndexedDB/idbdatabase_createObjectStore9-invalidparameters.htm",
"url": "/IndexedDB/idbdatabase_createObjectStore9-invalidparameters.htm"
},
@@ -9624,6 +9628,14 @@
"url": "/XMLHttpRequest/send-timeout-events.htm"
},
{
+ "path": "XMLHttpRequest/send-usp.html",
+ "url": "/XMLHttpRequest/send-usp.html"
+ },
+ {
+ "path": "XMLHttpRequest/send-usp.worker.js",
+ "url": "/XMLHttpRequest/send-usp.worker"
+ },
+ {
"path": "XMLHttpRequest/setrequestheader-after-send.htm",
"url": "/XMLHttpRequest/setrequestheader-after-send.htm"
},
@@ -9696,58 +9708,6 @@
"url": "/XMLHttpRequest/xmlhttprequest-network-error.htm"
},
{
- "path": "XMLHttpRequest/xmlhttprequest-timeout-aborted.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-aborted.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-overrides.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-overrides.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-simple.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-simple.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-synconmain.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-twice.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-twice.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html"
- },
- {
- "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html",
- "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html"
- },
- {
"path": "XMLHttpRequest/xmlhttprequest-unsent.htm",
"url": "/XMLHttpRequest/xmlhttprequest-unsent.htm"
},
@@ -16140,6 +16100,74 @@
"url": "/selectors/attribute-selectors/attribute-case/syntax.html"
},
{
+ "path": "service-workers/cache-storage/common.https.html",
+ "url": "/service-workers/cache-storage/common.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/serviceworker/cache-add.https.html",
+ "url": "/service-workers/cache-storage/serviceworker/cache-add.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/serviceworker/cache-delete.https.html",
+ "url": "/service-workers/cache-storage/serviceworker/cache-delete.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/serviceworker/cache-storage-keys.https.html",
+ "url": "/service-workers/cache-storage/serviceworker/cache-storage-keys.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/serviceworker/cache-storage-match.https.html",
+ "url": "/service-workers/cache-storage/serviceworker/cache-storage-match.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/serviceworker/cache-storage.https.html",
+ "url": "/service-workers/cache-storage/serviceworker/cache-storage.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-add.https.html",
+ "url": "/service-workers/cache-storage/window/cache-add.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-delete.https.html",
+ "url": "/service-workers/cache-storage/window/cache-delete.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-storage-keys.https.html",
+ "url": "/service-workers/cache-storage/window/cache-storage-keys.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-storage-match.https.html",
+ "url": "/service-workers/cache-storage/window/cache-storage-match.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-storage.https.html",
+ "url": "/service-workers/cache-storage/window/cache-storage.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/sandboxed-iframes.https.html",
+ "url": "/service-workers/cache-storage/window/sandboxed-iframes.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-add.https.html",
+ "url": "/service-workers/cache-storage/worker/cache-add.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-delete.https.html",
+ "url": "/service-workers/cache-storage/worker/cache-delete.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-storage-keys.https.html",
+ "url": "/service-workers/cache-storage/worker/cache-storage-keys.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-storage-match.https.html",
+ "url": "/service-workers/cache-storage/worker/cache-storage-match.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-storage.https.html",
+ "url": "/service-workers/cache-storage/worker/cache-storage.https.html"
+ },
+ {
"path": "shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001.html",
"url": "/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001.html"
},
@@ -18785,6 +18813,11 @@
"url": "/IndexedDB/idbdatabase_createObjectStore10-1000ends.htm"
},
{
+ "path": "IndexedDB/idbdatabase_createObjectStore8-parameters.htm",
+ "timeout": "long",
+ "url": "/IndexedDB/idbdatabase_createObjectStore8-parameters.htm"
+ },
+ {
"path": "IndexedDB/idbobjectstore_createIndex3-usable-right-away.htm",
"timeout": "long",
"url": "/IndexedDB/idbobjectstore_createIndex3-usable-right-away.htm"
@@ -18820,6 +18853,71 @@
"url": "/XMLHttpRequest/send-redirect-bogus.htm"
},
{
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-aborted.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-aborted.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-overrides.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-overrides.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-simple.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-simple.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-synconmain.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-twice.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-twice.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html"
+ },
+ {
+ "path": "XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html",
+ "timeout": "long",
+ "url": "/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html"
+ },
+ {
"path": "ambient-light/AmbientLight_tests.html",
"timeout": "long",
"url": "/ambient-light/AmbientLight_tests.html"
@@ -19875,6 +19973,36 @@
"url": "/media-source/mediasource-redundant-seek.html"
},
{
+ "path": "service-workers/cache-storage/serviceworker/cache-match.https.html",
+ "timeout": "long",
+ "url": "/service-workers/cache-storage/serviceworker/cache-match.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/serviceworker/cache-put.https.html",
+ "timeout": "long",
+ "url": "/service-workers/cache-storage/serviceworker/cache-put.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-match.https.html",
+ "timeout": "long",
+ "url": "/service-workers/cache-storage/window/cache-match.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/window/cache-put.https.html",
+ "timeout": "long",
+ "url": "/service-workers/cache-storage/window/cache-put.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-match.https.html",
+ "timeout": "long",
+ "url": "/service-workers/cache-storage/worker/cache-match.https.html"
+ },
+ {
+ "path": "service-workers/cache-storage/worker/cache-put.https.html",
+ "timeout": "long",
+ "url": "/service-workers/cache-storage/worker/cache-put.https.html"
+ },
+ {
"path": "websockets/binary/002.html",
"timeout": "long",
"url": "/websockets/binary/002.html"
@@ -25075,7 +25203,7 @@
}
]
},
- "rev": "2a9fd810bb18610b422dbc3998ab74aa1bffae95",
+ "rev": "000905d008db2538360020335bc2dbba16d322b5",
"url_base": "/",
"version": 2
} \ No newline at end of file
diff --git a/tests/wpt/metadata/XMLHttpRequest/send-usp.html.ini b/tests/wpt/metadata/XMLHttpRequest/send-usp.html.ini
new file mode 100644
index 00000000000..4167953af31
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/send-usp.html.ini
@@ -0,0 +1,50 @@
+[send-usp.html]
+ type: testharness
+ [XMLHttpRequest.send(URLSearchParams) (0)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (1)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (2)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (3)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (4)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (5)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (6)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (7)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (8)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (9)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (10)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (11)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (12)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (13)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (14)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (15)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini b/tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini
new file mode 100644
index 00000000000..420778a82e9
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini
@@ -0,0 +1,50 @@
+[send-usp.worker]
+ type: testharness
+ [XMLHttpRequest.send(URLSearchParams) (0)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (1)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (2)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (3)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (4)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (5)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (6)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (7)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (8)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (9)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (10)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (11)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (12)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (13)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (14)]
+ expected: FAIL
+
+ [XMLHttpRequest.send(URLSearchParams) (15)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html.ini b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html.ini
new file mode 100644
index 00000000000..ff19591c2a5
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html.ini
@@ -0,0 +1,3 @@
+[xmlhttprequest-timeout-worker-aborted.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html.ini b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html.ini
index 4f2849cb9fb..109458ef6bb 100644
--- a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html.ini
@@ -1,5 +1,4 @@
[xmlhttprequest-timeout-worker-overrides.html]
type: testharness
- [Timeout test: timeout enabled after initially disabled, original timeout at 0, reset at 400 to 1000]
- disabled: flaky - https://github.com/w3c/web-platform-tests/issues/1362
+ disabled: flaky - https://github.com/w3c/web-platform-tests/issues/1362
diff --git a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html.ini b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html.ini
index 0ebda00c863..de2fbbb878d 100644
--- a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html.ini
@@ -1,5 +1,4 @@
[xmlhttprequest-timeout-worker-overridesexpires.html]
type: testharness
- [Timeout test: timeout set to expired value before load fires, original timeout at 1000, reset at 400 to 300]
- disabled: racy test
+ disabled: racy test
diff --git a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html.ini b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html.ini
new file mode 100644
index 00000000000..746c7d262dc
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html.ini
@@ -0,0 +1,3 @@
+[xmlhttprequest-timeout-worker-simple.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html.ini b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html.ini
index 97344145a03..ddda4ae50d2 100644
--- a/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html.ini
@@ -1,5 +1,4 @@
[xmlhttprequest-timeout-worker-twice.html]
type: testharness
- [Timeout test: load fires normally with same timeout set twice, original timeout at 1000, reset at 400 to 1000]
- disabled: flaky
+ disabled: flaky
diff --git a/tests/wpt/metadata/dom/nodes/getElementsByClassName-31.htm.ini b/tests/wpt/metadata/dom/nodes/getElementsByClassName-31.htm.ini
deleted file mode 100644
index b98e9fc58e1..00000000000
--- a/tests/wpt/metadata/dom/nodes/getElementsByClassName-31.htm.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[getElementsByClassName-31.htm]
- type: testharness
- [getElementsByClassName across documents]
- expected: PASS
-
diff --git a/tests/wpt/metadata/encoding/api-replacement-encodings.html.ini b/tests/wpt/metadata/encoding/api-replacement-encodings.html.ini
index b890466bae1..99468e76336 100644
--- a/tests/wpt/metadata/encoding/api-replacement-encodings.html.ini
+++ b/tests/wpt/metadata/encoding/api-replacement-encodings.html.ini
@@ -2,3 +2,4 @@
type: testharness
[Label for "replacement" should be rejected by API: hz-gb-2312]
expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/textencoder-constructor-non-utf.html.ini b/tests/wpt/metadata/encoding/textencoder-constructor-non-utf.html.ini
index 4c84622faf8..d186734577b 100644
--- a/tests/wpt/metadata/encoding/textencoder-constructor-non-utf.html.ini
+++ b/tests/wpt/metadata/encoding/textencoder-constructor-non-utf.html.ini
@@ -5,3 +5,4 @@
[UTF encodings are supported for encode and decode: utf-16le]
expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/window-properties.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/window-properties.html.ini
index 2afe1779b49..68049100081 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/window-properties.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/window-properties.html.ini
@@ -1,14 +1,5 @@
[window-properties.html]
type: testharness
- [EventTarget method: addEventListener]
- expected: FAIL
-
- [EventTarget method: removeEventListener]
- expected: FAIL
-
- [EventTarget method: dispatchEvent]
- expected: FAIL
-
[Window method: close]
expected: FAIL
@@ -78,18 +69,12 @@
[Window readonly attribute: history]
expected: FAIL
- [Window readonly attribute: parent]
- expected: FAIL
-
[Window readonly attribute: frameElement]
expected: FAIL
[Window readonly attribute: navigator]
expected: FAIL
- [Window readonly attribute: external]
- expected: FAIL
-
[Window readonly attribute: applicationCache]
expected: FAIL
@@ -99,39 +84,6 @@
[Window readonly attribute: localStorage]
expected: FAIL
- [Window readonly attribute: screen]
- expected: FAIL
-
- [Window readonly attribute: innerWidth]
- expected: FAIL
-
- [Window readonly attribute: innerHeight]
- expected: FAIL
-
- [Window readonly attribute: scrollX]
- expected: FAIL
-
- [Window readonly attribute: pageXOffset]
- expected: FAIL
-
- [Window readonly attribute: scrollY]
- expected: FAIL
-
- [Window readonly attribute: pageYOffset]
- expected: FAIL
-
- [Window readonly attribute: screenX]
- expected: FAIL
-
- [Window readonly attribute: screenY]
- expected: FAIL
-
- [Window readonly attribute: outerWidth]
- expected: FAIL
-
- [Window readonly attribute: outerHeight]
- expected: FAIL
-
[Window attribute: name]
expected: FAIL
@@ -384,3 +336,45 @@
[Window replaceable attribute: length]
expected: FAIL
+ [Window replaceable attribute: parent]
+ expected: FAIL
+
+ [Window replaceable attribute: external]
+ expected: FAIL
+
+ [Window replaceable attribute: screen]
+ expected: FAIL
+
+ [Window replaceable attribute: scrollX]
+ expected: FAIL
+
+ [Window replaceable attribute: scrollY]
+ expected: FAIL
+
+ [Window replaceable attribute: pageXOffset]
+ expected: FAIL
+
+ [Window replaceable attribute: pageYOffset]
+ expected: FAIL
+
+ [Window replaceable attribute: innerWidth]
+ expected: FAIL
+
+ [Window replaceable attribute: innerHeight]
+ expected: FAIL
+
+ [Window replaceable attribute: screenX]
+ expected: FAIL
+
+ [Window replaceable attribute: screenY]
+ expected: FAIL
+
+ [Window replaceable attribute: outerWidth]
+ expected: FAIL
+
+ [Window replaceable attribute: outerHeight]
+ expected: FAIL
+
+ [Window replaceable attribute: devicePixelRatio]
+ 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 d7000629e79..c3fcda41468 100644
--- a/tests/wpt/metadata/html/dom/reflection-misc.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-misc.html.ini
@@ -12375,3 +12375,843 @@
[menu.type: IDL set to "TOOLBAR" followed by IDL get]
expected: FAIL
+ [dialog.dir: typeof IDL attribute]
+ expected: FAIL
+
+ [dialog.dir: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: 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 " followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "ltr" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "xltr" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "ltr\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "tr" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "LTR" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "rtl" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "xrtl" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "rtl\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "tl" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "RTL" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "auto" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "xauto" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "auto\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "uto" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "AUTO" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: 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 " followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: 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 " followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to undefined followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to 7 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to 1.5 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to true followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to false followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "[object Object\]" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to NaN followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to Infinity followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to -Infinity followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "\\0" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "test-toString" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "test-valueOf" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "ltr" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xltr" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xltr" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "ltr\\0" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "ltr\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "tr" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "tr" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "LTR" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "LTR" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "rtl" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xrtl" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xrtl" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "rtl\\0" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "rtl\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "tl" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "tl" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "RTL" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "RTL" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "auto" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xauto" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xauto" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "auto\\0" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "auto\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "uto" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "uto" followed by IDL get]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "AUTO" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: typeof IDL attribute]
+ expected: FAIL
+
+ [dialog.accessKey: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: 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 " followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to "" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: 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 " followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to undefined followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to 7 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to 1.5 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to true followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to false followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "[object Object\]" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to NaN followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to Infinity followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to -Infinity followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to "\\0" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to null followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "test-toString" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: typeof IDL attribute]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to -36 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to -1 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 0 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 1 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 2147483647 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to -2147483648 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "-1" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "-0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "1" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\t7" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\f7" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to " 7" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\n7" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\r7" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to object "2" followed by IDL get]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to -36 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to -1 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to 0 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to 1 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to 2147483647 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to -2147483648 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.open: typeof IDL attribute]
+ expected: FAIL
+
+ [dialog.open: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to " foo " followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: setAttribute() to "open" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to "" followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.open: IDL set to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to " foo " followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to undefined followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.open: IDL set to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to null followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.open: IDL set to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to false followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.open: IDL set to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to NaN followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.open: IDL set to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.open: IDL set to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: typeof IDL attribute]
+ expected: FAIL
+
+ [dialog.itemScope: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to " foo " followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: setAttribute() to "itemScope" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to "" followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to " foo " followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to undefined followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to null followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to false followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to NaN followed by hasAttribute()]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemScope: IDL set to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: typeof IDL attribute]
+ expected: FAIL
+
+ [dialog.itemId: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to " foo " followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to "http://site.example/" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to "//site.example/path???@#l" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: 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 " followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: setAttribute() to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to " foo " followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to " foo " followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "http://site.example/" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "http://site.example/" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "//site.example/path???@#l" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "//site.example/path???@#l" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: 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 " followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: 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 " followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to undefined followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to undefined followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to 7 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to 7 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to 1.5 followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to 1.5 followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to true followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to true followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to false followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to false followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to object "[object Object\]" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to object "[object Object\]" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to NaN followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to NaN followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to Infinity followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to -Infinity followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to -Infinity followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "\\0" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to "\\0" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to null followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to null followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to object "test-toString" followed by getAttribute()]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to object "test-toString" followed by IDL get]
+ expected: FAIL
+
+ [dialog.itemId: IDL set to object "test-valueOf" followed by IDL get]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/focus.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/focus.html.ini
index 25bc6b23c6a..f21d3ab17c8 100644
--- a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/focus.html.ini
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/focus.html.ini
@@ -2,10 +2,13 @@
type: testharness
[input3 has the attribute autofocus]
expected: FAIL
+
[tabindex attribute makes the element focusable]
expected: FAIL
+
[editable elements are focusable]
expected: FAIL
- [':focus' matches focussed body with tabindex]
+
+ [\':focus\' matches focussed body with tabindex]
expected: FAIL
diff --git a/tests/wpt/metadata/mozilla-sync b/tests/wpt/metadata/mozilla-sync
new file mode 100644
index 00000000000..de8ec6fd4e4
--- /dev/null
+++ b/tests/wpt/metadata/mozilla-sync
@@ -0,0 +1 @@
+53d2432c90ab9ef171dfbef8e22ed3f58fcef8f0
diff --git a/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js.ini b/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js.ini
deleted file mode 100644
index fc8a5d52bc8..00000000000
--- a/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[EventTarget.worker]
- type: testharness
- [removeEventListener]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html.ini b/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html.ini
index 802671023a3..508a59a7c22 100644
--- a/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html.ini
+++ b/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html.ini
@@ -1,5 +1,6 @@
[propagate-to-window-onerror.html]
type: testharness
+ expected: TIMEOUT
[onerror, "not handled" with only window.onerror defined]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/mozilla/meta/mozilla/document_characterSet_long.html.ini b/tests/wpt/mozilla/meta/mozilla/document_characterSet_long.html.ini
index 7a7178ccdbb..79923c15fb6 100644
--- a/tests/wpt/mozilla/meta/mozilla/document_characterSet_long.html.ini
+++ b/tests/wpt/mozilla/meta/mozilla/document_characterSet_long.html.ini
@@ -2,3 +2,4 @@
type: testharness
[Untitled]
expected: FAIL
+
diff --git a/tests/wpt/mozilla/meta/mozilla/document_characterSet_short.html.ini b/tests/wpt/mozilla/meta/mozilla/document_characterSet_short.html.ini
index 4dbc7734960..c6d6561a99b 100644
--- a/tests/wpt/mozilla/meta/mozilla/document_characterSet_short.html.ini
+++ b/tests/wpt/mozilla/meta/mozilla/document_characterSet_short.html.ini
@@ -2,3 +2,4 @@
type: testharness
[Untitled]
expected: FAIL
+
diff --git a/tests/wpt/mozilla/meta/mozilla/enabled_disabled_selectors.html.ini b/tests/wpt/mozilla/meta/mozilla/enabled_disabled_selectors.html.ini
index 7e97d32000f..f8b54e6eb73 100644
--- a/tests/wpt/mozilla/meta/mozilla/enabled_disabled_selectors.html.ini
+++ b/tests/wpt/mozilla/meta/mozilla/enabled_disabled_selectors.html.ini
@@ -1,5 +1,5 @@
[enabled_disabled_selectors.html]
type: testharness
-
[menuitem initial state]
expected: FAIL
+
diff --git a/tests/wpt/mozilla/meta/mozilla/windowproxy.html.ini b/tests/wpt/mozilla/meta/mozilla/windowproxy.html.ini
index 6de54222762..ef3f60406f0 100644
--- a/tests/wpt/mozilla/meta/mozilla/windowproxy.html.ini
+++ b/tests/wpt/mozilla/meta/mozilla/windowproxy.html.ini
@@ -1,5 +1,5 @@
[windowproxy.html]
type: testharness
-
[Unforgeable location]
expected: FAIL
+
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbdatabase_createObjectStore8-parameters.htm b/tests/wpt/web-platform-tests/IndexedDB/idbdatabase_createObjectStore8-parameters.htm
index 48a9993858c..7cc69765b0f 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/idbdatabase_createObjectStore8-parameters.htm
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbdatabase_createObjectStore8-parameters.htm
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>IDBObjectStoreParameters</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
+<meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-aborted.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-aborted.js
index 54142fd6355..056d77c0136 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-aborted.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-aborted.js
@@ -2,14 +2,14 @@ if (this.document === undefined)
importScripts("xmlhttprequest-timeout.js");
/*
This sets up three requests:
-The first request will only be open()ed, not aborted, timeout will be 400 but will never triggered because send() isn't called.
-After a 1 second delay, the test asserts that no load/error/timeout/abort events fired
+The first request will only be open()ed, not aborted, timeout will be TIME_REGULAR_TIMEOUT but will never triggered because send() isn't called.
+After TIME_NORMAL_LOAD, the test asserts that no load/error/timeout/abort events fired
Second request will be aborted immediately after send(), test asserts that abort fired
-Third request is set up to call abort() after a 1 second delay, but it also has a 400ms timeout. Asserts that timeout fired.
-(abort() is called 600ms later and should not fire an abort event per spec. This is untested!)
+Third request is set up to call abort() after TIME_NORMAL_LOAD, but it also has a TIME_REGULAR_TIMEOUT timeout. Asserts that timeout fired.
+(abort() is called later and should not fire an abort event per spec. This is untested!)
*/
runTestRequests([ new AbortedRequest(false),
- new AbortedRequest(true, -1),
- new AbortedRequest(true, TIME_NORMAL_LOAD) ]);
+ new AbortedRequest(true, -1),
+ new AbortedRequest(true, TIME_NORMAL_LOAD) ]);
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-abortedonmain.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-abortedonmain.js
index a6a67f1b85f..8dde8ef573e 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-abortedonmain.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-abortedonmain.js
@@ -1,8 +1,8 @@
/*
-This test sets up two requests:
+This test sets up two requests:
one that gets abort()ed from a 0ms timeout (0ms will obviously be clamped to whatever the implementation's minimal value is), asserts abort event fires
-one that will be aborted after 200ms (TIME_DELAY), (with a timeout at 400ms) asserts abort event fires. Does not assert that the timeout event does *not* fire.
+one that will be aborted after TIME_DELAY, (with a timeout at TIME_REGULAR_TIMEOUT) asserts abort event fires. Does not assert that the timeout event does *not* fire.
*/
runTestRequests([ new AbortedRequest(true, 0),
- new AbortedRequest(true, TIME_DELAY) ]);
+ new AbortedRequest(true, TIME_DELAY) ]);
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js
index 12f5eb5eacc..6dc2173b2e6 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js
@@ -2,10 +2,10 @@ if (this.document === undefined)
importScripts("xmlhttprequest-timeout.js");
/*
Sets up three requests to a resource that will take 0.6 seconds to load:
-1) timeout first set to 1000ms, after 400ms timeout is set to 0, asserts load fires
-2) timeout first set to 1000ms, after 200ms timeout is set to 400, asserts load fires (race condition..?!?)
-3) timeout first set to 0, after 400ms it is set to 1000, asserts load fires
+1) timeout first set to TIME_NORMAL_LOAD, after TIME_REGULAR_TIMEOUT timeout is set to 0, asserts load fires
+2) timeout first set to TIME_NORMAL_LOAD, after TIME_DELAY timeout is set to TIME_REGULAR_TIMEOUT, asserts load fires (race condition..?!?)
+3) timeout first set to 0, after TIME_REGULAR_TIMEOUT it is set to TIME_REGULAR_TIMEOUT * 10, asserts load fires
*/
runTestRequests([ new RequestTracker(true, "timeout disabled after initially set", TIME_NORMAL_LOAD, TIME_REGULAR_TIMEOUT, 0),
- new RequestTracker(true, "timeout overrides load after a delay", TIME_NORMAL_LOAD, TIME_DELAY, TIME_REGULAR_TIMEOUT),
- new RequestTracker(true, "timeout enabled after initially disabled", 0, TIME_REGULAR_TIMEOUT, TIME_NORMAL_LOAD * 10) ]);
+ new RequestTracker(true, "timeout overrides load after a delay", TIME_NORMAL_LOAD, TIME_DELAY, TIME_REGULAR_TIMEOUT),
+ new RequestTracker(true, "timeout enabled after initially disabled", 0, TIME_REGULAR_TIMEOUT, TIME_NORMAL_LOAD * 10) ]);
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overridesexpires.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overridesexpires.js
index 7114dfe0257..bf251fa8053 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overridesexpires.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overridesexpires.js
@@ -1,13 +1,12 @@
if (this.document === undefined)
importScripts("xmlhttprequest-timeout.js");
/*
- Starts three requests:
- 1) XHR to resource which will take a least 600ms with timeout initially set to 1000ms. After 800ms timeout is supposedly reset to 200ms,
- but the resource should have finished loading already. Asserts "load" fires.
- 2) XHR with initial timeout set to 1000, after 400ms sets timeout to 300ms. Asserts "timeout" fires.
- (Originally new value was 200ms. Race condition-y. Setting the new timeout to 300ms would be a better test of the "measured from start of fetching" requirement.)
- 3) XHR with initial timeout set to 200, after 400ms sets timeout to 500ms. Asserts "timeout" fires (the change happens when timeout already fired and the request is done).
+ Starts three requests:
+ 1) XHR to resource which will take a least TIME_XHR_LOAD ms with timeout initially set to TIME_NORMAL_LOAD ms. After TIME_LATE_TIMEOUT ms timeout is supposedly reset to TIME_DELAY ms,
+ but the resource should have finished loading already. Asserts "load" fires.
+ 2) XHR with initial timeout set to TIME_NORMAL_LOAD, after TIME_REGULAR_TIMEOUT sets timeout to TIME_DELAY+100. Asserts "timeout" fires.
+ 3) XHR with initial timeout set to TIME_DELAY, after TIME_REGULAR_TIMEOUT sets timeout to 500ms. Asserts "timeout" fires (the change happens when timeout already fired and the request is done).
*/
runTestRequests([ new RequestTracker(true, "timeout set to expiring value after load fires", TIME_NORMAL_LOAD, TIME_LATE_TIMEOUT, TIME_DELAY),
- new RequestTracker(true, "timeout set to expired value before load fires", TIME_NORMAL_LOAD, TIME_REGULAR_TIMEOUT, TIME_DELAY+100),
- new RequestTracker(true, "timeout set to non-expiring value after timeout fires", TIME_DELAY, TIME_REGULAR_TIMEOUT, 500) ]);
+ new RequestTracker(true, "timeout set to expired value before load fires", TIME_NORMAL_LOAD, TIME_REGULAR_TIMEOUT, TIME_DELAY+100),
+ new RequestTracker(true, "timeout set to non-expiring value after timeout fires", TIME_DELAY, TIME_REGULAR_TIMEOUT, 500) ]);
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-runner.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-runner.js
index 3d92b2ebf4c..151226a94fb 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-runner.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout-runner.js
@@ -1,3 +1,4 @@
+
function testResultCallbackHandler(event) {
if (event.data == "done") {
done();
@@ -16,5 +17,5 @@ function testResultCallbackHandler(event) {
window.addEventListener("message", testResultCallbackHandler);
// Setting up testharness.js
-setup({ explicit_done: true, timeout: 30 * 1000 });
+setup({ explicit_done: true });
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout.js
index f3ef49aef63..01e63cde691 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-timeout.js
@@ -11,12 +11,12 @@
request handlers.
*/
-var TIME_NORMAL_LOAD = 1000;
-var TIME_LATE_TIMEOUT = 800;
-var TIME_XHR_LOAD = 600;
-var TIME_REGULAR_TIMEOUT = 400;
-var TIME_SYNC_TIMEOUT = 200;
-var TIME_DELAY = 200;
+var TIME_NORMAL_LOAD = 5000;
+var TIME_LATE_TIMEOUT = 4000;
+var TIME_XHR_LOAD = 3000;
+var TIME_REGULAR_TIMEOUT = 2000;
+var TIME_SYNC_TIMEOUT = 1000;
+var TIME_DELAY = 1000;
/*
* This should point to a resource that responds with a text/plain resource after a delay of TIME_XHR_LOAD milliseconds.
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.html b/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.html
new file mode 100644
index 00000000000..1753e5f3a5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>XMLHttpRequest.send(URLSearchParams)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="send-usp.js"></script>
+<div id="log"></div>
+<script>
+run_test();
+</script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.js b/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.js
new file mode 100644
index 00000000000..56e9e09640f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.js
@@ -0,0 +1,39 @@
+function encode(n) {
+ if (n === 0x20) {
+ return "\x2B";
+ }
+
+ if (n === 0x2A || n === 0x2D || n === 0x2E ||
+ (0x30 <= n && n <= 0x39) || (0x41 <= n && n <= 0x5A) ||
+ n === 0x5F || (0x61 <= n && n <= 0x7A)) {
+ return String.fromCharCode(n);
+ }
+
+ var s = n.toString(16).toUpperCase();
+ return "%" + (s.length === 2 ? s : '0' + s);
+}
+
+function do_test(n) {
+ async_test(function() {
+ var x = new XMLHttpRequest();
+ x.onload = this.step_func_done(function(e) {
+ assert_equals(x.response, "a=" + encode(n))
+ });
+ x.onerror = this.unreached_func();
+ x.open("POST", "resources/content.py");
+ var usp = new URLSearchParams();
+ usp.append("a", String.fromCharCode(n));
+ x.send(usp)
+ }, "XMLHttpRequest.send(URLSearchParams) (" + n + ")");
+}
+
+function run_test() {
+ var i = 0;
+ add_result_callback(function() {
+ if (++i === 128) {
+ return;
+ }
+ do_test(i);
+ });
+ do_test(i);
+}
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.worker.js b/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.worker.js
new file mode 100644
index 00000000000..7fc3d8e041f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-usp.worker.js
@@ -0,0 +1,5 @@
+importScripts("/resources/testharness.js");
+importScripts("/resources/testharnessreport.js");
+importScripts("send-usp.js");
+run_test();
+done();
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-aborted.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-aborted.html
index 2be888f8884..cf639487b2d 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-aborted.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-aborted.html
@@ -12,6 +12,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html
index 9226ffadddd..9ce5444d777 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-abortedonmain.html
@@ -8,6 +8,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#event-xhr-abort" data-tested-assertations="../.." />
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol/li[9]"/>
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overrides.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overrides.html
index 82fee067c63..6366e311222 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overrides.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overrides.html
@@ -8,6 +8,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#timeout-error" data-tested-assertations=".."/>
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html
index 260844d0db6..e479a30eeac 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-overridesexpires.html
@@ -9,6 +9,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-simple.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-simple.html
index aa473442ee4..e7cf089b1ac 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-simple.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-simple.html
@@ -9,6 +9,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html
index 992b10efd97..ce2537cbc0b 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-synconmain.html
@@ -6,6 +6,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#the-timeout-attribute" data-tested-assertations="following::ol[1]/li[1]" />
<link rel="help" href="https://xhr.spec.whatwg.org/#the-open()-method" data-tested-assertations="following::ol[1]/li[10]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-twice.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-twice.html
index 4634220eca4..f29bf9824f5 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-twice.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-twice.html
@@ -10,6 +10,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#timeout-error" data-tested-assertations=".."/>
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html
index f0005afa2e0..e5dab5a3947 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-aborted.html
@@ -12,6 +12,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout-runner.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html
index e3dbd5c949b..c5d37c10f62 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overrides.html
@@ -8,6 +8,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#timeout-error" data-tested-assertations=".."/>
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout-runner.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html
index a2c8009ea74..c1e601dd130 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-overridesexpires.html
@@ -9,6 +9,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout-runner.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html
index 994ccb6ecce..1113dfcda97 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-simple.html
@@ -9,6 +9,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout-runner.js"></script>
@@ -19,7 +20,7 @@
<div id="log"></div>
<script type="text/javascript">
var worker = new Worker("resources/xmlhttprequest-timeout-simple.js");
- worker.onmessage = testResultCallbackHandler;
+ worker.onmessage = testResultCallbackHandler;
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html
index 50aa65193c9..f9c2d3c3ff6 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-synconworker.html
@@ -9,6 +9,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout-runner.js"></script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html
index 18f6a39248a..fdf3646b34a 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/xmlhttprequest-timeout-worker-twice.html
@@ -9,6 +9,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#request-error" data-tested-assertations="following::ol[1]/li[9]"/>
<link rel="help" href="https://xhr.spec.whatwg.org/#infrastructure-for-the-send()-method" data-tested-assertations="following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/.. following-sibling::dl//code[contains(@title,'dom-XMLHttpRequest-timeout')]/../following-sibling::dd following::dt[1] following::dd[1]" />
<link rel="stylesheet" href="/resources/testharness.css" />
+ <meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/xmlhttprequest-timeout-runner.js"></script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/buildInlineWorker.js b/tests/wpt/web-platform-tests/content-security-policy/script-src/buildInlineWorker.js
index 4fc3bb71c1e..8cd092147cb 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/script-src/buildInlineWorker.js
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/buildInlineWorker.js
@@ -1,20 +1,20 @@
(function ()
{
- var test = new async_test("test inline worker");
var workerSource = document.getElementById('inlineWorker');
-
var blob = new Blob([workerSource.textContent]);
// can I create a new script tag like this? ack...
var url = window.URL.createObjectURL(blob);
- var worker = new Worker(url);
+ try {
+ var worker = new Worker(url);
+ }
+ catch (e) {
+ done();
+ }
worker.addEventListener('message', function(e) {
- test.step(function () {
- assert_not_equals(e.data, 'fail', 'inline script ran');
- test.done();
- })
+ assert_unreached("script ran");
}, false);
worker.postMessage('');
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Node-replaceChild.html b/tests/wpt/web-platform-tests/dom/nodes/Node-replaceChild.html
index 3b1bb7e04ff..d429750f76e 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Node-replaceChild.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Node-replaceChild.html
@@ -318,4 +318,17 @@ test(function() {
assert_equals(a.firstChild, c);
assert_equals(c.parentNode, a);
}, "replaceChild should work in the presence of mutation events.")
+test(function() {
+ var TEST_ID = "findme";
+ var gBody = document.getElementsByTagName("body")[0];
+ var parent = document.createElement("div");
+ gBody.appendChild(parent);
+ var child = document.createElement("div");
+ parent.appendChild(child);
+ var df = document.createDocumentFragment();
+ var fragChild = df.appendChild(document.createElement("div"));
+ fragChild.setAttribute("id", TEST_ID);
+ parent.replaceChild(df, child);
+ assert_equals(document.getElementById(TEST_ID), fragChild, "should not be null");
+}, "Replacing an element with a DocumentFragment should allow a child of the DocumentFragment to be found by Id.")
</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-properties.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-properties.html
index 843b671534f..3316bf5316f 100644
--- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-properties.html
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-properties.html
@@ -42,7 +42,7 @@ var unforgeableAttributes = [
"top"
];
-var replacableAttributes = [
+var replaceableAttributes = [
"self",
"locationbar",
"menubar",
@@ -51,7 +51,23 @@ var replacableAttributes = [
"statusbar",
"toolbar",
"frames",
- "length"
+ "parent",
+ "external",
+ "length",
+
+ // CSSOM-View
+ "screen",
+ "scrollX",
+ "scrollY",
+ "pageXOffset",
+ "pageYOffset",
+ "innerWidth",
+ "innerHeight",
+ "screenX",
+ "screenY",
+ "outerWidth",
+ "outerHeight",
+ "devicePixelRatio",
];
var methods = [
@@ -98,10 +114,8 @@ if ("showModalDialog" in window) {
var readonlyAttributes = [
"history",
- "parent",
"frameElement",
"navigator",
- "external",
"applicationCache",
// WindowSessionStorage
@@ -109,19 +123,6 @@ var readonlyAttributes = [
// WindowLocalStorage
"localStorage",
-
- // CSSOM-View
- "screen",
- "innerWidth",
- "innerHeight",
- "scrollX",
- "pageXOffset",
- "scrollY",
- "pageYOffset",
- "screenX",
- "screenY",
- "outerWidth",
- "outerHeight"
];
var writableAttributes = [
@@ -259,8 +260,7 @@ test(function() {
assert_equals(window[id], EventTargetProto[id]);
assert_data_propdesc(Object.getOwnPropertyDescriptor(EventTargetProto, id),
true, true, true);
- assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id),
- true, true, true);
+ assert_equals(Object.getOwnPropertyDescriptor(window, id), undefined);
}, "EventTarget method: " + id);
});
}, "EventTarget interface");
@@ -303,7 +303,7 @@ test(function() {
id === "location", true, false);
}, "Window unforgeable attribute: " + id);
});
- replacableAttributes.forEach(function(id) {
+ replaceableAttributes.forEach(function(id) {
test(function() {
var WindowProto = Window.prototype;
assert_true(id in window, id + " in window");
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 b495d83d4ce..77cc4cd729a 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-misc.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-misc.js
@@ -50,6 +50,9 @@ var miscElements = {
radiogroup: "string",
"default": "boolean",
},
+ dialog: {
+ open: "boolean",
+ },
// Global attributes should exist even on unknown elements
undefinedelement: {},
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html
new file mode 100644
index 00000000000..f1679e2809a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTMLTextAreaElement Test: select event</title>
+<link rel="author" title="Intel" href="http://www.intel.com/">
+<meta name="flags" content="interact">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<p>Select any numberic characters in the text area below</p>
+
+<form id="testForm" name="testForm">
+ <textarea id="testtextarea">0123456789</textarea>
+</form>
+
+<script>
+
+var textarea = document.getElementById("testtextarea");
+
+setup({explicit_done : true});
+setup({explicit_timeout : true});
+
+on_event(textarea, "select", function(evt) {
+ test(function() {
+ assert_greater_than(textarea.value.substring(textarea.selectionStart, textarea.selectionEnd).length, 0, "Check if select event captured when text selected");
+ });
+ done();
+});
+
+</script>
+
+<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html
new file mode 100644
index 00000000000..4e98ba5093a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTMLTextAreaElement Test: select()</title>
+<link rel="author" title="Intel" href="http://www.intel.com/">
+<meta name="flags" content="interact">
+
+<p>Test passes if content of the input area is selected</p>
+
+<textarea id="test_obj">1234567</textarea>
+<script>
+var textarea = document.querySelector("#test_obj");
+textarea.select();
+</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html
index d6e92c0732d..c9e990206fe 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html
+++ b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html
@@ -15,7 +15,7 @@
var script=testlib.addScript('', { src:'scripts/include-1.js?pipe=trickle(d1)&'+Math.random() }, document.getElementsByTagName('head')[0], false );
log('end script #1');
</script>
- <script src="scripts/include-2.js?pipe=trickle(d2)"></script>
+ <script src="scripts/include-2.js?pipe=trickle(d4)"></script>
<script type="text/javascript">
var t = async_test()
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
new file mode 100644
index 00000000000..6164290dea1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/common.https.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<title>Cache Storage: Verify that Window and Workers see same storage</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<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) {
+ return new Promise(function(resolve) {
+ worker.addEventListener('message', function listener(e) {
+ resolve(e.data);
+ worker.removeEventListener('message', listener);
+ });
+ });
+}
+
+promise_test(function(t) {
+ var cache_name = 'common-test';
+ return self.caches.delete(cache_name)
+ .then(function() {
+ var worker = new Worker('resources/common-worker.js');
+ worker.postMessage({name: cache_name});
+ return wait_for_message(worker);
+ })
+ .then(function(message) {
+ return self.caches.open(cache_name);
+ })
+ .then(function(cache) {
+ return Promise.all([
+ cache.match('https://example.com/a'),
+ cache.match('https://example.com/b'),
+ cache.match('https://example.com/c')
+ ]);
+ })
+ .then(function(responses) {
+ return Promise.all(responses.map(
+ function(response) { return response.text(); }
+ ));
+ })
+ .then(function(bodies) {
+ assert_equals(bodies[0], 'a',
+ 'Body should match response put by worker');
+ assert_equals(bodies[1], 'b',
+ 'Body should match response put by worker');
+ assert_equals(bodies[2], 'c',
+ 'Body should match response put by worker');
+ });
+}, 'Window sees cache puts by Worker');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/blank.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/blank.html
new file mode 100644
index 00000000000..a3c3a4689a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/blank.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Empty doc</title>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/common-worker.js b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/common-worker.js
new file mode 100644
index 00000000000..d0e8544b56c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/common-worker.js
@@ -0,0 +1,15 @@
+self.onmessage = function(e) {
+ var cache_name = e.data.name;
+
+ self.caches.open(cache_name)
+ .then(function(cache) {
+ return Promise.all([
+ cache.put('https://example.com/a', new Response('a')),
+ cache.put('https://example.com/b', new Response('b')),
+ cache.put('https://example.com/c', new Response('c'))
+ ]);
+ })
+ .then(function() {
+ self.postMessage('ok');
+ });
+};
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/fetch-status.py b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/fetch-status.py
new file mode 100644
index 00000000000..71f13ebc3a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/fetch-status.py
@@ -0,0 +1,2 @@
+def main(request, response):
+ return int(request.GET["status"]), [], ""
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/iframe.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/iframe.html
new file mode 100644
index 00000000000..f4f418b8ddb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/iframe.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>ok</title>
+<script>
+window.onmessage = function(e) {
+ var id = e.data.id;
+ try {
+ self.caches;
+ window.parent.postMessage({id: id, result: 'allowed'}, '*');
+ } catch (e) {
+ window.parent.postMessage({id: id, result: 'denied', name: e.name, message: e.message}, '*');
+ }
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/simple.txt b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/simple.txt
new file mode 100644
index 00000000000..9e3cb91fb9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/simple.txt
@@ -0,0 +1 @@
+a simple text file
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
new file mode 100644
index 00000000000..91110950d56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/test-helpers.js
@@ -0,0 +1,37 @@
+(function() {
+ var next_cache_index = 1;
+
+ // Returns a promise that resolves to a newly created Cache object. The
+ // returned Cache will be destroyed when |test| completes.
+ function create_temporary_cache(test) {
+ var uniquifier = String(++next_cache_index);
+ var cache_name = self.location.pathname + '/' + uniquifier;
+
+ test.add_cleanup(function() {
+ self.caches.delete(cache_name);
+ });
+
+ return self.caches.delete(cache_name)
+ .then(function() {
+ return self.caches.open(cache_name);
+ });
+ }
+
+ self.create_temporary_cache = create_temporary_cache;
+})();
+
+// Runs |test_function| with a temporary unique Cache passed in as the only
+// argument. The function is run as a part of Promise chain owned by
+// promise_test(). As such, it is expected to behave in a manner identical (with
+// the exception of the argument) to a function passed into promise_test().
+//
+// E.g.:
+// cache_test(function(cache) {
+// // Do something with |cache|, which is a Cache object.
+// }, "Some Cache test");
+function cache_test(test_function, description) {
+ promise_test(function(test) {
+ return create_temporary_cache(test)
+ .then(test_function);
+ }, description);
+}
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
new file mode 100644
index 00000000000..4d7af1ff9ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/resources/testharness-helpers.js
@@ -0,0 +1,163 @@
+/*
+ * 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);
+ }
+ });
+}
+
+// Asserts that two objects |actual| and |expected| are weakly equal under the
+// following definition:
+//
+// |a| and |b| are weakly equal if any of the following are true:
+// 1. If |a| is not an 'object', and |a| === |b|.
+// 2. If |a| is an 'object', and all of the following are true:
+// 2.1 |a.p| is weakly equal to |b.p| for all own properties |p| of |a|.
+// 2.2 Every own property of |b| is an own property of |a|.
+//
+// This is a replacement for the the version of assert_object_equals() in
+// testharness.js. The latter doesn't handle own properties correctly. I.e. if
+// |a.p| is not an own property, it still requires that |b.p| be an own
+// property.
+//
+// Note that |actual| must not contain cyclic references.
+self.assert_object_equals = function(actual, expected, description) {
+ var object_stack = [];
+
+ function _is_equal(actual, expected, prefix) {
+ if (typeof actual !== 'object') {
+ assert_equals(actual, expected, prefix);
+ return;
+ }
+ assert_true(typeof expected === 'object', prefix);
+ assert_equals(object_stack.indexOf(actual), -1,
+ prefix + ' must not contain cyclic references.');
+
+ object_stack.push(actual);
+
+ Object.getOwnPropertyNames(expected).forEach(function(property) {
+ assert_own_property(actual, property, prefix);
+ _is_equal(actual[property], expected[property],
+ prefix + '.' + property);
+ });
+ Object.getOwnPropertyNames(actual).forEach(function(property) {
+ assert_own_property(expected, property, prefix);
+ });
+
+ object_stack.pop();
+ }
+
+ function _brand(object) {
+ return Object.prototype.toString.call(object).match(/^\[object (.*)\]$/)[1];
+ }
+
+ _is_equal(actual, expected,
+ (description ? description + ': ' : '') + _brand(expected));
+};
+
+// Equivalent to assert_in_array, but uses a weaker equivalence relation
+// (assert_object_equals) than '==='.
+function assert_object_in_array(actual, expected_array, description) {
+ assert_true(expected_array.some(function(element) {
+ try {
+ assert_object_equals(actual, element);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }), description);
+}
+
+// Assert that the two arrays |actual| and |expected| contain the same set of
+// elements as determined by assert_object_equals. The order is not significant.
+//
+// |expected| is assumed to not contain any duplicates as determined by
+// assert_object_equals().
+function assert_array_equivalent(actual, expected, description) {
+ assert_true(Array.isArray(actual), description);
+ assert_equals(actual.length, expected.length, description);
+ expected.forEach(function(expected_element) {
+ // assert_in_array treats the first argument as being 'actual', and the
+ // second as being 'expected array'. We are switching them around because
+ // we want to be resilient against the |actual| array containing
+ // duplicates.
+ assert_object_in_array(expected_element, actual, description);
+ });
+}
+
+// Asserts that two arrays |actual| and |expected| contain the same set of
+// elements as determined by assert_object_equals(). The corresponding elements
+// must occupy corresponding indices in their respective arrays.
+function assert_array_objects_equals(actual, expected, description) {
+ assert_true(Array.isArray(actual), description);
+ assert_equals(actual.length, expected.length, description);
+ actual.forEach(function(value, index) {
+ assert_object_equals(value, expected[index],
+ description + ' : object[' + index + ']');
+ });
+}
+
+// Asserts that |object| that is an instance of some interface has the attribute
+// |attribute_name| following the conditions specified by WebIDL, but it's
+// acceptable that the attribute |attribute_name| is an own property of the
+// object because we're in the middle of moving the attribute to a prototype
+// chain. Once we complete the transition to prototype chains,
+// assert_will_be_idl_attribute must be replaced with assert_idl_attribute
+// defined in testharness.js.
+//
+// FIXME: Remove assert_will_be_idl_attribute once we complete the transition
+// of moving the DOM attributes to prototype chains. (http://crbug.com/43394)
+function assert_will_be_idl_attribute(object, attribute_name, description) {
+ assert_true(typeof object === "object", description);
+
+ assert_true("hasOwnProperty" in object, description);
+
+ // Do not test if |attribute_name| is not an own property because
+ // |attribute_name| is in the middle of the transition to a prototype
+ // chain. (http://crbug.com/43394)
+
+ assert_true(attribute_name in object, description);
+}
+
+// Stringifies a DOM object. This function stringifies not only own properties
+// but also DOM attributes which are on a prototype chain. Note that
+// JSON.stringify only stringifies own properties.
+function stringifyDOMObject(object)
+{
+ function deepCopy(src) {
+ if (typeof src != "object")
+ return src;
+ var dst = Array.isArray(src) ? [] : {};
+ for (var property in src) {
+ dst[property] = deepCopy(src[property]);
+ }
+ return dst;
+ }
+ return JSON.stringify(deepCopy(object));
+}
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
new file mode 100644
index 00000000000..3e827382bd1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-add.js
@@ -0,0 +1,145 @@
+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(),
+ new TypeError(),
+ 'Cache.add should throw a TypeError when no arguments are given.');
+ }, 'Cache.add called with no arguments');
+
+cache_test(function(cache) {
+ return cache.add('../resources/simple.txt')
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.add should resolve with undefined on success.');
+ });
+ }, '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'),
+ 'NetworkError',
+ 'Cache.add should throw a NetworkError for non-HTTP/HTTPS URLs.');
+ }, 'Cache.add called with non-HTTP/HTTPS URL');
+
+cache_test(function(cache) {
+ var request = new Request('../resources/simple.txt', {method: 'POST', body: 'Hello'});
+ return cache.add(request)
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.add should resolve with undefined on success.');
+ });
+ }, 'Cache.add called with Request object');
+
+cache_test(function(cache) {
+ var request = new Request('../resources/simple.txt', {method: 'POST', body: 'Hello'});
+ return request.text()
+ .then(function() {
+ assert_false(request.bodyUsed);
+ })
+ .then(function() {
+ return cache.add(request);
+ });
+ }, 'Cache.add called with Request object with a used body');
+
+cache_test(function(cache) {
+ var request = new Request('../resources/simple.txt', {method: 'POST', body: 'Hello'});
+ return cache.add(request)
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.add should resolve with undefined on success.');
+ })
+ .then(function() {
+ return assert_promise_rejects(
+ cache.add(request),
+ new TypeError(),
+ 'Cache.add should throw TypeError if same request is added twice.');
+ });
+ }, 'Cache.add called twice with the same Request object');
+
+cache_test(function(cache) {
+ return cache.add('this-does-not-exist-please-dont-create-it')
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.add should resolve with undefined on success.');
+ });
+ }, 'Cache.add with request that results in a status of 404');
+
+cache_test(function(cache) {
+ return cache.add('../resources/fetch-status.py?status=500')
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.add should resolve with undefined on success.');
+ });
+ }, 'Cache.add with request that results in a status of 500');
+
+cache_test(function(cache) {
+ return assert_promise_rejects(
+ cache.addAll(),
+ new TypeError(),
+ 'Cache.addAll with no arguments should throw TypeError.');
+ }, 'Cache.addAll with no arguments');
+
+cache_test(function(cache) {
+ // 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(),
+ new TypeError(),
+ 'Cache.addAll should throw TypeError for an undefined argument.');
+ }, 'Cache.addAll with a mix of valid and undefined arguments');
+
+cache_test(function(cache) {
+ // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
+ var urls = ['../resources/simple.txt', self.location.href, '../resources/blank.html'];
+ return cache.addAll(urls)
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.addAll should resolve with undefined on ' +
+ 'success.');
+ });
+ }, 'Cache.addAll with string URL arguments');
+
+cache_test(function(cache) {
+ // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
+ var urls = ['../resources/simple.txt', self.location.href, '../resources/blank.html'];
+ var requests = urls.map(function(url) {
+ return new Request(url);
+ });
+ return cache.addAll(requests)
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.addAll should resolve with undefined on ' +
+ 'success.');
+ });
+ }, 'Cache.addAll with Request arguments');
+
+cache_test(function(cache) {
+ // Assumes that ../resources/simple.txt and ../resources/blank.html exist. The second
+ // resource does not.
+ var urls = ['../resources/simple.txt', 'this-resource-should-not-exist', '../resources/blank.html'];
+ var requests = urls.map(function(url) {
+ return new Request(url);
+ });
+ return cache.addAll(requests)
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.addAll should resolve with undefined on ' +
+ 'success.');
+ });
+ }, 'Cache.addAll with a mix of succeeding and failing requests');
+
+cache_test(function(cache) {
+ var request = new Request('../resources/simple.txt');
+ return assert_promise_rejects(
+ cache.addAll([request, request]),
+ new TypeError(),
+ 'Cache.addAll should throw TypeError if the same request is added ' +
+ 'twice.');
+ }, 'Cache.addAll called with the same Request object specified twice');
+
+done();
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
new file mode 100644
index 00000000000..36ca8473164
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-delete.js
@@ -0,0 +1,120 @@
+if (self.importScripts) {
+ importScripts('/resources/testharness.js');
+ importScripts('../resources/testharness-helpers.js');
+ importScripts('../resources/test-helpers.js');
+}
+
+var test_url = 'https://example.com/foo';
+
+// Construct a generic Request object. The URL is |test_url|. All other fields
+// are defaults.
+function new_test_request() {
+ return new Request(test_url);
+}
+
+// Construct a generic Response object.
+function new_test_response() {
+ return new Response('Hello world!', { status: 200 });
+}
+
+cache_test(function(cache) {
+ return assert_promise_rejects(
+ cache.delete(),
+ new TypeError(),
+ 'Cache.delete should reject with a TypeError when called with no ' +
+ 'arguments.');
+ }, 'Cache.delete with no arguments');
+
+cache_test(function(cache) {
+ return cache.put(new_test_request(), new_test_response())
+ .then(function() {
+ return cache.delete(test_url);
+ })
+ .then(function(result) {
+ assert_true(result,
+ 'Cache.delete should resolve with "true" if an entry ' +
+ 'was successfully deleted.');
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.delete should remove matching entries from cache.');
+ });
+ }, 'Cache.delete called with a string URL');
+
+cache_test(function(cache) {
+ var request = new Request(test_url, { method: 'POST', body: 'Abc' });
+ return cache.put(request.clone(), new_test_response())
+ .then(function() {
+ return cache.delete(request);
+ })
+ .then(function(result) {
+ assert_true(result,
+ 'Cache.delete should resolve with "true" if an entry ' +
+ 'was successfully deleted.');
+ assert_false(request.bodyUsed,
+ 'Cache.delete should not consume request body.');
+ });
+ }, 'Cache.delete called with a Request object');
+
+cache_test(function(cache) {
+ var request = new Request(test_url, { method: 'POST', body: 'Abc' });
+ return cache.put(request.clone(), new_test_response())
+ .then(function() {
+ return request.text();
+ })
+ .then(function() {
+ assert_true(request.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#body-mixin] ' +
+ 'Request.bodyUsed should be true after text() method ' +
+ 'resolves.');
+ })
+ .then(function() {
+ return cache.delete(request);
+ })
+ .then(function(result) {
+ assert_true(result,
+ 'Cache.delete should resolve with "true" if an entry ' +
+ 'was successfully deleted.');
+ });
+ }, 'Cache.delete with a Request object containing used body');
+
+cache_test(function(cache) {
+ return cache.delete(test_url)
+ .then(function(result) {
+ assert_false(result,
+ 'Cache.delete should resolve with "false" if there ' +
+ 'are no matching entries.');
+ });
+ }, 'Cache.delete with a non-existent entry');
+
+var cache_entries = {
+ a: {
+ request: new Request('http://example.com/abc'),
+ response: new Response('')
+ },
+
+ b: {
+ request: new Request('http://example.com/b'),
+ response: new Response('')
+ },
+
+ a_with_query: {
+ request: new Request('http://example.com/abc?q=r'),
+ response: new Response('')
+ }
+};
+
+function prepopulated_cache_test(test_function, description) {
+ cache_test(function(cache) {
+ return Promise.all(Object.keys(cache_entries).map(function(k) {
+ return cache.put(cache_entries[k].request.clone(),
+ cache_entries[k].response.clone());
+ }))
+ .then(function() {
+ return test_function(cache);
+ });
+ }, description);
+}
+
+done();
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
new file mode 100644
index 00000000000..4a027b6f165
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-match.js
@@ -0,0 +1,501 @@
+if (self.importScripts) {
+ importScripts('/resources/testharness.js');
+ importScripts('../resources/testharness-helpers.js');
+ importScripts('../resources/test-helpers.js');
+}
+
+// A set of Request/Response pairs to be used with prepopulated_cache_test().
+var simple_entries = [
+ {
+ name: 'a',
+ request: new Request('http://example.com/a'),
+ response: new Response('')
+ },
+
+ {
+ name: 'b',
+ request: new Request('http://example.com/b'),
+ response: new Response('')
+ },
+
+ {
+ name: 'a_with_query',
+ request: new Request('http://example.com/a?q=r'),
+ response: new Response('')
+ },
+
+ {
+ name: 'A',
+ request: new Request('http://example.com/A'),
+ response: new Response('')
+ },
+
+ {
+ name: 'a_https',
+ request: new Request('https://example.com/a'),
+ response: new Response('')
+ },
+
+ {
+ name: 'a_org',
+ request: new Request('http://example.org/a'),
+ response: new Response('')
+ },
+
+ {
+ name: 'cat',
+ request: new Request('http://example.com/cat'),
+ response: new Response('')
+ },
+
+ {
+ name: 'catmandu',
+ request: new Request('http://example.com/catmandu'),
+ response: new Response('')
+ },
+
+ {
+ name: 'cat_num_lives',
+ request: new Request('http://example.com/cat?lives=9'),
+ response: new Response('')
+ },
+
+ {
+ name: 'cat_in_the_hat',
+ request: new Request('http://example.com/cat/in/the/hat'),
+ response: new Response('')
+ },
+
+ {
+ name: 'secret_cat',
+ request: new Request('http://tom:jerry@example.com/cat'),
+ response: new Response('')
+ },
+
+ {
+ name: 'top_secret_cat',
+ request: new Request('http://tom:j3rry@example.com/cat'),
+ response: new Response('')
+ }
+];
+
+// A set of Request/Response pairs to be used with prepopulated_cache_test().
+// These contain a mix of test cases that use Vary headers.
+var vary_entries = [
+ {
+ name: 'vary_cookie_is_cookie',
+ request: new Request('http://example.com/c',
+ {headers: {'Cookies': 'is-for-cookie'}}),
+ response: new Response('',
+ {headers: {'Vary': 'Cookies'}})
+ },
+
+ {
+ name: 'vary_cookie_is_good',
+ request: new Request('http://example.com/c',
+ {headers: {'Cookies': 'is-good-enough-for-me'}}),
+ response: new Response('',
+ {headers: {'Vary': 'Cookies'}})
+ },
+
+ {
+ name: 'vary_cookie_absent',
+ request: new Request('http://example.com/c'),
+ response: new Response('',
+ {headers: {'Vary': 'Cookies'}})
+ },
+
+ {
+ name: 'vary_wildcard',
+ request: new Request('http://example.com/c',
+ {headers: {'Cookies': 'x', 'X-Key': '1'}}),
+ response: new Response('',
+ {headers: {'Vary': '*'}})
+ }
+];
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll('not-present-in-the-cache')
+ .then(function(result) {
+ assert_array_equivalent(
+ result, [],
+ 'Cache.matchAll should resolve with an empty array on failure.');
+ });
+ }, 'Cache.matchAll with no matching entries');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match('not-present-in-the-cache')
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.match failures should resolve with undefined.');
+ });
+ }, 'Cache.match with no matching entries');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(entries.a.request.url)
+ .then(function(result) {
+ assert_array_objects_equals(result, [entries.a.response],
+ 'Cache.matchAll should match by URL.');
+ });
+ }, 'Cache.matchAll with URL');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(entries.a.request.url)
+ .then(function(result) {
+ assert_object_equals(result, entries.a.response,
+ 'Cache.match should match by URL.');
+ });
+ }, 'Cache.match with URL');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(entries.a.request)
+ .then(function(result) {
+ assert_array_objects_equals(
+ result, [entries.a.response],
+ 'Cache.matchAll should match by Request.');
+ });
+ }, 'Cache.matchAll with Request');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(entries.a.request)
+ .then(function(result) {
+ assert_object_equals(result, entries.a.response,
+ 'Cache.match should match by Request.');
+ });
+ }, 'Cache.match with Request');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(new Request(entries.a.request.url))
+ .then(function(result) {
+ assert_array_objects_equals(
+ result, [entries.a.response],
+ 'Cache.matchAll should match by Request.');
+ });
+ }, 'Cache.matchAll with new Request');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(new Request(entries.a.request.url))
+ .then(function(result) {
+ assert_object_equals(result, entries.a.response,
+ 'Cache.match should match by Request.');
+ });
+ }, 'Cache.match with new Request');
+
+cache_test(function(cache) {
+ var request = new Request('https://example.com/foo', {
+ method: 'POST',
+ body: 'Hello world!'
+ });
+ var response = new Response('Booyah!', {
+ status: 200,
+ headers: {'Content-Type': 'text/plain'}
+ });
+
+ return cache.put(request.clone(), response.clone())
+ .then(function() {
+ assert_false(
+ request.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#concept-body-used-flag] ' +
+ 'Request.bodyUsed flag should be initially false.');
+ })
+ .then(function() {
+ return cache.match(request);
+ })
+ .then(function(result) {
+ assert_false(request.bodyUsed,
+ 'Cache.match should not consume Request body.');
+ });
+ }, 'Cache.match with Request containing non-empty body');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(entries.a.request,
+ {ignoreSearch: true})
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [
+ entries.a.response,
+ entries.a_with_query.response
+ ],
+ 'Cache.matchAll with ignoreSearch should ignore the ' +
+ 'search parameters of cached request.');
+ });
+ },
+ 'Cache.matchAll with ignoreSearch option (request with no search ' +
+ 'parameters)');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(entries.a.request,
+ {ignoreSearch: true})
+ .then(function(result) {
+ assert_object_in_array(
+ result,
+ [
+ entries.a.response,
+ entries.a_with_query.response
+ ],
+ 'Cache.match with ignoreSearch should ignore the ' +
+ 'search parameters of cached request.');
+ });
+ },
+ 'Cache.match with ignoreSearch option (request with no search ' +
+ 'parameters)');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(entries.a_with_query.request,
+ {ignoreSearch: true})
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [
+ entries.a.response,
+ entries.a_with_query.response
+ ],
+ 'Cache.matchAll with ignoreSearch should ignore the ' +
+ 'search parameters of request.');
+ });
+ },
+ 'Cache.matchAll with ignoreSearch option (request with search parameter)');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(entries.a_with_query.request,
+ {ignoreSearch: true})
+ .then(function(result) {
+ assert_object_in_array(
+ result,
+ [
+ entries.a.response,
+ entries.a_with_query.response
+ ],
+ 'Cache.match with ignoreSearch should ignore the ' +
+ 'search parameters of request.');
+ });
+ },
+ 'Cache.match with ignoreSearch option (request with search parameter)');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(entries.cat.request.url + '#mouse')
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [
+ entries.cat.response,
+ ],
+ 'Cache.matchAll should ignore URL fragment.');
+ });
+ }, 'Cache.matchAll with URL containing fragment');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(entries.cat.request.url + '#mouse')
+ .then(function(result) {
+ assert_object_equals(result, entries.cat.response,
+ 'Cache.match should ignore URL fragment.');
+ });
+ }, 'Cache.match with URL containing fragment');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll('http')
+ .then(function(result) {
+ assert_array_equivalent(
+ result, [],
+ 'Cache.matchAll should treat query as a URL and not ' +
+ 'just a string fragment.');
+ });
+ }, 'Cache.matchAll with string fragment "http" as query');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match('http')
+ .then(function(result) {
+ assert_equals(
+ result, undefined,
+ 'Cache.match should treat query as a URL and not ' +
+ 'just a string fragment.');
+ });
+ }, 'Cache.match with string fragment "http" as query');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.matchAll(entries.secret_cat.request.url)
+ .then(function(result) {
+ assert_array_equivalent(
+ result, [entries.secret_cat.response],
+ 'Cache.matchAll should not ignore embedded credentials');
+ });
+ }, 'Cache.matchAll with URL containing credentials');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+ return cache.match(entries.secret_cat.request.url)
+ .then(function(result) {
+ assert_object_equals(
+ result, entries.secret_cat.response,
+ 'Cache.match should not ignore embedded credentials');
+ });
+ }, 'Cache.match with URL containing credentials');
+
+prepopulated_cache_test(vary_entries, function(cache, entries) {
+ return cache.matchAll('http://example.com/c')
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [
+ entries.vary_wildcard.response,
+ entries.vary_cookie_absent.response
+ ],
+ 'Cache.matchAll should exclude matches if a vary header is ' +
+ 'missing in the query request, but is present in the cached ' +
+ 'request.');
+ })
+
+ .then(function() {
+ return cache.matchAll(
+ new Request('http://example.com/c',
+ {headers: {'Cookies': 'none-of-the-above'}}));
+ })
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [
+ entries.vary_wildcard.response
+ ],
+ 'Cache.matchAll should exclude matches if a vary header is ' +
+ 'missing in the cached request, but is present in the query ' +
+ 'request.');
+ })
+
+ .then(function() {
+ return cache.matchAll(
+ new Request('http://example.com/c',
+ {headers: {'Cookies': 'is-for-cookie'}}));
+ })
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [entries.vary_cookie_is_cookie.response],
+ 'Cache.matchAll should match the entire header if a vary header ' +
+ 'is present in both the query and cached requests.');
+ });
+ }, 'Cache.matchAll with responses containing "Vary" header');
+
+prepopulated_cache_test(vary_entries, function(cache, entries) {
+ return cache.match('http://example.com/c')
+ .then(function(result) {
+ assert_object_in_array(
+ result,
+ [
+ entries.vary_wildcard.response,
+ entries.vary_cookie_absent.response
+ ],
+ 'Cache.match should honor "Vary" header.');
+ });
+ }, 'Cache.match with responses containing "Vary" header');
+
+prepopulated_cache_test(vary_entries, function(cache, entries) {
+ return cache.matchAll('http://example.com/c',
+ {ignoreVary: true})
+ .then(function(result) {
+ assert_array_equivalent(
+ result,
+ [
+ entries.vary_cookie_is_cookie.response,
+ entries.vary_cookie_is_good.response,
+ entries.vary_cookie_absent.response,
+ entries.vary_wildcard.response
+ ],
+ 'Cache.matchAll should honor "ignoreVary" parameter.');
+ });
+ }, 'Cache.matchAll with "ignoreVary" parameter');
+
+cache_test(function(cache) {
+ var request = new Request('http://example.com');
+ var response;
+ var request_url = new URL('../resources/simple.txt', location.href).href;
+ return fetch(request_url)
+ .then(function(fetch_result) {
+ response = fetch_result;
+ assert_equals(
+ response.url, request_url,
+ '[https://fetch.spec.whatwg.org/#dom-response-url] ' +
+ 'Reponse.url should return the URL of the response.');
+ return cache.put(request, response.clone());
+ })
+ .then(function() {
+ return cache.match(request.url);
+ })
+ .then(function(result) {
+ assert_object_equals(
+ result, response,
+ 'Cache.match should return a Response object that has the same ' +
+ 'properties as the stored response.');
+ return cache.match(response.url);
+ })
+ .then(function(result) {
+ assert_equals(
+ result, undefined,
+ 'Cache.match should not match cache entry based on response URL.');
+ });
+ }, 'Cache.match with Request and Response objects with different URLs');
+
+cache_test(function(cache) {
+ var request_url = new URL('../resources/simple.txt', location.href).href;
+ return fetch(request_url)
+ .then(function(fetch_result) {
+ return cache.put(new Request(request_url), fetch_result);
+ })
+ .then(function() {
+ return cache.match(request_url);
+ })
+ .then(function(result) {
+ return result.text();
+ })
+ .then(function(body_text) {
+ assert_equals(body_text, 'a simple text file\n',
+ 'Cache.match should return a Response object with a ' +
+ 'valid body.');
+ })
+ .then(function() {
+ return cache.match(request_url);
+ })
+ .then(function(result) {
+ return result.text();
+ })
+ .then(function(body_text) {
+ assert_equals(body_text, 'a simple text file\n',
+ 'Cache.match should return a Response object with a ' +
+ 'valid body each time it is called.');
+ });
+ }, 'Cache.match invoked multiple times for the same Request/Response');
+
+// Helpers ---
+
+// Run |test_function| with a Cache object as its only parameter. Prior to the
+// call, the Cache is populated by cache entries from |entries|. The latter is
+// expected to be an Object mapping arbitrary keys to objects of the form
+// {request: <Request object>, response: <Response object>}. There's no
+// guarantee on the order in which entries will be added to the cache.
+//
+// |test_function| should return a Promise that can be used with promise_test.
+function prepopulated_cache_test(entries, test_function, description) {
+ cache_test(function(cache) {
+ var p = Promise.resolve();
+ var hash = {};
+ entries.forEach(function(entry) {
+ p = p.then(function() {
+ return cache.put(entry.request.clone(),
+ entry.response.clone())
+ .catch(function(e) {
+ assert_unreached('Test setup failed for entry ' +
+ entry.name + ': ' + e);
+ });
+ });
+ hash[entry.name] = entry;
+ });
+ p = p.then(function() {
+ assert_equals(Object.keys(hash).length, entries.length);
+ });
+
+ return p.then(function() {
+ return test_function(cache, hash);
+ });
+ }, description);
+}
+
+done();
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
new file mode 100644
index 00000000000..ec1617f04e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-put.js
@@ -0,0 +1,324 @@
+if (self.importScripts) {
+ importScripts('/resources/testharness.js');
+ importScripts('../resources/testharness-helpers.js');
+ importScripts('../resources/test-helpers.js');
+}
+
+var test_url = 'https://example.com/foo';
+var test_body = 'Hello world!';
+
+cache_test(function(cache) {
+ var request = new Request(test_url);
+ var response = new Response(test_body);
+ return cache.put(request, response)
+ .then(function(result) {
+ assert_equals(result, undefined,
+ 'Cache.put should resolve with undefined on success.');
+ });
+ }, 'Cache.put called with simple Request and Response');
+
+cache_test(function(cache) {
+ var test_url = new URL('../resources/simple.txt', location.href).href;
+ var request = new Request(test_url);
+ var response;
+ return fetch(test_url)
+ .then(function(fetch_result) {
+ response = fetch_result.clone();
+ return cache.put(request, fetch_result);
+ })
+ .then(function() {
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_object_equals(result, response,
+ 'Cache.put should update the cache with ' +
+ 'new request and response.');
+ return result.text();
+ })
+ .then(function(body) {
+ assert_equals(body, 'a simple text file\n',
+ 'Cache.put should store response body.');
+ });
+ }, 'Cache.put called with Request and Response from fetch()');
+
+cache_test(function(cache) {
+ var request = new Request(test_url);
+ var response = new Response(test_body);
+ assert_false(request.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
+ 'Request.bodyUsed should be initially false.');
+ return cache.put(request, response)
+ .then(function() {
+ assert_false(request.bodyUsed,
+ 'Cache.put should not mark empty request\'s body used');
+ });
+ }, 'Cache.put with Request without a body');
+
+cache_test(function(cache) {
+ var request = new Request(test_url);
+ var response = new Response();
+ assert_false(response.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
+ 'Response.bodyUsed should be initially false.');
+ return cache.put(request, response)
+ .then(function() {
+ assert_false(response.bodyUsed,
+ 'Cache.put should not mark empty response\'s body used');
+ });
+ }, 'Cache.put with Response without a body');
+
+cache_test(function(cache) {
+ var request = new Request(test_url, {
+ method: 'POST',
+ body: 'Hello'
+ });
+ var response = new Response(test_body);
+ assert_false(request.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
+ 'Request.bodyUsed should be initially false.');
+ return cache.put(request, response.clone())
+ .then(function() {
+ assert_true(request.bodyUsed,
+ 'Cache.put should consume Request body.');
+ })
+ .then(function() {
+ return cache.match(request);
+ })
+ .then(function(result) {
+ assert_object_equals(result, response,
+ 'Cache.put should store response body.');
+ });
+ }, 'Cache.put with Request containing a body');
+
+cache_test(function(cache) {
+ var request = new Request(test_url);
+ var response = new Response(test_body);
+ return cache.put(request, response.clone())
+ .then(function() {
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_object_equals(result, response,
+ 'Cache.put should update the cache with ' +
+ 'new Request and Response.');
+ });
+ }, 'Cache.put with a Response containing an empty URL');
+
+cache_test(function(cache) {
+ var request = new Request(test_url);
+ var response = new Response('', {
+ status: 200,
+ headers: [['Content-Type', 'text/plain']]
+ });
+ return cache.put(request, response)
+ .then(function() {
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_equals(result.status, 200, 'Cache.put should store status.');
+ assert_equals(result.headers.get('Content-Type'), 'text/plain',
+ 'Cache.put should store headers.');
+ return result.text();
+ })
+ .then(function(body) {
+ assert_equals(body, '',
+ 'Cache.put should store response body.');
+ });
+ }, 'Cache.put with an empty response body');
+
+cache_test(function(cache) {
+ var test_url = new URL('../resources/fetch-status.py?status=500', location.href).href;
+ var request = new Request(test_url);
+ var response;
+ return fetch(test_url)
+ .then(function(fetch_result) {
+ assert_equals(fetch_result.status, 500,
+ 'Test framework error: The status code should be 500.');
+ response = fetch_result.clone();
+ return cache.put(request, fetch_result);
+ })
+ .then(function() {
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_object_equals(result, response,
+ 'Cache.put should update the cache with ' +
+ 'new request and response.');
+ return result.text();
+ })
+ .then(function(body) {
+ assert_equals(body, '',
+ 'Cache.put should store response body.');
+ });
+ }, 'Cache.put with HTTP 500 response');
+
+cache_test(function(cache) {
+ var alternate_response_body = 'New body';
+ var alternate_response = new Response(alternate_response_body,
+ { statusText: 'New status' });
+ return cache.put(new Request(test_url),
+ new Response('Old body', { statusText: 'Old status' }))
+ .then(function() {
+ return cache.put(new Request(test_url), alternate_response.clone());
+ })
+ .then(function() {
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_object_equals(result, alternate_response,
+ 'Cache.put should replace existing ' +
+ 'response with new response.');
+ return result.text();
+ })
+ .then(function(body) {
+ assert_equals(body, alternate_response_body,
+ 'Cache put should store new response body.');
+ });
+ }, 'Cache.put called twice with matching Requests and different Responses');
+
+cache_test(function(cache) {
+ var first_url = test_url;
+ var second_url = first_url + '#(O_o)';
+ var alternate_response_body = 'New body';
+ var alternate_response = new Response(alternate_response_body,
+ { statusText: 'New status' });
+ return cache.put(new Request(first_url),
+ new Response('Old body', { statusText: 'Old status' }))
+ .then(function() {
+ return cache.put(new Request(second_url), alternate_response.clone());
+ })
+ .then(function() {
+ return cache.match(test_url);
+ })
+ .then(function(result) {
+ assert_object_equals(result, alternate_response,
+ 'Cache.put should replace existing ' +
+ 'response with new response.');
+ return result.text();
+ })
+ .then(function(body) {
+ assert_equals(body, alternate_response_body,
+ 'Cache put should store new response body.');
+ });
+ }, 'Cache.put called twice with request URLs that differ only by a fragment');
+
+cache_test(function(cache) {
+ var entries = {
+ dark: {
+ url: 'http://darkhelmet:12345@example.com/spaceballs',
+ body: 'Moranis'
+ },
+
+ skroob: {
+ url: 'http://skroob:12345@example.com/spaceballs',
+ body: 'Brooks'
+ },
+
+ control: {
+ url: 'http://example.com/spaceballs',
+ body: 'v(o.o)v'
+ }
+ };
+
+ return Promise.all(Object.keys(entries).map(function(key) {
+ return cache.put(new Request(entries[key].url),
+ new Response(entries[key].body));
+ }))
+ .then(function() {
+ return Promise.all(Object.keys(entries).map(function(key) {
+ return cache.match(entries[key].url)
+ .then(function(result) {
+ return result.text();
+ })
+ .then(function(body) {
+ assert_equals(body, entries[key].body,
+ 'Cache put should store response body.');
+ });
+ }));
+ });
+ }, 'Cache.put with request URLs containing embedded credentials');
+
+cache_test(function(cache) {
+ var url = 'http://example.com/foo';
+ return cache.put(url, new Response('some body'))
+ .then(function() { return cache.match(url); })
+ .then(function(response) { return response.text(); })
+ .then(function(body) {
+ assert_equals(body, 'some body',
+ 'Cache.put should accept a string as request.');
+ });
+ }, 'Cache.put with a string request');
+
+cache_test(function(cache) {
+ return assert_promise_rejects(
+ cache.put(new Request(test_url), 'Hello world!'),
+ new TypeError(),
+ '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.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');
+
+cache_test(function(cache) {
+ var response = new Response(test_body);
+ return cache.put(new Request('relative-url'), response.clone())
+ .then(function() {
+ return cache.match(new URL('relative-url', location.href).href);
+ })
+ .then(function(result) {
+ assert_object_equals(result, response,
+ 'Cache.put should accept a relative URL ' +
+ 'as the request.');
+ });
+ }, 'Cache.put with a relative URL');
+
+cache_test(function(cache) {
+ var request = new Request('http://example.com/foo', { method: 'HEAD' });
+ return assert_promise_rejects(
+ cache.put(request, new Response(test_body)),
+ new TypeError(),
+ '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),
+ new TypeError(),
+ 'Cache.put should throw a TypeError for a null response.');
+ }, 'Cache.put with a null response');
+
+cache_test(function(cache) {
+ var request = new Request(test_url, {method: 'POST', body: test_body});
+ assert_false(request.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
+ 'Request.bodyUsed should be initially false.');
+ var copy = new Request(request);
+ assert_true(request.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#dom-request] ' +
+ 'Request constructor should set input\'s used flag.');
+ return assert_promise_rejects(
+ cache.put(request, new Response(test_body)),
+ new TypeError(),
+ 'Cache.put should throw a TypeError for a request with used body.');
+ }, 'Cache.put with a used request body');
+
+cache_test(function(cache) {
+ var response = new Response(test_body);
+ assert_false(response.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
+ 'Response.bodyUsed should be initially false.');
+ return response.text().then(function() {
+ assert_false(
+ response.bodyUsed,
+ '[https://fetch.spec.whatwg.org/#concept-body-consume-body] ' +
+ 'The text() method should not set "body passed" flag.');
+ return cache.put(new Request(test_url), response);
+ });
+ }, 'Cache.put with a used response body');
+
+done();
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
new file mode 100644
index 00000000000..4d7bc623f00
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-keys.js
@@ -0,0 +1,36 @@
+if (self.importScripts) {
+ importScripts('/resources/testharness.js');
+ importScripts('../resources/testharness-helpers.js');
+ importScripts('../resources/test-helpers.js');
+}
+
+var test_cache_list =
+ ['', 'example', 'Another cache name', 'A', 'a', 'ex ample'];
+
+promise_test(function(test) {
+ return self.caches.keys()
+ .then(function(keys) {
+ assert_true(Array.isArray(keys),
+ 'CacheStorage.keys should return an Array.');
+ return Promise.all(keys.map(function(key) {
+ return self.caches.delete(key);
+ }));
+ })
+ .then(function() {
+ return Promise.all(test_cache_list.map(function(key) {
+ return self.caches.open(key);
+ }));
+ })
+
+ .then(function() { return self.caches.keys(); })
+ .then(function(keys) {
+ assert_true(Array.isArray(keys),
+ 'CacheStorage.keys should return an Array.');
+ assert_array_equals(keys,
+ test_cache_list,
+ 'CacheStorage.keys should only return ' +
+ 'existing caches.');
+ });
+ }, 'CacheStorage keys');
+
+done();
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
new file mode 100644
index 00000000000..06b2888e891
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage-match.js
@@ -0,0 +1,123 @@
+if (self.importScripts) {
+ importScripts('/resources/testharness.js');
+ importScripts('../resources/testharness-helpers.js');
+ importScripts('../resources/test-helpers.js');
+}
+
+(function() {
+ var next_index = 1;
+
+ // Returns a transaction (request, response, and url) for a unique URL.
+ function create_unique_transaction(test) {
+ var uniquifier = String(next_index++);
+ var url = 'http://example.com/' + uniquifier;
+
+ return {
+ request: new Request(url),
+ response: new Response('hello'),
+ url: url
+ };
+ }
+
+ self.create_unique_transaction = create_unique_transaction;
+})();
+
+cache_test(function(cache) {
+ var transaction = create_unique_transaction();
+
+ return cache.put(transaction.request.clone(), transaction.response.clone())
+ .then(function() {
+ return self.caches.match(transaction.request);
+ })
+ .then(function(response) {
+ assert_object_equals(response, transaction.response,
+ 'The response should not have changed.');
+ });
+}, 'CacheStorageMatch with no cache name provided');
+
+cache_test(function(cache) {
+ var transaction = create_unique_transaction();
+
+ var test_cache_list = ['a', 'b', 'c'];
+ return cache.put(transaction.request.clone(), transaction.response.clone())
+ .then(function() {
+ return Promise.all(test_cache_list.map(function(key) {
+ return self.caches.open(key);
+ }));
+ })
+ .then(function() {
+ return self.caches.match(transaction.request);
+ })
+ .then(function(response) {
+ assert_object_equals(response, transaction.response,
+ 'The response should not have changed.');
+ });
+}, 'CacheStorageMatch from one of many caches');
+
+promise_test(function(test) {
+ var transaction = create_unique_transaction();
+
+ var test_cache_list = ['x', 'y', 'z'];
+ return Promise.all(test_cache_list.map(function(key) {
+ return self.caches.open(key);
+ }))
+ .then(function() { return caches.open('x'); })
+ .then(function(cache) {
+ return cache.put(transaction.request.clone(),
+ transaction.response.clone());
+ })
+ .then(function() {
+ return self.caches.match(transaction.request, {cacheName: 'x'});
+ })
+ .then(function(response) {
+ assert_object_equals(response, transaction.response,
+ 'The response should not have changed.');
+ })
+ .then(function() {
+ return self.caches.match(transaction.request, {cacheName: 'y'});
+ })
+ .then(function(response) {
+ assert_equals(response, undefined,
+ 'Cache y should not have a response for the request.');
+ });
+}, 'CacheStorageMatch from one of many caches by name');
+
+cache_test(function(cache) {
+ var transaction = create_unique_transaction();
+ return cache.put(transaction.url, transaction.response.clone())
+ .then(function() {
+ return self.caches.match(transaction.request);
+ })
+ .then(function(response) {
+ assert_object_equals(response, transaction.response,
+ 'The response should not have changed.');
+ });
+}, 'CacheStorageMatch a string request');
+
+promise_test(function(test) {
+ var transaction = create_unique_transaction();
+ return self.caches.match(transaction.request)
+ .then(function(response) {
+ assert_equals(response, undefined,
+ 'The response should not be found.');
+ })
+}, 'CacheStorageMatch with no cached entry');
+
+promise_test(function(test) {
+ var transaction = create_unique_transaction();
+ return self.caches.has('foo')
+ .then(function(has_foo) {
+ assert_false(has_foo, "The cache should not exist.");
+ return self.caches.match(transaction.request, {cacheName: 'foo'});
+ })
+ .then(function(response) {
+ assert_equals(response, undefined,
+ 'The response should not be found.');
+ return self.caches.has('foo');
+ })
+ .then(function(has_foo) {
+ assert_false(has_foo, "The cache should still not exist.");
+ })
+}, 'CacheStorageMatch with no caches available but name provided');
+
+done();
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
new file mode 100644
index 00000000000..cb8e0483b22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/script-tests/cache-storage.js
@@ -0,0 +1,192 @@
+if (self.importScripts) {
+ importScripts('/resources/testharness.js');
+ importScripts('../resources/testharness-helpers.js');
+ importScripts('../resources/test-helpers.js');
+}
+
+promise_test(function(t) {
+ var cache_name = 'cache-storage/foo';
+ return self.caches.delete(cache_name)
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function(cache) {
+ assert_true(cache instanceof Cache,
+ 'CacheStorage.open should return a Cache.');
+ });
+ }, 'CacheStorage.open');
+
+promise_test(function(t) {
+ // Note that this test may collide with other tests running in the same
+ // origin that also uses an empty cache name.
+ var cache_name = '';
+ return self.caches.delete(cache_name)
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function(cache) {
+ assert_true(cache instanceof Cache,
+ 'CacheStorage.open should accept an empty name.');
+ });
+ }, 'CacheStorage.open with an empty name');
+
+promise_test(function(t) {
+ return assert_promise_rejects(
+ self.caches.open(),
+ new TypeError(),
+ 'CacheStorage.open should throw TypeError if called with no arguments.');
+ }, 'CacheStorage.open with no arguments');
+
+promise_test(function(t) {
+ var test_cases = [
+ {
+ name: 'cache-storage/lowercase',
+ should_not_match:
+ [
+ 'cache-storage/Lowercase',
+ ' cache-storage/lowercase',
+ 'cache-storage/lowercase '
+ ]
+ },
+ {
+ name: 'cache-storage/has a space',
+ should_not_match:
+ [
+ 'cache-storage/has'
+ ]
+ },
+ {
+ name: 'cache-storage/has\000_in_the_name',
+ should_not_match:
+ [
+ 'cache-storage/has',
+ 'cache-storage/has_in_the_name'
+ ]
+ }
+ ];
+ return Promise.all(test_cases.map(function(testcase) {
+ var cache_name = testcase.name;
+ return self.caches.delete(cache_name)
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function() {
+ return self.caches.has(cache_name);
+ })
+ .then(function(result) {
+ assert_true(result,
+ 'CacheStorage.has should return true for existing ' +
+ 'cache.');
+ })
+ .then(function() {
+ return Promise.all(
+ testcase.should_not_match.map(function(cache_name) {
+ return self.caches.has(cache_name)
+ .then(function(result) {
+ assert_false(result,
+ 'CacheStorage.has should only perform ' +
+ 'exact matches on cache names.');
+ });
+ }));
+ })
+ .then(function() {
+ return self.caches.delete(cache_name);
+ });
+ }));
+ }, 'CacheStorage.has with existing cache');
+
+promise_test(function(t) {
+ return self.caches.has('cheezburger')
+ .then(function(result) {
+ assert_false(result,
+ 'CacheStorage.has should return false for ' +
+ 'nonexistent cache.');
+ });
+ }, 'CacheStorage.has with nonexistent cache');
+
+promise_test(function(t) {
+ var cache_name = 'cache-storage/open';
+ var cache;
+ return self.caches.delete(cache_name)
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function(result) {
+ cache = result;
+ })
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function(result) {
+ assert_equals(result, cache,
+ 'CacheStorage.open should return the named Cache ' +
+ 'object if it exists.');
+ })
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function(result) {
+ assert_equals(result, cache,
+ 'CacheStorage.open should return the same ' +
+ 'instance of an existing Cache object.');
+ });
+ }, 'CacheStorage.open with existing cache');
+
+promise_test(function(t) {
+ var cache_name = 'cache-storage/delete';
+
+ return self.caches.delete(cache_name)
+ .then(function() {
+ return self.caches.open(cache_name);
+ })
+ .then(function() { return self.caches.delete(cache_name); })
+ .then(function(result) {
+ assert_true(result,
+ 'CacheStorage.delete should return true after ' +
+ 'deleting an existing cache.');
+ })
+
+ .then(function() { return self.caches.has(cache_name); })
+ .then(function(cache_exists) {
+ assert_false(cache_exists,
+ 'CacheStorage.has should return false after ' +
+ 'fulfillment of CacheStorage.delete promise.');
+ });
+ }, 'CacheStorage.delete with existing cache');
+
+promise_test(function(t) {
+ return self.caches.delete('cheezburger')
+ .then(function(result) {
+ assert_false(result,
+ 'CacheStorage.delete should return false for a ' +
+ 'nonexistent cache.');
+ });
+ }, '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)
+ .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.keys(); })
+ .then(function(keys) {
+ assert_true(keys.indexOf(bad_name) !== -1,
+ 'keys should include cache with bad name');
+ })
+ .then(function() { return self.caches.has(bad_name); })
+ .then(function(cache_exists) {
+ assert_true(cache_exists,
+ 'CacheStorage names should be not be converted.');
+ })
+ .then(function() { return self.caches.has(converted_name); })
+ .then(function(cache_exists) {
+ assert_false(cache_exists,
+ 'CacheStorage names should be not be converted.');
+ });
+ }, 'CacheStorage names are DOMStrings not USVStrings');
+
+done();
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-add.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-add.https.html
new file mode 100644
index 00000000000..3582b6e06d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-add.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache.add and Cache.addAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-add">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-add.js');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-delete.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-delete.https.html
new file mode 100644
index 00000000000..50bc36d4582
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-delete.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache.delete</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-delete">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-delete.js');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-match.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-match.https.html
new file mode 100644
index 00000000000..859b1cd0554
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-match.https.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Cache.match and Cache.matchAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-match">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-match.js');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-put.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-put.https.html
new file mode 100644
index 00000000000..d67f9391a75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-put.https.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Cache.put</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-put">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-put.js');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-keys.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-keys.https.html
new file mode 100644
index 00000000000..48e9cd383bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-keys.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>CacheStorage.keys</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-storage-keys.js');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-match.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-match.https.html
new file mode 100644
index 00000000000..24c6cea4359
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage-match.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>CacheStorage.match</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage-match">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-storage-match.js');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage.https.html
new file mode 100644
index 00000000000..b199a65a67b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/serviceworker/cache-storage.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>CacheStorage</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-storage.js');
+</script>
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
new file mode 100644
index 00000000000..2cd938356db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-add.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache Storage: Cache.add and Cache.addAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-add">
+<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
new file mode 100644
index 00000000000..3ac04a6b187
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-delete.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache Storage: Cache.delete</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-delete">
+<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
new file mode 100644
index 00000000000..093df8db4a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-match.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache Storage: Cache.match and Cache.matchAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-match">
+<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-put.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html
new file mode 100644
index 00000000000..b32cfa2c0bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache Storage: Cache.put</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-put">
+<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
new file mode 100644
index 00000000000..caf1f75f9d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-keys.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache Storage: CacheStorage.keys</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<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
new file mode 100644
index 00000000000..fe8972508f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage-match.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache Storage: CacheStorage.match</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage-match">
+<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
new file mode 100644
index 00000000000..48cb364bdbf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/cache-storage.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache Storage: CacheStorage</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<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
new file mode 100644
index 00000000000..aa8613ec77d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/window/sandboxed-iframes.https.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>Cache Storage: Verify access in sandboxed iframes</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<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) {
+ return new Promise(function(resolve, reject) {
+ var iframe = document.createElement('iframe');
+ iframe.onload = function() { resolve(iframe); };
+
+ iframe.sandbox = sandbox;
+ iframe.src = src;
+
+ document.documentElement.appendChild(iframe);
+ });
+}
+
+function wait_for_message(id) {
+ return new Promise(function(resolve) {
+ self.addEventListener('message', function listener(e) {
+ if (e.data.id === id) {
+ resolve(e.data);
+ self.removeEventListener(listener);
+ }
+ });
+ });
+}
+
+var counter = 0;
+
+promise_test(function(t) {
+ return load_iframe('../resources/iframe.html',
+ 'allow-scripts allow-same-origin')
+ .then(function(iframe) {
+ var id = ++counter;
+ iframe.contentWindow.postMessage({id: id}, '*');
+ return wait_for_message(id);
+ })
+ .then(function(message) {
+ assert_equals(
+ message.result, 'allowed',
+ 'Access should be allowed if sandbox has allow-same-origin');
+ });
+}, 'Sandboxed iframe with allow-same-origin is allowed access');
+
+promise_test(function(t) {
+ return load_iframe('../resources/iframe.html',
+ 'allow-scripts')
+ .then(function(iframe) {
+ var id = ++counter;
+ iframe.contentWindow.postMessage({id: id}, '*');
+ return wait_for_message(id);
+ })
+ .then(function(message) {
+ assert_equals(
+ message.result, 'denied',
+ 'Access should be denied if sandbox lacks allow-same-origin');
+ assert_equals(message.name, 'SecurityError',
+ 'Failure should be a SecurityError');
+ });
+}, 'Sandboxed iframe without allow-same-origin is denied access');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-add.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-add.https.html
new file mode 100644
index 00000000000..b6aa9da8ceb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-add.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache.add and Cache.addAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-add">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-add.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-delete.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-delete.https.html
new file mode 100644
index 00000000000..902be7ed3db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-delete.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Cache.delete</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-delete">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-delete.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-match.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-match.https.html
new file mode 100644
index 00000000000..b0926fce360
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-match.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache.match and Cache.matchAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-match">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-match.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-put.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-put.https.html
new file mode 100644
index 00000000000..887693061d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-put.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache.put</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-put">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-put.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-keys.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-keys.https.html
new file mode 100644
index 00000000000..9f34f5a6ba4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-keys.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>CacheStorage.keys</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-storage-keys.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-match.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-match.https.html
new file mode 100644
index 00000000000..9d2d47b87db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage-match.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>CacheStorage.match</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage-match">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-storage-match.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage.https.html b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage.https.html
new file mode 100644
index 00000000000..4162824b4d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/cache-storage/worker/cache-storage.https.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>CacheStorage</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-storage">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-storage.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-workers/resources/test-helpers.js b/tests/wpt/web-platform-tests/service-workers/service-workers/resources/test-helpers.js
new file mode 100644
index 00000000000..147ea612c2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-workers/resources/test-helpers.js
@@ -0,0 +1,222 @@
+// Adapter for testharness.js-style tests with Service Workers
+
+function service_worker_unregister_and_register(test, url, scope) {
+ if (!scope || scope.length == 0)
+ return Promise.reject(new Error('tests must define a scope'));
+
+ var options = { scope: scope };
+ return service_worker_unregister(test, scope)
+ .then(function() {
+ return navigator.serviceWorker.register(url, options);
+ })
+ .catch(unreached_rejection(test,
+ 'unregister and register should not fail'));
+}
+
+function service_worker_unregister(test, documentUrl) {
+ return navigator.serviceWorker.getRegistration(documentUrl)
+ .then(function(registration) {
+ if (registration)
+ return registration.unregister();
+ })
+ .catch(unreached_rejection(test, 'unregister should not fail'));
+}
+
+function service_worker_unregister_and_done(test, scope) {
+ return service_worker_unregister(test, scope)
+ .then(test.done.bind(test));
+}
+
+function unreached_fulfillment(test, prefix) {
+ return test.step_func(function(result) {
+ var error_prefix = prefix || 'unexpected fulfillment';
+ assert_unreached(error_prefix + ': ' + result);
+ });
+}
+
+// Rejection-specific helper that provides more details
+function unreached_rejection(test, prefix) {
+ return test.step_func(function(error) {
+ var reason = error.message || error.name || error;
+ var error_prefix = prefix || 'unexpected rejection';
+ assert_unreached(error_prefix + ': ' + reason);
+ });
+}
+
+// Adds an iframe to the document and returns a promise that resolves to the
+// iframe when it finishes loading. The caller is responsible for removing the
+// iframe later if needed.
+function with_iframe(url) {
+ return new Promise(function(resolve) {
+ var frame = document.createElement('iframe');
+ frame.src = url;
+ frame.onload = function() { resolve(frame); };
+ document.body.appendChild(frame);
+ });
+}
+
+function normalizeURL(url) {
+ return new URL(url, self.location).toString().replace(/#.*$/, '');
+}
+
+function wait_for_update(test, registration) {
+ if (!registration || registration.unregister == undefined) {
+ return Promise.reject(new Error(
+ 'wait_for_update must be passed a ServiceWorkerRegistration'));
+ }
+
+ return new Promise(test.step_func(function(resolve) {
+ registration.addEventListener('updatefound', test.step_func(function() {
+ resolve(registration.installing);
+ }));
+ }));
+}
+
+function wait_for_state(test, worker, state) {
+ if (!worker || worker.state == undefined) {
+ return Promise.reject(new Error(
+ 'wait_for_state must be passed a ServiceWorker'));
+ }
+ if (worker.state === state)
+ return Promise.resolve(state);
+
+ if (state === 'installing') {
+ switch (worker.state) {
+ case 'installed':
+ case 'activating':
+ case 'activated':
+ case 'redundant':
+ return Promise.reject(new Error(
+ 'worker is ' + worker.state + ' but waiting for ' + state));
+ }
+ }
+
+ if (state === 'installed') {
+ switch (worker.state) {
+ case 'activating':
+ case 'activated':
+ case 'redundant':
+ return Promise.reject(new Error(
+ 'worker is ' + worker.state + ' but waiting for ' + state));
+ }
+ }
+
+ if (state === 'activating') {
+ switch (worker.state) {
+ case 'activated':
+ case 'redundant':
+ return Promise.reject(new Error(
+ 'worker is ' + worker.state + ' but waiting for ' + state));
+ }
+ }
+
+ if (state === 'activated') {
+ switch (worker.state) {
+ case 'redundant':
+ return Promise.reject(new Error(
+ 'worker is ' + worker.state + ' but waiting for ' + state));
+ }
+ }
+
+ return new Promise(test.step_func(function(resolve) {
+ worker.addEventListener('statechange', test.step_func(function() {
+ if (worker.state === state)
+ resolve(state);
+ }));
+ }));
+}
+
+// Declare a test that runs entirely in the ServiceWorkerGlobalScope. The |url|
+// is the service worker script URL. This function:
+// - Instantiates a new test with the description specified in |description|.
+// The test will succeed if the specified service worker can be successfully
+// registered and installed.
+// - Creates a new ServiceWorker registration with a scope unique to the current
+// document URL. Note that this doesn't allow more than one
+// service_worker_test() to be run from the same document.
+// - Waits for the new worker to begin installing.
+// - Imports tests results from tests running inside the ServiceWorker.
+function service_worker_test(url, description) {
+ // If the document URL is https://example.com/document and the script URL is
+ // https://example.com/script/worker.js, then the scope would be
+ // https://example.com/script/scope/document.
+ var scope = new URL('scope' + window.location.pathname,
+ new URL(url, window.location)).toString();
+ promise_test(function(test) {
+ return service_worker_unregister_and_register(test, url, scope)
+ .then(function(registration) {
+ add_completion_callback(function() {
+ registration.unregister();
+ });
+ return wait_for_update(test, registration)
+ .then(function(worker) {
+ return fetch_tests_from_worker(worker);
+ });
+ });
+ }, description);
+}
+
+function get_host_info() {
+ var ORIGINAL_HOST = '127.0.0.1';
+ var REMOTE_HOST = 'localhost';
+ var UNAUTHENTICATED_HOST = 'example.test';
+ var HTTP_PORT = 8000;
+ var HTTPS_PORT = 8443;
+ try {
+ // In W3C test, we can get the hostname and port number in config.json
+ // using wptserve's built-in pipe.
+ // http://wptserve.readthedocs.org/en/latest/pipes.html#built-in-pipes
+ HTTP_PORT = eval('{{ports[http][0]}}');
+ HTTPS_PORT = eval('{{ports[https][0]}}');
+ ORIGINAL_HOST = eval('\'{{host}}\'');
+ REMOTE_HOST = 'www1.' + ORIGINAL_HOST;
+ } catch (e) {
+ }
+ return {
+ HTTP_ORIGIN: 'http://' + ORIGINAL_HOST + ':' + HTTP_PORT,
+ HTTPS_ORIGIN: 'https://' + ORIGINAL_HOST + ':' + HTTPS_PORT,
+ HTTP_REMOTE_ORIGIN: 'http://' + REMOTE_HOST + ':' + HTTP_PORT,
+ HTTPS_REMOTE_ORIGIN: 'https://' + REMOTE_HOST + ':' + HTTPS_PORT,
+ UNAUTHENTICATED_ORIGIN: 'http://' + UNAUTHENTICATED_HOST + ':' + HTTP_PORT
+ };
+}
+
+function base_path() {
+ return location.pathname.replace(/\/[^\/]*$/, '/');
+}
+
+function test_login(test, origin, username, password, cookie) {
+ return new Promise(function(resolve, reject) {
+ with_iframe(
+ origin +
+ '/serviceworker/resources/fetch-access-control-login.html')
+ .then(test.step_func(function(frame) {
+ var channel = new MessageChannel();
+ channel.port1.onmessage = test.step_func(function() {
+ frame.remove();
+ resolve();
+ });
+ frame.contentWindow.postMessage(
+ {username: username, password: password, cookie: cookie},
+ origin, [channel.port2]);
+ }));
+ });
+}
+
+function login(test) {
+ return test_login(test, 'http://127.0.0.1:8000',
+ 'username1', 'password1', 'cookie1')
+ .then(function() {
+ return test_login(test, 'http://localhost:8000',
+ 'username2', 'password2', 'cookie2');
+ });
+}
+
+function login_https(test) {
+ return test_login(test, 'https://127.0.0.1:8443',
+ 'username1s', 'password1s', 'cookie1')
+ .then(function() {
+ return test_login(test, 'https://localhost:8443',
+ 'username2s', 'password2s', 'cookie2');
+ });
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/tools/blink-import.py b/tests/wpt/web-platform-tests/service-workers/tools/blink-import.py
new file mode 100644
index 00000000000..87ca221c1a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/tools/blink-import.py
@@ -0,0 +1,204 @@
+import os
+import re
+import shutil
+import glob
+import tempfile
+import sys
+from collections import defaultdict
+
+here = os.path.abspath(os.path.split(__file__)[0])
+
+def get_extra_files(chromium_root):
+ return [(os.path.join(chromium_root, "LayoutTests", "http", "tests", "resources", "testharness-helpers.js"),
+ os.path.join("resources", "testharness-helpers.js"))]
+
+resources_re = re.compile("/?(?:\.\./)*resources/(testharness(?:report)?)\.js")
+
+def resources_path(line, depth):
+ return False, resources_re.sub(r"/resources/\1.js", line)
+
+php_re = re.compile("\.php")
+
+def python_to_php(line, depth):
+ return False, php_re.sub(".py", line)
+
+abs_testharness_helpers_re = re.compile("([\"'])/resources/testharness-helpers.js")
+testharness_helpers_re = re.compile("\.\./((?:\.\./)*)resources/testharness-helpers.js")
+
+def testharness_helpers(line, depth):
+ if abs_testharness_helpers_re.findall(line):
+ return False, abs_testharness_helpers_re.sub(r"\1%sresources/testharness-helpers.js" % ("../" * (depth - 1)), line)
+ return False, testharness_helpers_re.sub(r"\1resources/testharness-helpers.js", line)
+
+serviceworker_path_re = re.compile("/serviceworker/")
+def service_worker_path(line, depth):
+ return False, serviceworker_path_re.sub("/service-workers/", line)
+
+localhost_re = re.compile("localhost")
+alt_host_re = re.compile("127\.0\.0\.1")
+port_http_re = re.compile("8000")
+port_https_re = re.compile("8000")
+
+
+def server_names(line, depth):
+ line, count_0 = localhost_re.subn("{{host}}", line)
+ line, count_1 = alt_host_re.subn("{{domains[www]}}", line)
+ line, count_2 = port_http_re.subn("{{ports[http][0]}}", line)
+ line, count_3 = port_https_re.subn("{{ports[https][0]}}", line)
+
+ count = count_0 + count_1 + count_2 + count_3
+
+ return bool(count), line
+
+
+def source_paths(chromium_root):
+ for dirpath, dirnames, filenames in os.walk(chromium_root):
+ if "chromium" in dirnames:
+ dirnames.remove("chromium")
+ for filename in filenames:
+ if filename.endswith("-expected.txt") or filename.endswith(".php"):
+ continue
+ yield os.path.relpath(os.path.join(dirpath, filename), chromium_root)
+
+
+def do_subs(path, line):
+ depth = len(os.path.split(os.path.sep))
+ subs = [resources_path, python_to_php, testharness_helpers, service_worker_path, server_names]
+ file_is_template = False
+ for sub in subs:
+ added_template, line = sub(line, depth)
+ if added_template:
+ file_is_template = True
+ return file_is_template, line
+
+def get_head(git):
+ return git("rev-parse", "HEAD")
+
+def get_changes(git, path, old, new):
+ data = git("diff", "--name-status", "-z", "--no-renames", "%s..%s" % (old, new), "--", path)
+ items = data.split("\0")
+ rv = defaultdict(list)
+ for status, path in items:
+ rv[status].append(path)
+
+ return rv
+
+def copy(src_path, out_dir, rel_path):
+ dest = os.path.normpath(os.path.join(out_dir, rel_path))
+ dest_dir = os.path.split(dest)[0]
+ if not os.path.exists(dest_dir):
+ os.makedirs(dest_dir)
+ shutil.copy2(src_path, dest)
+
+def copy_local_files(local_files, out_root, tmp_dir):
+ for path in local_files:
+ rel_path = os.path.relpath(path, out_root)
+ copy(path, tmp_dir, rel_path)
+
+def copy_extra_files(chromium_root, tmp_dir):
+ for in_path, rel_path in get_extra_files(chromium_root):
+ copy(in_path, tmp_dir, rel_path)
+
+def sub_changed_filenames(filename_changes, f):
+ rv = []
+ for line in f:
+ for in_name, out_name in filename_changes.iteritems():
+ line = line.replace(in_name, out_name)
+ rv.append(line)
+ return "".join(rv)
+
+testharness_re = re.compile("<script[^>]*src=[\"']?/resources/testharness.js[\"' ][^>]*>")
+
+def is_top_level_test(path, data):
+ if os.path.splitext(path)[1] != ".html":
+ return False
+ for line in data:
+ if testharness_re.findall(line):
+ return True
+ return False
+
+def add_suffix(path, suffix):
+ root, ext = os.path.splitext(path)
+ return root + ".%s" % suffix + ext
+
+def main():
+ if "--cache-tests" in sys.argv:
+ sw_path = os.path.join("LayoutTests", "http", "tests", "cachestorage")
+ out_root = os.path.abspath(os.path.join(here, "..", "cache-storage"))
+ elif "--sw-tests" in sys.argv:
+ sw_path = os.path.join("LayoutTests", "http", "tests", "serviceworkers")
+ out_root = os.path.abspath(os.path.join(here, "..", "service-worker"))
+ else:
+ raise ValueError("Must supply either --cache-tests or --sw-tests")
+
+ chromium_root = os.path.abspath(sys.argv[1])
+
+ work_path = tempfile.mkdtemp()
+
+ test_path = os.path.join(chromium_root, sw_path)
+
+ local_files = glob.glob(os.path.normpath(os.path.join(here, "..", "resources", "*.py")))
+
+ if not os.path.exists(out_root):
+ os.mkdir(out_root)
+
+ copy_local_files(local_files, out_root, work_path)
+ copy_extra_files(chromium_root, work_path)
+
+ path_changes = {}
+
+ for path in source_paths(test_path):
+ out_path = os.path.join(work_path, path)
+ out_dir = os.path.dirname(out_path)
+ if not os.path.exists(out_dir):
+ os.makedirs(out_dir)
+ with open(os.path.join(test_path, path)) as in_f:
+ data = []
+ sub = False
+ for line in in_f:
+ sub_flag, output_line = do_subs(path, line)
+ data.append(output_line)
+ if sub_flag:
+ sub = True
+ is_test = is_top_level_test(out_path, data)
+
+ initial_path = out_path
+
+ if is_test:
+ path_1 = add_suffix(out_path, "https")
+ else:
+ path_1 = out_path
+
+ if sub:
+ path_2 = add_suffix(out_path, "sub")
+ else:
+ path_2 = path_1
+
+ if path_2 != initial_path:
+ path_changes[initial_path] = path_2
+
+ with open(path_2, "w") as out_f:
+ out_f.write("".join(data))
+
+ filename_changes = {}
+
+ for k, v in path_changes.iteritems():
+ if os.path.basename(k) in filename_changes:
+ print "Got duplicate name:" + os.path.basename(k)
+ filename_changes[os.path.basename(k)] = os.path.basename(v)
+
+ for path in source_paths(work_path):
+ full_path = os.path.join(work_path, path)
+ with open(full_path) as f:
+ data = sub_changed_filenames(filename_changes, f)
+ with open(full_path, "w") as f:
+ f.write(data)
+
+ for dirpath, dirnames, filenames in os.walk(work_path):
+ for filename in filenames:
+ in_path = os.path.join(dirpath, filename)
+ rel_path = os.path.relpath(in_path, work_path)
+ copy(in_path, out_root, rel_path)
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
index 914f7736419..7c0f976a44b 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
@@ -46,6 +46,18 @@ class SourceFile(object):
self.meta_flags = self.name.split(".")[1:]
+ def __getstate__(self):
+ # Remove computed properties if we pickle this class
+ rv = self.__dict__.copy()
+
+ if "__cached_properties__" in rv:
+ cached_properties = rv["__cached_properties__"]
+ for key in rv.keys():
+ if key in cached_properties:
+ del rv[key]
+ del rv["__cached_properties__"]
+ return rv
+
def name_prefix(self, prefix):
"""Check if the filename starts with a given prefix
diff --git a/tests/wpt/web-platform-tests/tools/manifest/utils.py b/tests/wpt/web-platform-tests/tools/manifest/utils.py
index cdd274c9b47..60e00ee74d3 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/utils.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/utils.py
@@ -40,4 +40,5 @@ class cached_property(object):
if self.name not in obj.__dict__:
obj.__dict__[self.name] = self.func(obj)
+ obj.__dict__.setdefault("__cached_properties__", set()).add(self.name)
return obj.__dict__[self.name]
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py
index 4eeb322cc61..78b982c4970 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py
@@ -285,7 +285,7 @@ class WebTestRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
if response:
response.set_error(500, err)
response.write()
- logger.error(err)
+ self.logger.error(err)
def get_request_line(self):
try:
diff --git a/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/close/close-basic.html b/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/close/close-basic.html
index 775c83eff53..d031bfbf3e0 100644
--- a/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/close/close-basic.html
+++ b/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/close/close-basic.html
@@ -14,6 +14,8 @@ async_test(function(t) {
assert_equals(e.wasClean, false, 'e.wasClean = true');
delete e.wasClean;
assert_equals(e.wasClean, false, 'delete e.wasClean');
+ delete CloseEvent.prototype.wasClean;
+ assert_equals(e.wasClean, undefined, 'delete CloseEvent.prototype.wasClean');
t.done();
});
ws.close();
diff --git a/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/readyState/003.html b/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/readyState/003.html
index 8071d220e3a..5ed73191e96 100644
--- a/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/readyState/003.html
+++ b/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/readyState/003.html
@@ -6,10 +6,11 @@
<div id=log></div>
<script>
test(function(t) {
- delete WebSocket.prototype.readyState;
var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/');
ws.close();
delete ws.readyState;
- assert_equals(ws.readyState, ws.CLOSING);
+ assert_equals(ws.readyState, ws.CLOSING, 'delete ws.readyState');
+ delete WebSocket.prototype.readyState;
+ assert_equals(ws.readyState, undefined, 'delete WebSocket.prototype.readyState');
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/url/003.html b/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/url/003.html
index 12118937123..3f0a2a28940 100644
--- a/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/url/003.html
+++ b/tests/wpt/web-platform-tests/websockets/interfaces/WebSocket/url/003.html
@@ -8,6 +8,8 @@
test(function() {
var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/');
delete ws.url;
- assert_equals(ws.url, SCHEME_DOMAIN_PORT+'/');
+ assert_equals(ws.url, SCHEME_DOMAIN_PORT+'/', 'delete ws.url');
+ delete WebSocket.prototype.url;
+ assert_equals(ws.url, undefined, 'delete WebSocket.prototype.url');
});
</script>
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js
index ff0c6fc951c..954c46c07ec 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js
@@ -1,11 +1,13 @@
importScripts("/resources/testharness.js");
-test(function() {
+test(function(t) {
var i = 0;
- addEventListener("message", this.step_func(function listener(evt) {
- ++i;
- removeEventListener("message", listener, true);
- }), true);
+ addEventListener("message", function listener(evt) {
+ t.step(function() {
+ ++i;
+ removeEventListener("message", listener, true);
+ });
+ }, true);
self.dispatchEvent(new Event("message"));
self.dispatchEvent(new Event("message"));
assert_equals(i, 1);
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html
index 79adef16014..4b5af71d516 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html
@@ -21,7 +21,7 @@ async_test(function() {
assert_equals(typeof e.message, 'string', 'typeof e.message');
assert_equals(e.filename, document.URL+'#', 'e.filename');
assert_equals(typeof e.lineno, 'number', 'typeof e.lineno');
- assert_equals(typeof e.column, 'number', 'typeof e.column');
+ assert_equals(typeof e.colno, 'number', 'typeof e.column');
e.preventDefault(); // "handled"
this.done();
});
@@ -29,4 +29,4 @@ async_test(function() {
</script>
<!--
*/
-//--> \ No newline at end of file
+//-->
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html
index 96ee06dd207..f6107ada433 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html
@@ -21,7 +21,7 @@ async_test(function() {
assert_equals(typeof e.message, 'string', 'typeof e.message');
assert_equals(e.filename, document.URL+'#', 'e.filename');
assert_equals(typeof e.lineno, 'number', 'typeof e.lineno');
- assert_equals(typeof e.column, 'number', 'typeof e.column');
+ assert_equals(typeof e.colno, 'number', 'typeof e.column');
e.preventDefault(); // "handled"
this.done();
});
@@ -29,4 +29,4 @@ async_test(function() {
</script>
<!--
*/
-//--> \ No newline at end of file
+//-->
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html
index 006321675b6..b6a61e2355c 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html
@@ -16,15 +16,11 @@ setup({
});
async_test(function() {
var worker = new Worker('#');
- var timeout = setTimeout(this.step_func(function() {
- assert_unreached();
- }, 500));
window.onerror = this.step_func(function(a, b, c, d) {
- assert_true(typeof a, 'string', 'first argument');
+ assert_equals(typeof a, 'string', 'first argument');
assert_equals(b, document.URL+'#', 'second argument');
assert_equals(typeof c, 'number', 'third argument');
assert_equals(typeof d, 'number', 'fourth argument');
- clearTimeout(timeout);
this.done();
return true; // "handled"
});