Auto merge of #21858 - servo-wpt-sync:wpt_update_02-10-2018, r=jdm
Sync WPT with upstream (02-10-2018) Automated downstream sync of changes from upstream as of 02-10-2018. [no-wpt-sync] <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21858) <!-- Reviewable:end -->
|
@ -23,3 +23,15 @@
|
|||
expected:
|
||||
if os == "linux": FAIL
|
||||
|
||||
[2049 EXCLAMATION QUESTION MARK may NOT appear at line start if ja and normal]
|
||||
expected: FAIL
|
||||
|
||||
[203C DOUBLE EXCLAMATION MARK may NOT appear at line start if ja and normal]
|
||||
expected: FAIL
|
||||
|
||||
[2047 DOUBLE QUESTION MARK may NOT appear at line start if ja and normal]
|
||||
expected: FAIL
|
||||
|
||||
[2048 QUESTION EXCLAMATION MARK may NOT appear at line start if ja and normal]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -23,3 +23,15 @@
|
|||
expected:
|
||||
if os == "linux": FAIL
|
||||
|
||||
[203C DOUBLE EXCLAMATION MARK may NOT appear at line start if zh and normal]
|
||||
expected: FAIL
|
||||
|
||||
[2049 EXCLAMATION QUESTION MARK may NOT appear at line start if zh and normal]
|
||||
expected: FAIL
|
||||
|
||||
[2048 QUESTION EXCLAMATION MARK may NOT appear at line start if zh and normal]
|
||||
expected: FAIL
|
||||
|
||||
[2047 DOUBLE QUESTION MARK may NOT appear at line start if zh and normal]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[white-space-empty-text-sibling.html]
|
||||
expected: FAIL
|
|
@ -5,9 +5,6 @@
|
|||
[z-index intermediate]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent intermediate]
|
||||
expected: FAIL
|
||||
|
||||
[border-color end]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -47,9 +44,6 @@
|
|||
[outline-width end]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight end]
|
||||
expected: FAIL
|
||||
|
||||
[min-width intermediate]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -77,3 +71,9 @@
|
|||
[bottom intermediate]
|
||||
expected: FAIL
|
||||
|
||||
[right end]
|
||||
expected: FAIL
|
||||
|
||||
[padding-left intermediate]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[fetch-in-iframe.html]
|
||||
expected: CRASH
|
||||
[Untitled]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_2.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
[location-protocol-setter-non-broken-weird.html]
|
||||
[Set location.protocol to data]
|
||||
expected: FAIL
|
||||
|
||||
[Set location.protocol to ftp]
|
||||
expected: FAIL
|
||||
|
||||
[Set location.protocol to gopher]
|
||||
expected: FAIL
|
||||
|
||||
[Set location.protocol to x]
|
||||
expected: FAIL
|
||||
|
||||
[Set location.protocol to http+x]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[form-margin-quirk.html]
|
||||
[form margin quirk]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[image-decode-with-quick-attach-svg.tentative.html]
|
||||
[SVGImageElement.prototype.decode(), attach to DOM before promise resolves.]
|
||||
expected: FAIL
|
||||
|
|
@ -11,5 +11,5 @@
|
|||
expected: TIMEOUT
|
||||
|
||||
[picture: source (max-width:500px) valid image, img valid image, resize to narrow]
|
||||
expected: FAIL
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
[non-active-document.html]
|
||||
[DOMParser]
|
||||
expected: FAIL
|
||||
|
||||
[createHTMLDocument]
|
||||
expected: FAIL
|
||||
|
||||
[<template>]
|
||||
expected: FAIL
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
[toggleEvent.html]
|
||||
[Calling open twice on 'details' fires only one toggle event]
|
||||
expected: FAIL
|
||||
|
||||
[Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[DOMContentLoaded-defer.html]
|
||||
[The end: DOMContentLoaded and defer scripts]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[aborted-parser.window.html]
|
||||
[document.open() after parser is aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -9,9 +9,6 @@
|
|||
[document.open should throw a SecurityError with cross-origin document even when the ignore-opens-during-unload counter is greater than 0 (during beforeunload event)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[document.open should throw a SecurityError with cross-origin document even when there is an active parser executing script]
|
||||
expected: FAIL
|
||||
|
||||
[document.open should throw a SecurityError with cross-origin document even when the ignore-opens-during-unload counter is greater than 0 (during pagehide event)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
283
tests/wpt/metadata/quirks/unitless-length/quirks.html.ini
Normal file
|
@ -0,0 +1,283 @@
|
|||
[quirks.html]
|
||||
[top: -\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -1A]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -1a]
|
||||
expected: FAIL
|
||||
|
||||
[top: @1]
|
||||
expected: FAIL
|
||||
|
||||
[top: "1a"]
|
||||
expected: FAIL
|
||||
|
||||
[top: @a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: "1"]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -/**/1]
|
||||
expected: FAIL
|
||||
|
||||
[top: +/**/1]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: @1a]
|
||||
expected: FAIL
|
||||
|
||||
[top: 1\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[top: url('1')]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[top: calc(1)]
|
||||
expected: FAIL
|
||||
|
||||
[top: \\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +1\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: 1\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: #0001]
|
||||
expected: FAIL
|
||||
|
||||
[top: calc(2 * 2px)]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: 1a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: A]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: #01]
|
||||
expected: FAIL
|
||||
|
||||
[top: +\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: #1]
|
||||
expected: FAIL
|
||||
|
||||
[top: -/**/1]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: \\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: calc(1)]
|
||||
expected: FAIL
|
||||
|
||||
[top: #001]
|
||||
expected: FAIL
|
||||
|
||||
[top: +\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[top: +1.5]
|
||||
expected: FAIL
|
||||
|
||||
[top: +1\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: @a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: @1]
|
||||
expected: FAIL
|
||||
|
||||
[top: #1]
|
||||
expected: FAIL
|
||||
|
||||
[top: 1a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +1a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +1A]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: "a"]
|
||||
expected: FAIL
|
||||
|
||||
[top: #00001]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -1\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[top: "1"]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: 1.5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: url('1')]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -1.5]
|
||||
expected: FAIL
|
||||
|
||||
[top: \\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: "1a"]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: calc(2 * 2px)]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +1\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: 1\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +/**/1]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: #00001]
|
||||
expected: FAIL
|
||||
|
||||
[top: url(1)]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: #001]
|
||||
expected: FAIL
|
||||
|
||||
[top: +1\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[top: -1a]
|
||||
expected: FAIL
|
||||
|
||||
[top: -1A]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: url(1)]
|
||||
expected: FAIL
|
||||
|
||||
[top: a]
|
||||
expected: FAIL
|
||||
|
||||
[top: A]
|
||||
expected: FAIL
|
||||
|
||||
[top: #000001]
|
||||
expected: FAIL
|
||||
|
||||
[top: 1]
|
||||
expected: FAIL
|
||||
|
||||
[top: 1\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: 1]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +1]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: #000001]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +A]
|
||||
expected: FAIL
|
||||
|
||||
[top: 1.5]
|
||||
expected: FAIL
|
||||
|
||||
[top: +A]
|
||||
expected: FAIL
|
||||
|
||||
[top: +a]
|
||||
expected: FAIL
|
||||
|
||||
[top: +1]
|
||||
expected: FAIL
|
||||
|
||||
[top: -1.5]
|
||||
expected: FAIL
|
||||
|
||||
[top: -1\\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[top: +1a]
|
||||
expected: FAIL
|
||||
|
||||
[top: +1A]
|
||||
expected: FAIL
|
||||
|
||||
[top: @1a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: \\31 .5]
|
||||
expected: FAIL
|
||||
|
||||
[top: "a"]
|
||||
expected: FAIL
|
||||
|
||||
[top: #01]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: +1.5]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -A]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -a]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -1\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[top: #0001]
|
||||
expected: FAIL
|
||||
|
||||
[bottom: -1]
|
||||
expected: FAIL
|
||||
|
||||
[top: -\\31 ]
|
||||
expected: FAIL
|
||||
|
||||
[top: -A]
|
||||
expected: FAIL
|
||||
|
||||
[top: -a]
|
||||
expected: FAIL
|
||||
|
||||
[top: -1]
|
||||
expected: FAIL
|
||||
|
||||
[top: -1\\31 ]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[multiple-headers-and-values.html]
|
||||
expected: ERROR
|
||||
[Image uses the last recognized Referrer-Policy header value]
|
||||
expected: NOTRUN
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[multiple-headers-combined.html]
|
||||
expected: ERROR
|
||||
[Image uses the last recognized Referrer-Policy header value]
|
||||
expected: NOTRUN
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[multiple-headers-one-invalid.html]
|
||||
expected: ERROR
|
||||
[Referrer policy header parsing fails if one header is invalid]
|
||||
expected: NOTRUN
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[multiple-headers-one-unknown-token.html]
|
||||
expected: ERROR
|
||||
[Image uses last recognized referrer policy token from Referrer-Policy headers]
|
||||
expected: NOTRUN
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[multiple-headers.html]
|
||||
expected: ERROR
|
||||
[Image uses the last recognized Referrer-Policy header]
|
||||
expected: NOTRUN
|
||||
|
|
@ -2,9 +2,6 @@
|
|||
[request.formData() with input: &&&a=b&&&&c=d&]
|
||||
expected: FAIL
|
||||
|
||||
[request.formData() with input: a=b&c=d]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: a&b&c]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -14,6 +11,18 @@
|
|||
[response.formData() with input: a=b&c=d&]
|
||||
expected: FAIL
|
||||
|
||||
[request.formData() with input: _charset_=windows-1252&test=%C2x]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: _charset_=windows-1252&test=%C2x]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: &&&a=b&&&&c=d&]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: a=b&c=d]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[urlencoded-parser.any.worker.html]
|
||||
[request.formData() with input: a&b&c]
|
||||
|
@ -22,12 +31,12 @@
|
|||
[response.formData() with input: a&b&c]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: a=b&c=d&]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: &&&a=b&&&&c=d&]
|
||||
expected: FAIL
|
||||
|
||||
[request.formData() with input: a=b&c=d&]
|
||||
expected: FAIL
|
||||
|
||||
[request.formData() with input: _charset_=windows-1252&test=%C2x]
|
||||
expected: FAIL
|
||||
|
||||
[response.formData() with input: _charset_=windows-1252&test=%C2x]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[sharedworker-in-worker.html]
|
||||
expected: ERROR
|
||||
[Base URL in workers: new SharedWorker()]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
version: 1
|
||||
policy:
|
||||
pullRequests: collaborators
|
||||
pullRequests: public
|
||||
tasks:
|
||||
$flattenDeep:
|
||||
- $if: tasks_for == "github-push"
|
||||
|
|
|
@ -20,7 +20,8 @@ install:
|
|||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- os: linux
|
||||
- name: "tag master + upload manifest"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env:
|
||||
- JOB=manifest_upload SCRIPT=tools/ci/ci_manifest.sh
|
||||
|
@ -31,16 +32,20 @@ matrix:
|
|||
secure: "EljDx50oNpDLs7rzwIv+z1PxIgB5KMnx1W0OQkpNvltR0rBW9g/aQaE+Z/c8M/sPqN1bkvKPybKzGKjb6j9Dw3/EJhah4SskH78r3yMAe2DU/ngxqqjjfXcCc2t5MKxzHAILTAxqScPj2z+lG1jeK1Z+K5hTbSP9lk+AvS0D16w="
|
||||
file: $WPT_MANIFEST_FILE.gz
|
||||
skip_cleanup: true
|
||||
- os: linux
|
||||
- name: "lint"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=lint SCRIPT=tools/ci/ci_lint.sh
|
||||
- os: linux
|
||||
- name: "update-built-tests.sh"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=update_built SCRIPT=tools/ci/ci_built_diff.sh
|
||||
- os: linux
|
||||
- name: "build-css-testsuites.sh"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=build_css SCRIPT=css/build-css-testsuites.sh
|
||||
- os: linux
|
||||
- name: "stability (Firefox Nightly)"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
addons:
|
||||
apt:
|
||||
|
@ -48,7 +53,8 @@ matrix:
|
|||
- libnss3-tools
|
||||
env:
|
||||
- JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=firefox:nightly
|
||||
- os: linux
|
||||
- name: "stability (Chrome Dev)"
|
||||
os: linux
|
||||
sudo: required
|
||||
python: "2.7"
|
||||
addons:
|
||||
|
@ -58,19 +64,28 @@ matrix:
|
|||
- fonts-liberation
|
||||
env:
|
||||
- JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=chrome:dev
|
||||
- python: 2.7
|
||||
- name: "tools/ unittests (Python 2)"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=tools_unittest TOXENV=py27 HYPOTHESIS_PROFILE=ci SCRIPT=tools/ci/ci_tools_unittest.sh
|
||||
- python: 3.6
|
||||
- name: "tools/ unittests (Python 3)"
|
||||
os: linux
|
||||
python: "3.6"
|
||||
env: JOB=tools_unittest TOXENV=py36 HYPOTHESIS_PROFILE=ci SCRIPT=tools/ci/ci_tools_unittest.sh
|
||||
- python: 2.7
|
||||
env: JOB=resources_unittest TOXENV=py27 SCRIPT=tools/ci/ci_resources_unittest.sh
|
||||
- python: 2.7
|
||||
- name: "tools/wpt/ unittests"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libnss3-tools
|
||||
env: JOB=wpt_integration TOXENV=py27,py27-flake8 SCRIPT=tools/ci/ci_wpt.sh
|
||||
- os: linux
|
||||
- name: "resources/ tests"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=resources_unittest TOXENV=py27 SCRIPT=tools/ci/ci_resources_unittest.sh
|
||||
- name: "infrastructure/ tests"
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=wptrunner_infrastructure SCRIPT=tools/ci/ci_wptrunner_infrastructure.sh
|
||||
addons:
|
||||
|
|
|
@ -1,46 +1,31 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/canvas-tests.js"></script>
|
||||
<div id="log"></div>
|
||||
<canvas id="dest" height="100" width="100"></canvas>
|
||||
|
||||
<script>
|
||||
var sourceWidth = 100;
|
||||
var sourceHeight = 100;
|
||||
var smoothingEnabled = false;
|
||||
var destCanvas = document.getElementById('dest');
|
||||
var sourceImg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
|
||||
sourceImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '../2x2.png');
|
||||
sourceImg.width = sourceWidth;
|
||||
sourceImg.height = sourceHeight;
|
||||
var destCtx = destCanvas.getContext('2d');
|
||||
async_test(t => {
|
||||
var sourceImg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
|
||||
sourceImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '../2x2.png');
|
||||
sourceImg.width = 100;
|
||||
sourceImg.height = 100;
|
||||
|
||||
function checkPixel(x, y, expected, epsilon) {
|
||||
var actual = destCtx.getImageData(x, y, 1, 1).data;
|
||||
assert_true(actual.length === expected.length);
|
||||
for (var i=0; i < actual.length; i++)
|
||||
assert_approx_equals(actual[i], expected[i], epsilon);
|
||||
}
|
||||
|
||||
var pixelTests = [
|
||||
['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
|
||||
['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1],
|
||||
['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1],
|
||||
['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
|
||||
];
|
||||
|
||||
function runTest() {
|
||||
window.onload = t.step_func_done(() => {
|
||||
var destCanvas = document.getElementById('dest');
|
||||
var destCtx = destCanvas.getContext('2d');
|
||||
destCtx.fillStyle = "#FF0000";
|
||||
destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
|
||||
destCtx.imageSmoothingEnabled = smoothingEnabled;
|
||||
destCtx.imageSmoothingEnabled = false;
|
||||
// 2 arguments, the dest origin is 0,0
|
||||
// The source canvas will copied to the 0,0 position of the destination canvas
|
||||
destCtx.drawImage(sourceImg, 0, 0);
|
||||
generate_tests(checkPixel, pixelTests);
|
||||
}
|
||||
|
||||
async_test(t => {
|
||||
window.onload = function() {
|
||||
t.step(runTest);
|
||||
t.done();
|
||||
}
|
||||
}, 'Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.');
|
||||
</script>
|
||||
_assertPixel(destCanvas, 0, 0, 253, 140, 245, 255);
|
||||
_assertPixel(destCanvas, 0, 99, 253, 140, 245, 255);
|
||||
_assertPixel(destCanvas, 99, 0, 253, 140, 245, 255);
|
||||
_assertPixel(destCanvas, 99, 99, 253, 140, 245, 255);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: mask with negative scale target</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-masks"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#MaskElement"/>
|
||||
<html:link rel="match" href="reference/mask-negative-scale-001-ref.svg"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
<desc class="assert">The masked target elements get scaled with negative
|
||||
factors. Check if that influences masking. You should see 4 green
|
||||
rectangles with smaller blue rectangles in it in various rotations.</desc>
|
||||
</g>
|
||||
<defs>
|
||||
<g id="img" transform="translate(10,10)">
|
||||
<rect width="200" height="200" fill="red"/>
|
||||
<rect width="100" height="100" fill="green"/>
|
||||
<rect width="50" height="50" fill="blue"/>
|
||||
</g>
|
||||
</defs>
|
||||
|
||||
<mask id="mask">
|
||||
<rect x="10" y="10" width="90" height="90" fill="white"/>
|
||||
</mask>
|
||||
|
||||
<g transform="translate(200, 200)">
|
||||
<g transform="matrix(1 0 0 1 -100 -100)" mask="url(#mask)">
|
||||
<use xlink:href="#img"/>
|
||||
</g>
|
||||
<g transform="matrix(-1 0 0 -1 -100 -100)" mask="url(#mask)">
|
||||
<use xlink:href="#img"/>
|
||||
</g>
|
||||
<g transform="matrix(-1 0 0 1 -100 -100)" mask="url(#mask)">
|
||||
<use xlink:href="#img"/>
|
||||
</g>
|
||||
<g transform="matrix(1 0 0 -1 -100 -100)" mask="url(#mask)">
|
||||
<use xlink:href="#img"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -0,0 +1,18 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="100px" height="100px">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: mask with transformed text content</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-masks"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#MaskElement"/>
|
||||
<html:link rel="match" href="reference/mask-text-001-ref.svg"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
<desc class="assert">The masked target elements get scaled with negative
|
||||
factors. Check if that influences masking. You should see 4 green
|
||||
rectangles with smaller blue rectangles in it in various rotations.</desc>
|
||||
</g>
|
||||
<mask id="mask">
|
||||
<text fill="#fff" font-family="Ahem" font-size="12px" transform="rotate(90 50 50)" x="50%" y="50%">foobar</text>
|
||||
</mask>
|
||||
<rect width="100%" height="100%" x="0" y="0" mask="url(#mask)"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1,015 B |
|
@ -0,0 +1,19 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: mask without mask-type alpha</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-masks"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#MaskElement"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#the-mask-type"/>
|
||||
<html:link rel="match" href="reference/mask-green-square-001-ref.svg"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
<desc class="assert">The mask type "alpha" is applied to the mask element.
|
||||
The mask should take the alpha channel of the content to mask. You should
|
||||
see a green square.</desc>
|
||||
</g>
|
||||
<mask id="mask" mask-type="alpha">
|
||||
<rect width="200" height="200" fill="black" opacity="0"/>
|
||||
<rect x="50" y="50" width="100" height="100" fill="black"/>
|
||||
</mask>
|
||||
<rect width="200" height="200" fill="green" mask="url(#mask)"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1,011 B |
|
@ -0,0 +1,19 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: mask without mask-type luminance</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-masks"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#MaskElement"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#the-mask-type"/>
|
||||
<html:link rel="match" href="reference/mask-green-square-001-ref.svg"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
<desc class="assert">The mask type "alpha" is applied to the mask element.
|
||||
The mask should take the luminocity of the content to mask. You should
|
||||
see a green square.</desc>
|
||||
</g>
|
||||
<mask id="mask" mask-type="luminance">
|
||||
<rect width="200" height="200" fill="black"/>
|
||||
<rect x="50" y="50" width="100" height="100" fill="white"/>
|
||||
</mask>
|
||||
<rect width="200" height="200" fill="green" mask="url(#mask)"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1,004 B |
|
@ -0,0 +1,19 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: mask without specified mask-type</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-masks"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#MaskElement"/>
|
||||
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#the-mask-type"/>
|
||||
<html:link rel="match" href="reference/mask-green-square-001-ref.svg"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
<desc class="assert">No mask type was specified the mask element should
|
||||
take the luminocity of the content to mask. You should see a green square.
|
||||
</desc>
|
||||
</g>
|
||||
<mask id="mask">
|
||||
<rect width="200" height="200" fill="black"/>
|
||||
<rect x="50" y="50" width="100" height="100" fill="white"/>
|
||||
</mask>
|
||||
<rect width="200" height="200" fill="green" mask="url(#mask)"/>
|
||||
</svg>
|
After Width: | Height: | Size: 964 B |
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: Reftest reference</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
</g>
|
||||
<rect x="50" y="50" width="100" height="100" fill="green"/>
|
||||
</svg>
|
After Width: | Height: | Size: 341 B |
|
@ -0,0 +1,15 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: Reftest reference</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
</g>
|
||||
<rect width="90" height="90" fill="green"/>
|
||||
<rect x="40" y="40" width="50" height="50" fill="blue"/>
|
||||
<rect x="110" width="90" height="90" fill="green"/>
|
||||
<rect x="110" y="40" width="50" height="50" fill="blue"/>
|
||||
<rect y="110" width="90" height="90" fill="green"/>
|
||||
<rect x="40" y="110" width="50" height="50" fill="blue"/>
|
||||
<rect x="110" y="110" width="90" height="90" fill="green"/>
|
||||
<rect x="110" y="110" width="50" height="50" fill="blue"/>
|
||||
</svg>
|
After Width: | Height: | Size: 721 B |
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<g id="testmeta">
|
||||
<title>CSS Masking: Reftest reference</title>
|
||||
<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
|
||||
<metadata class="flags">svg</metadata>
|
||||
</g>
|
||||
<text fill="#000" font-family="Ahem" font-size="12px" transform="rotate(90 50 50)" x="50" y="50">foobar</text>
|
||||
</svg>
|
After Width: | Height: | Size: 391 B |
|
@ -0,0 +1,39 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Inheritance of CSS Scroll Snap properties</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#property-index">
|
||||
<meta name="assert" content="Properties inherit or not according to the spec.">
|
||||
<meta name="assert" content="Properties have initial values according to the spec.">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/css/support/inheritance-testcommon.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="target"></div>
|
||||
</div>
|
||||
<script>
|
||||
assert_not_inherited('scroll-margin-block-end', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-block-start', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-bottom', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-inline-end', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-inline-start', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-left', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-right', '0px', '10px');
|
||||
assert_not_inherited('scroll-margin-top', '0px', '10px');
|
||||
assert_not_inherited('scroll-padding-block-end', 'auto', '10px');
|
||||
assert_not_inherited('scroll-padding-block-start', 'auto', '10px');
|
||||
assert_not_inherited('scroll-padding-bottom', '0px', '10px');
|
||||
assert_not_inherited('scroll-padding-inline-end', 'auto', '10px');
|
||||
assert_not_inherited('scroll-padding-inline-start', 'auto', '10px');
|
||||
assert_not_inherited('scroll-padding-left', '0px', '10px');
|
||||
assert_not_inherited('scroll-padding-right', '0px', '10px');
|
||||
assert_not_inherited('scroll-padding-top', '0px', '10px');
|
||||
assert_not_inherited('scroll-snap-align', 'none', 'start end');
|
||||
assert_not_inherited('scroll-snap-stop', 'normal', 'always');
|
||||
assert_not_inherited('scroll-snap-type', 'none', 'inline proximity');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
|
||||
<link rel="match" href="../../../reference/ref-filled-green-100px-square-only.html">
|
||||
<meta name="assert" content="This checks that a float 'shadowing' a shape-outside float works as expected.">
|
||||
<style>
|
||||
#container { width: 100px; line-height: 0; }
|
||||
#float_1 { float: right; width: 30px; height: 30px; background: green; }
|
||||
#float_2 { float: left; width: 20px; height: 100px; background: green; shape-outside: inset(0 20px 0 0); }
|
||||
#float_3 { float: left; width: 30px; height: 50px; background: green; }
|
||||
.atomic { display: inline-block; background: green; }
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square.</p>
|
||||
<div id="container">
|
||||
<div id="float_1"></div>
|
||||
<div id="float_2"></div>
|
||||
<div id="float_3"></div>
|
||||
<div class="atomic" style="width: 20px; height: 30px;"></div>
|
||||
<div class="atomic" style="width: 50px; height: 20px;"></div>
|
||||
<div class="atomic" style="width: 80px; height: 50px;"></div><div class="atomic" style="width: 20px; height: 50px;"></div>
|
||||
</div>
|
|
@ -0,0 +1,3 @@
|
|||
<!DOCTYPE html>
|
||||
<p>There should be a space between "Two" and "words".</p>
|
||||
Two words
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules">
|
||||
<link rel="match" href="reference/white-space-empty-text-sibling-ref.html">
|
||||
<p>There should be a space between "Two" and "words".</p>
|
||||
<div id="block"> <span>words</span></div>
|
||||
<script>
|
||||
block.insertBefore(document.createTextNode(""), block.firstChild);
|
||||
block.insertBefore(document.createTextNode(""), block.firstChild);
|
||||
block.offsetTop;
|
||||
block.firstChild.data = "Two";
|
||||
</script>
|
|
@ -36,6 +36,10 @@ test(function() {
|
|||
target.style.offsetPath = ' path( "m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50" ) ';
|
||||
assert_equals(target.style.offsetPath, 'path("m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50")');
|
||||
assert_equals(getComputedStyle(target).offsetPath, 'path("M 10 20 A 10 20 30 1 0 50 70 A 110 120 30 1 1 190 120")');
|
||||
|
||||
target.style.offsetPath = 'path("M 1 2 H 3 v 4 h 5 V 6 h 7 v 8")';
|
||||
assert_equals(target.style.offsetPath, 'path("M 1 2 H 3 v 4 h 5 V 6 h 7 v 8")');
|
||||
assert_equals(getComputedStyle(target).offsetPath, 'path("M 1 2 H 3 V 6 H 8 V 6 H 15 V 14")');
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Drop cap with U+05D0 in the document</title>
|
||||
<meta name="assert" content="The text placement within :first-line should not be affected by later presence of a right-to-left character.">
|
||||
<link rel=help href=https://drafts.csswg.org/css-pseudo-4/#first-line-styling>
|
||||
<link rel=match href=/css/selectors/floating-first-letter-ref.html>
|
||||
<style>
|
||||
p:first-line {
|
||||
background: lightblue;
|
||||
}
|
||||
|
||||
p::first-letter {
|
||||
float: left;
|
||||
font-size: 4rem;
|
||||
}
|
||||
div {
|
||||
color: transparent;
|
||||
}
|
||||
</style>
|
||||
<p>Ab</p><div>א</div>
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Drop cap with U+FEFF in the document</title>
|
||||
<meta name="assert" content="The text placement within :first-line should not be affected by later presence of U+FEFF.">
|
||||
<link rel=help href=https://drafts.csswg.org/css-pseudo-4/#first-line-styling>
|
||||
<link rel=match href=/css/selectors/floating-first-letter-ref.html>
|
||||
<style>
|
||||
p:first-line {
|
||||
background: lightblue;
|
||||
}
|
||||
|
||||
p::first-letter {
|
||||
float: left;
|
||||
font-size: 4rem;
|
||||
}
|
||||
</style>
|
||||
<p>Ab</p>
|
|
@ -0,0 +1,14 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Drop cap with no bidi in the document</title>
|
||||
<style>
|
||||
p:first-line {
|
||||
background: lightblue;
|
||||
}
|
||||
|
||||
p::first-letter {
|
||||
float: left;
|
||||
font-size: 4rem;
|
||||
}
|
||||
</style>
|
||||
<p>Ab</p>
|
76
tests/wpt/web-platform-tests/docs/_admin/index.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
---
|
||||
layout: page
|
||||
title: Project Administration
|
||||
order: -1
|
||||
---
|
||||
|
||||
This section documents all the information necessary to administer the
|
||||
infrastructure which makes the project possible.
|
||||
|
||||
## Secrets
|
||||
|
||||
Some aspects of the infrastructure are only accessible to administrators.
|
||||
|
||||
Project | Secret | Owners
|
||||
--------------------------|--------------------------|-------------
|
||||
[results-collection] | root SSH keys | boaz@bocoup.com, mike@bocoup.com, rick@bocoup.com
|
||||
[results-collection] | Password for app secrets | boaz@bocoup.com, mike@bocoup.com, rick@bocoup.com
|
||||
|
||||
SSL certificates for all HTTPS-enabled domains are retrieved via [Let's
|
||||
Encrypt](https://letsencrypt.org/), so that data does not represent an
|
||||
explicitly-managed secret.
|
||||
|
||||
## Third-party account owners
|
||||
|
||||
- (unknown registrar): https://web-platform-tests.org
|
||||
- jgraham@hoppipolla.co.uk
|
||||
- (unknown registrar): https://w3c-test.org
|
||||
- mike@w3.org
|
||||
- (unknown registrar): http://testthewebforward.org
|
||||
- web-human@w3.org
|
||||
- [Google Domains](https://domains.google/): https://wpt.fyi
|
||||
- foolip@google.com
|
||||
- jeffcarp@google.com
|
||||
- lukebjerring@google.com
|
||||
- mike@bocoup.com
|
||||
- [GitHub](https://github.com/): web-platform-tests
|
||||
- [@foolip](https://github.com/foolip)
|
||||
- [@Hexcles](https://github.com/Hexcles)
|
||||
- [@jgraham](https://github.com/jgraham)
|
||||
- [@plehegar](https://github.com/plehegar)
|
||||
- [@thejohnjansen](https://github.com/thejohnjansen)
|
||||
- [@youennf](https://github.com/youennf)
|
||||
- [@zcorpan](https://github.com/zcorpan)
|
||||
- [GitHub](https://github.com/): w3c
|
||||
- [@plehegar](https://github.com/plehegar)
|
||||
- [@sideshowbarker](https://github.com/sideshowbarker)
|
||||
- [Google Cloud Platform](https://cloud.google.com/): wptdashboard
|
||||
- boaz@bocoup.com
|
||||
- foolip@google.com
|
||||
- geoffers@gmail.com
|
||||
- jeffcarp@google.com
|
||||
- kereliuk@google.com
|
||||
- lukebjerring@google.com
|
||||
- markdittmer@google.com
|
||||
- mike@bocoup.com
|
||||
- rick@bocoup.com
|
||||
- [Amazon AWS](https://aws.amazon.com/): results-collection infrastructure
|
||||
- boaz@bocoup.com
|
||||
- mike@bocoup.com
|
||||
- rick@bocoup.com
|
||||
- E-mail address: wpt.pr.bot@gmail.com
|
||||
- boaz@bocoup.com
|
||||
- mike@bocoup.com
|
||||
- simon@bocoup.com
|
||||
- [Heroku](https://heroku.com/): wpt.pr.bot@gmail.com
|
||||
- boaz@bocoup.com
|
||||
- mike@bocoup.com
|
||||
- simon@bocoup.com
|
||||
- [GitHub](https://github.com/): @wpt-pr-bot account
|
||||
- boaz@bocoup.com
|
||||
- mike@bocoup.com
|
||||
- simon@bocoup.com
|
||||
|
||||
[results-collection]: https://github.com/web-platform-tests/results-collection
|
||||
[web-platform-tests]: https://github.com/e3c/web-platform-tests
|
||||
[wpt.fyi]: https://github.com/web-platform-tests/wpt.fyi
|
|
@ -18,6 +18,8 @@ baseurl: "" # the subpath of your site, e.g. /blog
|
|||
url: "" # the base hostname & protocol for your site, e.g. http://example.com
|
||||
|
||||
collections:
|
||||
admin:
|
||||
output: true
|
||||
appendix:
|
||||
output: true
|
||||
reviewing-tests:
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="256" height="256" class="octicon octicon-key" viewBox="0 0 14 16" version="1.1" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M12.83 2.17C12.08 1.42 11.14 1.03 10 1c-1.13.03-2.08.42-2.83 1.17S6.04 3.86 6.01 5c0 .3.03.59.09.89L0 12v1l1 1h2l1-1v-1h1v-1h1v-1h2l1.09-1.11c.3.08.59.11.91.11 1.14-.03 2.08-.42 2.83-1.17S13.97 6.14 14 5c-.03-1.14-.42-2.08-1.17-2.83zM11 5.38c-.77 0-1.38-.61-1.38-1.38 0-.77.61-1.38 1.38-1.38.77 0 1.38.61 1.38 1.38 0 .77-.61 1.38-1.38 1.38z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 500 B |
|
@ -50,6 +50,17 @@ layout: page
|
|||
</a>
|
||||
<p>Some hints and tips for those reviewing tests.</p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ site.baseurl }}{% link _admin/index.md %}">
|
||||
<div>
|
||||
{% include svg/octicons/key.svg %}
|
||||
</div>
|
||||
<h2>
|
||||
Administration
|
||||
</h2>
|
||||
</a>
|
||||
<p>Instruction for project administrators.</p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ site.baseurl }}{% link _appendix/index.md %}">
|
||||
<div>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// META: script=../resources/utils.js
|
||||
// META: script=/common/utils.js
|
||||
// META: timeout=long
|
||||
|
||||
function redirectCount(desc, redirectUrl, redirectLocation, redirectStatus, maxCount, shouldPass) {
|
||||
var uuid_token = token();
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
<!-- quirks -->
|
||||
<title>form margin quirk</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<style>
|
||||
form { writing-mode: vertical-lr; }
|
||||
#ref { margin: 0 1em 0 0; }
|
||||
</style>
|
||||
<form id=form></form>
|
||||
<div id=ref></div>
|
||||
<script>
|
||||
test(() => {
|
||||
const formStyle = getComputedStyle(document.getElementById('form'));
|
||||
const refStyle = getComputedStyle(document.getElementById('ref'));
|
||||
assert_equals(formStyle.marginTop, refStyle.marginTop, 'marginTop');
|
||||
assert_equals(formStyle.marginRight, refStyle.marginRight, 'marginRight');
|
||||
assert_equals(formStyle.marginBottom, refStyle.marginBottom, 'marginBottom');
|
||||
assert_equals(formStyle.marginLeft, refStyle.marginLeft, 'marginLeft');
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<meta name="timeout" content="long">
|
||||
<title>SVGImageElement.prototype.decode(), attach to DOM before promise resolves.</title>
|
||||
<link rel=help href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<svg></svg>
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
promise_test(function() {
|
||||
var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
|
||||
img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.png");
|
||||
const promise = img.decode().then(function(arg) {
|
||||
assert_equals(arg, undefined);
|
||||
});
|
||||
// Don't wait for the promise to resolve before attaching the image.
|
||||
// The promise should still resolve successfully.
|
||||
document.querySelector('svg').appendChild(img);
|
||||
return promise;
|
||||
}, document.title);
|
||||
</script>
|
|
@ -0,0 +1,75 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>video element - intrinsic sizes</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/media.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<p><a href="https://html.spec.whatwg.org/multipage/#the-video-element">spec reference</a></p>
|
||||
<video id="v1"></video>
|
||||
<video id="v2" width="400"></video>
|
||||
<video id="v3" height="100"></video>
|
||||
<video id="v4"></video>
|
||||
<video id="v5" poster="/media/poster.png"></video>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var s = getComputedStyle(document.getElementById("v1"));
|
||||
assert_equals(s.width, "300px");
|
||||
assert_equals(s.height, "150px");
|
||||
}, "default object size is 300x150");
|
||||
|
||||
test(function() {
|
||||
var s = getComputedStyle(document.getElementById("v2"));
|
||||
assert_equals(s.width, "400px");
|
||||
assert_equals(s.height, "200px");
|
||||
}, "default height is half the width");
|
||||
|
||||
test(function() {
|
||||
var s = getComputedStyle(document.getElementById("v3"));
|
||||
assert_equals(s.width, "200px");
|
||||
assert_equals(s.height, "100px");
|
||||
}, "default width is twice the height");
|
||||
|
||||
async_test(function(t) {
|
||||
var v = document.getElementById("v4");
|
||||
var s = getComputedStyle(v);
|
||||
v.src = getVideoURI("/media/movie_5") + "?" + new Date() + Math.random();
|
||||
v.onerror = t.unreached_func();
|
||||
v.onloadedmetadata = t.step_func(function() {
|
||||
assert_equals(s.width, '320px');
|
||||
assert_equals(s.height, '240px');
|
||||
v.removeAttribute("src");
|
||||
v.load();
|
||||
// Dimensions should be updated only on next layout.
|
||||
assert_equals(s.width, '320px');
|
||||
assert_equals(s.height, '240px');
|
||||
requestAnimationFrame(t.step_func_done(function() {
|
||||
assert_equals(s.width, "300px");
|
||||
assert_equals(s.height, "150px");
|
||||
}));
|
||||
});
|
||||
}, "default object size after src is removed");
|
||||
|
||||
async_test(function(t) {
|
||||
var v = document.getElementById("v5");
|
||||
var s = getComputedStyle(v);
|
||||
v.onerror = t.unreached_func();
|
||||
onload = t.step_func(function() {
|
||||
assert_equals(s.width, '102px');
|
||||
assert_equals(s.height, '77px');
|
||||
v.removeAttribute("poster");
|
||||
// Dimensions should be updated only on next layout.
|
||||
assert_equals(s.width, '102px');
|
||||
assert_equals(s.height, '77px');
|
||||
requestAnimationFrame(t.step_func_done(function() {
|
||||
assert_equals(s.width, "300px");
|
||||
assert_equals(s.height, "150px");
|
||||
}));
|
||||
});
|
||||
}, "default object size after poster is removed");
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,37 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>HTML Test: HTMLLegendElement</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com/">
|
||||
<link rel="help" title="4.10.17 The legend element" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-legend-element">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<div style="display:none">
|
||||
<form>
|
||||
<legend id="lgd1">test</legend>
|
||||
</form>
|
||||
<form id="fm">
|
||||
<fieldset id="fs">
|
||||
<legend id="lgd2">test</legend>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
test(function() {
|
||||
assert_equals(document.getElementById("lgd1").form, null,
|
||||
"The legend.form return null if it has no fieldset parent.");
|
||||
}, "The legend.form return null when it has no fieldset parent");
|
||||
|
||||
test(function() {
|
||||
assert_equals(document.getElementById("lgd2").form, document.getElementById("fs").form,
|
||||
"The legend.form should be same as fieldset.form.");
|
||||
assert_equals(document.getElementById("lgd2").form, document.getElementById("fm"),
|
||||
"The legend.form should be the correct form.");
|
||||
}, "The legend.form must be same value as fieldset.form");
|
||||
|
||||
test(function() {
|
||||
assert_true(document.getElementById("lgd1") instanceof HTMLLegendElement, "legend should be a HTMLLegendElement");
|
||||
assert_readonly(document.getElementById("lgd1"), "form", "The form is not readonly");
|
||||
}, "Interface HTMLLegendElement");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>navigator.cookieEnabled false</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/#dom-navigator-cookieenabled">
|
||||
<meta name="flags" content="interact">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<h2>Preconditions</h2>
|
||||
<p>Disable cookies in browser settings.</p>
|
||||
|
||||
<script>
|
||||
test(() => {
|
||||
assert_false(navigator.cookieEnabled);
|
||||
}, "navigator.cookieEnabled is false when cookies are disabled");
|
||||
</script>
|
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>navigator.cookieEnabled true</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/#dom-navigator-cookieenabled">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
test(() => {
|
||||
assert_true(navigator.cookieEnabled);
|
||||
}, "navigator.cookieEnabled is true when cookies are enabled");
|
||||
</script>
|
|
@ -0,0 +1,18 @@
|
|||
<!doctype html>
|
||||
<title>cookies work in default browse settings</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/#dom-document-cookie">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
test(t => {
|
||||
t.add_cleanup(() => {
|
||||
let date = new Date();
|
||||
date.setTime(date.getTime() - 10000);
|
||||
document.cookie = "name=''; expires=" + date.toGMTString();
|
||||
});
|
||||
document.cookie = "name=test_cookie";
|
||||
assert_not_equals(document.cookie.match(/name=test_cookie/), null);
|
||||
});
|
||||
</script>
|
|
@ -43,12 +43,18 @@ enum SpeechRecognitionErrorCode {
|
|||
"language-not-supported"
|
||||
};
|
||||
|
||||
[Exposed=Window]
|
||||
[Exposed=Window,
|
||||
Constructor(DOMString type, SpeechRecognitionErrorEventInit eventInitDict)]
|
||||
interface SpeechRecognitionErrorEvent : Event {
|
||||
readonly attribute SpeechRecognitionErrorCode error;
|
||||
readonly attribute DOMString message;
|
||||
};
|
||||
|
||||
dictionary SpeechRecognitionErrorEventInit : EventInit {
|
||||
required SpeechRecognitionErrorCode error;
|
||||
DOMString message = "";
|
||||
};
|
||||
|
||||
// Item in N-best list
|
||||
[Exposed=Window]
|
||||
interface SpeechRecognitionAlternative {
|
||||
|
@ -72,7 +78,8 @@ interface SpeechRecognitionResultList {
|
|||
};
|
||||
|
||||
// A full response, which could be interim or final, part of a continuous response or not
|
||||
[Exposed=Window]
|
||||
[Exposed=Window,
|
||||
Constructor(DOMString type, SpeechRecognitionEventInit eventInitDict)]
|
||||
interface SpeechRecognitionEvent : Event {
|
||||
readonly attribute unsigned long resultIndex;
|
||||
readonly attribute SpeechRecognitionResultList results;
|
||||
|
@ -80,6 +87,13 @@ interface SpeechRecognitionEvent : Event {
|
|||
readonly attribute Document? emma;
|
||||
};
|
||||
|
||||
dictionary SpeechRecognitionEventInit : EventInit {
|
||||
unsigned long resultIndex = 0;
|
||||
required SpeechRecognitionResultList results;
|
||||
any interpretation = null;
|
||||
Document? emma = null;
|
||||
};
|
||||
|
||||
// The object representing a speech grammar
|
||||
[Exposed=Window, Constructor]
|
||||
interface SpeechGrammar {
|
||||
|
@ -118,8 +132,7 @@ partial interface Window {
|
|||
};
|
||||
|
||||
[Exposed=Window,
|
||||
Constructor,
|
||||
Constructor(DOMString text)]
|
||||
Constructor(optional DOMString text)]
|
||||
interface SpeechSynthesisUtterance : EventTarget {
|
||||
attribute DOMString text;
|
||||
attribute DOMString lang;
|
||||
|
@ -138,7 +151,7 @@ interface SpeechSynthesisUtterance : EventTarget {
|
|||
};
|
||||
|
||||
[Exposed=Window,
|
||||
Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)]
|
||||
Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)]
|
||||
interface SpeechSynthesisEvent : Event {
|
||||
readonly attribute SpeechSynthesisUtterance utterance;
|
||||
readonly attribute unsigned long charIndex;
|
||||
|
@ -169,7 +182,7 @@ enum SpeechSynthesisErrorCode {
|
|||
};
|
||||
|
||||
[Exposed=Window,
|
||||
Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)]
|
||||
Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)]
|
||||
interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent {
|
||||
readonly attribute SpeechSynthesisErrorCode error;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>User agents must also provide an event handler IDL attribute named ondeviceorientationabsolute on the window object</title>
|
||||
<meta name=viewport content="width=device-width, maximum-scale=1.0">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<p>Rotate the device to run the tests.</p>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
var t1 = async_test("Provide an event handler IDL attribute named ondeviceorientationabsolute");
|
||||
var t2 = async_test("The type of this event handler must be 'DeviceOrientationEvent'");
|
||||
var t3 = async_test("The absolute property must be set to true.");
|
||||
var run = false;
|
||||
if (window.ondeviceorientationabsolute === undefined) {
|
||||
t1.step(t1.unreached_func("ondeviceorientationabsolute not supported"));
|
||||
t2.step(t2.unreached_func("ondeviceorientationabsolute not supported"));
|
||||
t3.step(t3.unreached_func("ondeviceorientationabsolute not supported"));
|
||||
} else {
|
||||
window.ondeviceorientationabsolute = function(e) {
|
||||
if (!run) {
|
||||
run = true;
|
||||
t1.step(function() {
|
||||
assert_equals(e.type, "deviceorientationabsolute");
|
||||
});
|
||||
t1.done();
|
||||
t2.step(function() {
|
||||
assert_true(e instanceof DeviceOrientationEvent);
|
||||
});
|
||||
t2.done();
|
||||
t3.step(function() {
|
||||
assert_true(e.absolute);
|
||||
});
|
||||
t3.done();
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Referrer Policy: multiple Referrer-Policy header and header values are allowed</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="/referrer-policy/generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Referrer Policy: multiple Referrer-Policy header and header values are allowed</h1>
|
||||
<p></p>
|
||||
|
||||
<pre id="received_message">Running...</pre>
|
||||
|
||||
<script>
|
||||
var test = async_test("Image uses the last recognized Referrer-Policy header value");
|
||||
var urlPath = '/referrer-policy/generic/subresource/image.py?cache_destroyer=' + (new Date()).getTime();
|
||||
var url = location.protocol + "//www1." + location.hostname + ":" + location.port +
|
||||
urlPath;
|
||||
queryImage(url, test.step_func(function(message) {
|
||||
assert_equals(message.referrer, document.location.origin + "/");
|
||||
test.done();
|
||||
}), null, 'no-referrer', test);
|
||||
</script>
|
||||
|
||||
<div id="log"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,2 @@
|
|||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: no-referrer,origin
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Referrer Policy: multiple Referrer-Policy header values are allowed</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="/referrer-policy/generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Referrer Policy: multiple Referrer-Policy header values are allowed</h1>
|
||||
<p></p>
|
||||
|
||||
<pre id="received_message">Running...</pre>
|
||||
|
||||
<script>
|
||||
var test = async_test("Image uses the last recognized Referrer-Policy header value");
|
||||
var urlPath = '/referrer-policy/generic/subresource/image.py?cache_destroyer=' + (new Date()).getTime();
|
||||
var url = location.protocol + "//www1." + location.hostname + ":" + location.port +
|
||||
urlPath;
|
||||
queryImage(url, test.step_func(function(message) {
|
||||
assert_equals(message.referrer, document.location.origin + "/");
|
||||
test.done();
|
||||
}), null, 'no-referrer', test);
|
||||
</script>
|
||||
|
||||
<div id="log"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1 @@
|
|||
Referrer-Policy: no-referrer, origin
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Referrer Policy: multiple Referrer-Policy headers with one invalid</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="/referrer-policy/generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Referrer Policy: multiple Referrer-Policy headers with one invalid</h1>
|
||||
<p></p>
|
||||
|
||||
<pre id="received_message">Running...</pre>
|
||||
|
||||
<script>
|
||||
var test = async_test("Referrer policy header parsing fails if one header is invalid");
|
||||
var urlPath = '/referrer-policy/generic/subresource/image.py?cache_destroyer=' + (new Date()).getTime();
|
||||
var url = location.protocol + "//www1." + location.hostname + ":" + location.port +
|
||||
urlPath;
|
||||
queryImage(url, test.step_func(function(message) {
|
||||
assert_equals(message.referrer, document.location.href);
|
||||
test.done();
|
||||
}), null, 'no-referrer', test);
|
||||
</script>
|
||||
|
||||
<div id="log"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,2 @@
|
|||
Referrer-Policy: origin
|
||||
Referrer-Policy: origin no-referrer
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Referrer Policy: multiple Referrer-Policy headers with one invalid</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="/referrer-policy/generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Referrer Policy: multiple Referrer-Policy headers with one invalid</h1>
|
||||
<p></p>
|
||||
|
||||
<pre id="received_message">Running...</pre>
|
||||
|
||||
<script>
|
||||
var test = async_test("Image uses last recognized referrer policy token from Referrer-Policy headers");
|
||||
var urlPath = '/referrer-policy/generic/subresource/image.py?cache_destroyer=' + (new Date()).getTime();
|
||||
var url = location.protocol + "//www1." + location.hostname + ":" + location.port +
|
||||
urlPath;
|
||||
queryImage(url, test.step_func(function(message) {
|
||||
assert_equals(message.referrer, document.location.origin + "/");
|
||||
test.done();
|
||||
}), null, 'no-referrer', test);
|
||||
</script>
|
||||
|
||||
<div id="log"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,2 @@
|
|||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: origin,not-a-valid-token
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Referrer Policy: multiple Referrer-Policy headers are allowed</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="/referrer-policy/generic/common.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Referrer Policy: multiple Referrer-Policy headers are allowed</h1>
|
||||
<p></p>
|
||||
|
||||
<pre id="received_message">Running...</pre>
|
||||
|
||||
<script>
|
||||
var test = async_test("Image uses the last recognized Referrer-Policy header");
|
||||
var urlPath = '/referrer-policy/generic/subresource/image.py?cache_destroyer=' + (new Date()).getTime();
|
||||
var url = location.protocol + "//www1." + location.hostname + ":" + location.port +
|
||||
urlPath;
|
||||
queryImage(url, test.step_func(function(message) {
|
||||
assert_equals(message.referrer, document.location.origin + "/");
|
||||
test.done();
|
||||
}), null, 'no-referrer', test);
|
||||
</script>
|
||||
|
||||
<div id="log"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,2 @@
|
|||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: origin
|
|
@ -57,7 +57,6 @@ if (!('subsetTestByKey' in self)) {
|
|||
}
|
||||
/// Helpers ///
|
||||
function constValue (cnt)
|
||||
//@{
|
||||
{
|
||||
if (cnt.type === "null") return null;
|
||||
if (cnt.type === "NaN") return NaN;
|
||||
|
@ -66,9 +65,7 @@ function constValue (cnt)
|
|||
return cnt.value;
|
||||
}
|
||||
|
||||
//@}
|
||||
function minOverloadLength(overloads)
|
||||
//@{
|
||||
{
|
||||
// "The value of the Function object’s “length” property is
|
||||
// a Number determined as follows:
|
||||
|
@ -87,9 +84,7 @@ function minOverloadLength(overloads)
|
|||
.reduce(function(m, n) { return Math.min(m, n); });
|
||||
}
|
||||
|
||||
//@}
|
||||
function throwOrReject(a_test, operation, fn, obj, args, message, cb)
|
||||
//@{
|
||||
{
|
||||
if (operation.idlType.generic !== "Promise") {
|
||||
assert_throws(new TypeError(), function() {
|
||||
|
@ -108,9 +103,7 @@ function throwOrReject(a_test, operation, fn, obj, args, message, cb)
|
|||
}
|
||||
}
|
||||
|
||||
//@}
|
||||
function awaitNCallbacks(n, cb, ctx)
|
||||
//@{
|
||||
{
|
||||
var counter = 0;
|
||||
return function() {
|
||||
|
@ -121,9 +114,7 @@ function awaitNCallbacks(n, cb, ctx)
|
|||
};
|
||||
}
|
||||
|
||||
//@}
|
||||
var fround =
|
||||
//@{
|
||||
(function(){
|
||||
if (Math.fround) return Math.fround;
|
||||
|
||||
|
@ -133,12 +124,10 @@ var fround =
|
|||
return arr[0];
|
||||
};
|
||||
})();
|
||||
//@}
|
||||
|
||||
/// IdlHarnessError ///
|
||||
// Entry point
|
||||
self.IdlHarnessError = function(message)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* Message to be printed as the error's toString invocation.
|
||||
|
@ -148,19 +137,15 @@ self.IdlHarnessError = function(message)
|
|||
|
||||
IdlHarnessError.prototype = Object.create(Error.prototype);
|
||||
|
||||
//@}
|
||||
IdlHarnessError.prototype.toString = function()
|
||||
//@{
|
||||
{
|
||||
return this.message;
|
||||
};
|
||||
|
||||
//@}
|
||||
|
||||
/// IdlArray ///
|
||||
// Entry point
|
||||
self.IdlArray = function()
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* A map from strings to the corresponding named IdlObject, such as
|
||||
|
@ -210,17 +195,13 @@ self.IdlArray = function()
|
|||
this["inheritance"] = {};
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.add_idls = function(raw_idls, options)
|
||||
//@{
|
||||
{
|
||||
/** Entry point. See documentation at beginning of file. */
|
||||
this.internal_add_idls(WebIDL2.parse(raw_idls), options);
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.add_untested_idls = function(raw_idls, options)
|
||||
//@{
|
||||
{
|
||||
/** Entry point. See documentation at beginning of file. */
|
||||
var parsed_idls = WebIDL2.parse(raw_idls);
|
||||
|
@ -228,9 +209,7 @@ IdlArray.prototype.add_untested_idls = function(raw_idls, options)
|
|||
this.internal_add_idls(parsed_idls, options);
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.mark_as_untested = function (parsed_idls)
|
||||
//@{
|
||||
{
|
||||
for (var i = 0; i < parsed_idls.length; i++) {
|
||||
parsed_idls[i].untested = true;
|
||||
|
@ -241,21 +220,15 @@ IdlArray.prototype.mark_as_untested = function (parsed_idls)
|
|||
}
|
||||
}
|
||||
};
|
||||
//@}
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.is_excluded_by_options = function (name, options)
|
||||
//@{
|
||||
{
|
||||
return options &&
|
||||
(options.except && options.except.includes(name)
|
||||
|| options.only && !options.only.includes(name));
|
||||
};
|
||||
//@}
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.add_dependency_idls = function(raw_idls, options)
|
||||
//@{
|
||||
{
|
||||
const parsed_idls = WebIDL2.parse(raw_idls);
|
||||
const new_options = { only: [] }
|
||||
|
@ -361,9 +334,7 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options)
|
|||
}
|
||||
}
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.internal_add_idls = function(parsed_idls, options)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* Internal helper called by add_idls() and add_untested_idls().
|
||||
|
@ -501,9 +472,7 @@ IdlArray.prototype.internal_add_idls = function(parsed_idls, options)
|
|||
}.bind(this));
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.add_objects = function(dict)
|
||||
//@{
|
||||
{
|
||||
/** Entry point. See documentation at beginning of file. */
|
||||
for (var k in dict)
|
||||
|
@ -519,17 +488,13 @@ IdlArray.prototype.add_objects = function(dict)
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.prevent_multiple_testing = function(name)
|
||||
//@{
|
||||
{
|
||||
/** Entry point. See documentation at beginning of file. */
|
||||
this.members[name].prevent_multiple_testing = true;
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.recursively_get_implements = function(interface_name)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* Helper function for test(). Returns an array of things that implement
|
||||
|
@ -557,9 +522,7 @@ IdlArray.prototype.recursively_get_implements = function(interface_name)
|
|||
return ret;
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.recursively_get_includes = function(interface_name)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* Helper function for test(). Returns an array of things that implement
|
||||
|
@ -587,9 +550,7 @@ IdlArray.prototype.recursively_get_includes = function(interface_name)
|
|||
return ret;
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.is_json_type = function(type)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* Checks whether type is a JSON type as per
|
||||
|
@ -754,14 +715,12 @@ function exposed_in(globals) {
|
|||
throw new IdlHarnessError("Unexpected global object");
|
||||
}
|
||||
|
||||
//@}
|
||||
/**
|
||||
* Asserts that the given error message is thrown for the given function.
|
||||
* @param {string|IdlHarnessError} error Expected Error message.
|
||||
* @param {Function} idlArrayFunc Function operating on an IdlArray that should throw.
|
||||
*/
|
||||
IdlArray.prototype.assert_throws = function(error, idlArrayFunc)
|
||||
//@{
|
||||
{
|
||||
try {
|
||||
idlArrayFunc.call(this, this);
|
||||
|
@ -781,9 +740,7 @@ IdlArray.prototype.assert_throws = function(error, idlArrayFunc)
|
|||
throw new IdlHarnessError(`${idlArrayFunc} did not throw the expected IdlHarnessError`);
|
||||
}
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.test = function()
|
||||
//@{
|
||||
{
|
||||
/** Entry point. See documentation at beginning of file. */
|
||||
|
||||
|
@ -872,9 +829,7 @@ IdlArray.prototype.test = function()
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.collapse_partials = function()
|
||||
//@{
|
||||
{
|
||||
const testedPartials = new Map();
|
||||
this.partials.forEach(function(parsed_idl)
|
||||
|
@ -955,9 +910,7 @@ IdlArray.prototype.collapse_partials = function()
|
|||
this.partials = [];
|
||||
}
|
||||
|
||||
//@}
|
||||
IdlArray.prototype.assert_type_is = function(value, type)
|
||||
//@{
|
||||
{
|
||||
if (type.idlType in this.members
|
||||
&& this.members[type.idlType] instanceof IdlTypedef) {
|
||||
|
@ -1176,12 +1129,10 @@ IdlArray.prototype.assert_type_is = function(value, type)
|
|||
throw new IdlHarnessError("Type " + type + " isn't an interface or dictionary");
|
||||
}
|
||||
};
|
||||
//@}
|
||||
|
||||
/// IdlObject ///
|
||||
function IdlObject() {}
|
||||
IdlObject.prototype.test = function()
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* By default, this does nothing, so no actual tests are run for IdlObjects
|
||||
|
@ -1189,9 +1140,7 @@ IdlObject.prototype.test = function()
|
|||
*/
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlObject.prototype.has_extended_attribute = function(name)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* This is only meaningful for things that support extended attributes,
|
||||
|
@ -1203,12 +1152,10 @@ IdlObject.prototype.has_extended_attribute = function(name)
|
|||
});
|
||||
};
|
||||
|
||||
//@}
|
||||
|
||||
/// IdlDictionary ///
|
||||
// Used for IdlArray.prototype.assert_type_is
|
||||
function IdlDictionary(obj)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* obj is an object produced by the WebIDLParser.js "dictionary"
|
||||
|
@ -1231,7 +1178,6 @@ function IdlDictionary(obj)
|
|||
this.base = obj.inheritance;
|
||||
}
|
||||
|
||||
//@}
|
||||
IdlDictionary.prototype = Object.create(IdlObject.prototype);
|
||||
|
||||
IdlDictionary.prototype.get_inheritance_stack = function() {
|
||||
|
@ -1240,7 +1186,6 @@ IdlDictionary.prototype.get_inheritance_stack = function() {
|
|||
|
||||
/// IdlInterface ///
|
||||
function IdlInterface(obj, is_callback, is_mixin)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* obj is an object produced by the WebIDLParser.js "interface" production.
|
||||
|
@ -1279,30 +1224,23 @@ function IdlInterface(obj, is_callback, is_mixin)
|
|||
this._is_callback = is_callback;
|
||||
this._is_mixin = is_mixin;
|
||||
}
|
||||
//@}
|
||||
IdlInterface.prototype = Object.create(IdlObject.prototype);
|
||||
IdlInterface.prototype.is_callback = function()
|
||||
//@{
|
||||
{
|
||||
return this._is_callback;
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlInterface.prototype.is_mixin = function()
|
||||
//@{
|
||||
{
|
||||
return this._is_mixin;
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlInterface.prototype.has_constants = function()
|
||||
//@{
|
||||
{
|
||||
return this.members.some(function(member) {
|
||||
return member.type === "const";
|
||||
});
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlInterface.prototype.get_unscopables = function()
|
||||
{
|
||||
|
@ -1312,13 +1250,11 @@ IdlInterface.prototype.get_unscopables = function()
|
|||
};
|
||||
|
||||
IdlInterface.prototype.is_global = function()
|
||||
//@{
|
||||
{
|
||||
return this.extAttrs.some(function(attribute) {
|
||||
return attribute.name === "Global";
|
||||
});
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlInterface.prototype.has_to_json_regular_operation = function() {
|
||||
return this.members.some(function(m) {
|
||||
|
@ -1446,7 +1382,6 @@ function _traverse_inherited_and_consequential_interfaces(stack, callback) {
|
|||
}
|
||||
|
||||
IdlInterface.prototype.test = function()
|
||||
//@{
|
||||
{
|
||||
if (this.has_extended_attribute("NoInterfaceObject") || this.is_mixin())
|
||||
{
|
||||
|
@ -1478,10 +1413,8 @@ IdlInterface.prototype.test = function()
|
|||
// interface are still tested.
|
||||
this.test_members();
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlInterface.prototype.test_self = function()
|
||||
//@{
|
||||
{
|
||||
subsetTestByKey(this.name, test, function()
|
||||
{
|
||||
|
@ -1919,9 +1852,7 @@ IdlInterface.prototype.test_self = function()
|
|||
}.bind(this), this.name + ' interface: existence and properties of interface prototype object\'s @@unscopables property');
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_immutable_prototype = function(type, obj)
|
||||
//@{
|
||||
{
|
||||
if (typeof Object.setPrototypeOf !== "function") {
|
||||
return;
|
||||
|
@ -2023,9 +1954,7 @@ IdlInterface.prototype.test_immutable_prototype = function(type, obj)
|
|||
"should return true");
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_member_const = function(member)
|
||||
//@{
|
||||
{
|
||||
if (!this.has_constants()) {
|
||||
throw new IdlHarnessError("Internal error: test_member_const called without any constants");
|
||||
|
@ -2084,9 +2013,7 @@ IdlInterface.prototype.test_member_const = function(member)
|
|||
};
|
||||
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_member_attribute = function(member)
|
||||
//@{
|
||||
{
|
||||
if (!shouldRunSubTest(this.name)) {
|
||||
return;
|
||||
|
@ -2179,9 +2106,7 @@ IdlInterface.prototype.test_member_attribute = function(member)
|
|||
}.bind(this));
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_member_operation = function(member)
|
||||
//@{
|
||||
{
|
||||
if (!shouldRunSubTest(this.name)) {
|
||||
return;
|
||||
|
@ -2274,9 +2199,7 @@ IdlInterface.prototype.do_member_unscopable_asserts = function(member)
|
|||
this.name + '.prototype[Symbol.unscopables].' + prop + ' must have the value `true`');
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject, member, a_test)
|
||||
//@{
|
||||
{
|
||||
var done = a_test.done.bind(a_test);
|
||||
var operationUnforgeable = member.isUnforgeable;
|
||||
|
@ -2343,9 +2266,7 @@ IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject
|
|||
}
|
||||
}
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.add_iterable_members = function(member)
|
||||
//@{
|
||||
{
|
||||
this.members.push(new IdlInterfaceMember(
|
||||
{ type: "operation", name: "entries", idlType: "iterator", arguments: []}));
|
||||
|
@ -2385,9 +2306,7 @@ IdlInterface.prototype.test_to_json_operation = function(memberHolderObject, mem
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_member_iterable = function(member)
|
||||
//@{
|
||||
{
|
||||
var interfaceName = this.name;
|
||||
var isPairIterator = member.idlType.length === 2;
|
||||
|
@ -2413,9 +2332,7 @@ IdlInterface.prototype.test_member_iterable = function(member)
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_member_stringifier = function(member)
|
||||
//@{
|
||||
{
|
||||
subsetTestByKey(this.name, test, function()
|
||||
{
|
||||
|
@ -2477,9 +2394,7 @@ IdlInterface.prototype.test_member_stringifier = function(member)
|
|||
}.bind(this), this.name + " interface: stringifier");
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_members = function()
|
||||
//@{
|
||||
{
|
||||
for (var i = 0; i < this.members.length; i++)
|
||||
{
|
||||
|
@ -2556,9 +2471,7 @@ IdlInterface.prototype.test_members = function()
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_object = function(desc)
|
||||
//@{
|
||||
{
|
||||
var obj, exception = null;
|
||||
try
|
||||
|
@ -2593,9 +2506,7 @@ IdlInterface.prototype.test_object = function(desc)
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_primary_interface_of = function(desc, obj, exception, expected_typeof)
|
||||
//@{
|
||||
{
|
||||
// Only the object itself, not its members, are tested here, so if the
|
||||
// interface is untested, there is nothing to do.
|
||||
|
@ -2657,9 +2568,7 @@ IdlInterface.prototype.test_primary_interface_of = function(desc, obj, exception
|
|||
}.bind(this), "Stringification of " + desc);
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expected_typeof)
|
||||
//@{
|
||||
{
|
||||
// TODO: Indexed and named properties, more checks on interface members
|
||||
this.already_tested = true;
|
||||
|
@ -2804,9 +2713,7 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
|
|||
}
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.has_stringifier = function()
|
||||
//@{
|
||||
{
|
||||
if (this.name === "DOMException") {
|
||||
// toString is inherited from Error, so don't assume we have the
|
||||
|
@ -2823,9 +2730,7 @@ IdlInterface.prototype.has_stringifier = function()
|
|||
return false;
|
||||
};
|
||||
|
||||
//@}
|
||||
IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_test)
|
||||
//@{
|
||||
{
|
||||
// This function tests WebIDL as of 2015-01-27.
|
||||
// TODO: Consider [Exposed].
|
||||
|
@ -2948,11 +2853,9 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_
|
|||
|
||||
Promise.all(pendingPromises).then(a_test.done.bind(a_test));
|
||||
}
|
||||
//@}
|
||||
|
||||
/// IdlInterfaceMember ///
|
||||
function IdlInterfaceMember(obj)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* obj is an object produced by the WebIDLParser.js "ifMember" production.
|
||||
|
@ -2972,7 +2875,6 @@ function IdlInterfaceMember(obj)
|
|||
this.isUnscopable = this.has_extended_attribute("Unscopable");
|
||||
}
|
||||
|
||||
//@}
|
||||
IdlInterfaceMember.prototype = Object.create(IdlObject.prototype);
|
||||
|
||||
IdlInterfaceMember.prototype.is_to_json_regular_operation = function() {
|
||||
|
@ -2981,7 +2883,6 @@ IdlInterfaceMember.prototype.is_to_json_regular_operation = function() {
|
|||
|
||||
/// Internal helper functions ///
|
||||
function create_suitable_object(type)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* type is an object produced by the WebIDLParser.js "type" production. We
|
||||
|
@ -3017,12 +2918,10 @@ function create_suitable_object(type)
|
|||
}
|
||||
return null;
|
||||
}
|
||||
//@}
|
||||
|
||||
/// IdlEnum ///
|
||||
// Used for IdlArray.prototype.assert_type_is
|
||||
function IdlEnum(obj)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* obj is an object produced by the WebIDLParser.js "dictionary"
|
||||
|
@ -3036,14 +2935,12 @@ function IdlEnum(obj)
|
|||
this.values = obj.values;
|
||||
|
||||
}
|
||||
//@}
|
||||
|
||||
IdlEnum.prototype = Object.create(IdlObject.prototype);
|
||||
|
||||
/// IdlTypedef ///
|
||||
// Used for IdlArray.prototype.assert_type_is
|
||||
function IdlTypedef(obj)
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* obj is an object produced by the WebIDLParser.js "typedef"
|
||||
|
@ -3057,13 +2954,11 @@ function IdlTypedef(obj)
|
|||
this.idlType = obj.idlType;
|
||||
|
||||
}
|
||||
//@}
|
||||
|
||||
IdlTypedef.prototype = Object.create(IdlObject.prototype);
|
||||
|
||||
/// IdlNamespace ///
|
||||
function IdlNamespace(obj)
|
||||
//@{
|
||||
{
|
||||
this.name = obj.name;
|
||||
this.extAttrs = obj.extAttrs;
|
||||
|
@ -3074,12 +2969,10 @@ function IdlNamespace(obj)
|
|||
/** An array of IdlInterfaceMembers. */
|
||||
this.members = obj.members.map(m => new IdlInterfaceMember(m));
|
||||
}
|
||||
//@}
|
||||
|
||||
IdlNamespace.prototype = Object.create(IdlObject.prototype);
|
||||
|
||||
IdlNamespace.prototype.do_member_operation_asserts = function (memberHolderObject, member, a_test)
|
||||
//@{
|
||||
{
|
||||
var desc = Object.getOwnPropertyDescriptor(memberHolderObject, member.name);
|
||||
|
||||
|
@ -3108,10 +3001,8 @@ IdlNamespace.prototype.do_member_operation_asserts = function (memberHolderObjec
|
|||
"operation has wrong .length");
|
||||
a_test.done();
|
||||
}
|
||||
//@}
|
||||
|
||||
IdlNamespace.prototype.test_member_operation = function(member)
|
||||
//@{
|
||||
{
|
||||
if (!shouldRunSubTest(this.name)) {
|
||||
return;
|
||||
|
@ -3136,10 +3027,8 @@ IdlNamespace.prototype.test_member_operation = function(member)
|
|||
this.do_member_operation_asserts(self[this.name], member, a_test);
|
||||
}.bind(this));
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlNamespace.prototype.test_member_attribute = function (member)
|
||||
//@{
|
||||
{
|
||||
if (!shouldRunSubTest(this.name)) {
|
||||
return;
|
||||
|
@ -3160,10 +3049,8 @@ IdlNamespace.prototype.test_member_attribute = function (member)
|
|||
a_test.done();
|
||||
}.bind(this));
|
||||
};
|
||||
//@}
|
||||
|
||||
IdlNamespace.prototype.test = function ()
|
||||
//@{
|
||||
{
|
||||
/**
|
||||
* TODO(lukebjerring): Assert:
|
||||
|
@ -3189,7 +3076,6 @@ IdlNamespace.prototype.test = function ()
|
|||
}
|
||||
};
|
||||
};
|
||||
//@}
|
||||
|
||||
}());
|
||||
|
||||
|
|
|
@ -15,20 +15,22 @@ promise_test(function(t) {
|
|||
return runTest(t, 'resources/claim-nested-worker-fetch-iframe.html');
|
||||
}, 'fetch() in nested Worker should be intercepted after the client is claimed.');
|
||||
|
||||
var frame;
|
||||
var registration;
|
||||
|
||||
function runTest(t, iframe_url) {
|
||||
var resource = 'simple.txt';
|
||||
|
||||
var frame;
|
||||
var registration;
|
||||
var worker;
|
||||
var scope = 'resources/';
|
||||
var script = 'resources/claim-worker.js';
|
||||
|
||||
const test_result = Promise.resolve()
|
||||
return Promise.resolve()
|
||||
// Create the test iframe with a dedicated worker.
|
||||
.then(() => with_iframe(iframe_url))
|
||||
.then(f => frame = f)
|
||||
.then(f => {
|
||||
t.add_cleanup(() => f.remove());
|
||||
frame = f;
|
||||
})
|
||||
|
||||
// Check the controller and test with fetch in the worker.
|
||||
.then(() => assert_equals(frame.contentWindow.navigator.controller,
|
||||
|
@ -40,7 +42,10 @@ function runTest(t, iframe_url) {
|
|||
'fetch() should not be intercepted.'))
|
||||
// Register a service worker.
|
||||
.then(() => service_worker_unregister_and_register(t, script, scope))
|
||||
.then(r => worker = r.installing)
|
||||
.then(r => {
|
||||
t.add_cleanup(() => r.unregister());
|
||||
worker = r.installing;
|
||||
})
|
||||
.then(() => wait_for_state(t, worker, 'activated'))
|
||||
|
||||
// Let the service worker claim the iframe and the worker.
|
||||
|
@ -69,18 +74,6 @@ function runTest(t, iframe_url) {
|
|||
assert_equals(response_text,
|
||||
'Intercepted!',
|
||||
'fetch() in the worker should be intercepted.'));
|
||||
|
||||
// Cleanup this testcase.
|
||||
return Promise.resolve()
|
||||
.then(cleanup, cleanup)
|
||||
.then(() => { return test_result; });
|
||||
}
|
||||
|
||||
const cleanup = async () => {
|
||||
if (registration)
|
||||
await registration.unregister();
|
||||
if (frame)
|
||||
frame.remove();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Tests for module import: ServiceWorker</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-helpers.sub.js"></script>
|
||||
<script src="/workers/modules/resources/import-test-cases.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
function import_test(testCase) {
|
||||
promise_test(async t => {
|
||||
const msgPromise = new Promise(resolve => {
|
||||
navigator.serviceWorker.onmessage = resolve;
|
||||
});
|
||||
await service_worker_unregister(t, testCase.scriptURL);
|
||||
const registration = await navigator.serviceWorker.register(
|
||||
testCase.scriptURL,
|
||||
{ scope: testCase.scriptURL, type: 'module' });
|
||||
registration.installing.postMessage(
|
||||
'Send message for tests from main script.');
|
||||
const msgEvent = await msgPromise;
|
||||
assert_array_equals(msgEvent.data, testCase.expectation);
|
||||
}, testCase.description);
|
||||
}
|
||||
|
||||
testCases.forEach(import_test);
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,16 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title></title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<div id="host1"><slot>foo</slot></div>
|
||||
<script>
|
||||
|
||||
test(() => {
|
||||
var host1 = document.getElementById("host1");
|
||||
var sr = host1.attachShadow({mode: "open"});
|
||||
sr.innerHTML = "<slot></slot>";
|
||||
assert_array_equals(sr.firstChild.assignedNodes({ flatten: true }), [host1.firstChild]);
|
||||
}, "Light DOM slot element should be in flattened assignedNodes");
|
||||
|
||||
</script>
|
|
@ -30,6 +30,17 @@ test(function() {
|
|||
}
|
||||
}, 'new SpeechSynthesisUtterance("hello") text and defaults');
|
||||
|
||||
test(function() {
|
||||
const utt = new SpeechSynthesisUtterance(null);
|
||||
assert_equals(utt.text, 'null');
|
||||
}, 'new SpeechSynthesisUtterance(null)');
|
||||
|
||||
test(function() {
|
||||
const utt = new SpeechSynthesisUtterance(undefined);
|
||||
// See https://github.com/w3c/speech-api/pull/48.
|
||||
assert_equals(utt.text, '');
|
||||
}, 'new SpeechSynthesisUtterance(undefined)');
|
||||
|
||||
test(function() {
|
||||
const utt = new SpeechSynthesisUtterance();
|
||||
utt.text = 'word';
|
||||
|
|
|
@ -6,4 +6,4 @@ cd $WPT_ROOT
|
|||
|
||||
mkdir -p ~/meta
|
||||
./wpt manifest -p ~/meta/MANIFEST.json
|
||||
./wpt lint
|
||||
./wpt lint --all
|
||||
|
|
|
@ -18,14 +18,14 @@ test_infrastructure() {
|
|||
}
|
||||
|
||||
main() {
|
||||
PRODUCTS=( "firefox" "chrome" "chrome_webdriver" )
|
||||
PRODUCTS=( "firefox" "chrome" )
|
||||
for PRODUCT in "${PRODUCTS[@]}"; do
|
||||
if [ "$PRODUCT" != "firefox" ]; then
|
||||
# Firefox is expected to work using pref settings for DNS
|
||||
# Don't adjust the hostnames in that case to ensure this keeps working
|
||||
hosts_fixup
|
||||
fi
|
||||
if [[ "$PRODUCT" == "chrome"* ]]; then
|
||||
if [[ "$PRODUCT" == "chrome" ]]; then
|
||||
install_chrome unstable
|
||||
test_infrastructure "--binary=$(which google-chrome-unstable)"
|
||||
else
|
||||
|
|
|
@ -499,13 +499,6 @@ class ChromeAndroid(Browser):
|
|||
def version(self, binary):
|
||||
return None
|
||||
|
||||
class ChromeWebDriver(Chrome):
|
||||
"""Chrome-specific interface for chrome without using selenium.
|
||||
|
||||
Includes webdriver installation.
|
||||
"""
|
||||
product = "chrome_webdriver"
|
||||
|
||||
class Opera(Browser):
|
||||
"""Opera-specific interface.
|
||||
|
||||
|
|
|
@ -292,11 +292,6 @@ class ChromeAndroid(BrowserSetup):
|
|||
raise WptrunError("Unable to locate or install chromedriver binary")
|
||||
|
||||
|
||||
class ChromeWebDriver(Chrome):
|
||||
name = "chrome_webdriver"
|
||||
browser_cls = browser.ChromeWebDriver
|
||||
|
||||
|
||||
class Opera(BrowserSetup):
|
||||
name = "opera"
|
||||
browser_cls = browser.Opera
|
||||
|
@ -435,7 +430,6 @@ product_setup = {
|
|||
"firefox": Firefox,
|
||||
"chrome": Chrome,
|
||||
"chrome_android": ChromeAndroid,
|
||||
"chrome_webdriver": ChromeWebDriver,
|
||||
"edge": Edge,
|
||||
"edge_webdriver": EdgeWebDriver,
|
||||
"ie": InternetExplorer,
|
||||
|
|
|
@ -24,7 +24,6 @@ module global scope.
|
|||
|
||||
product_list = ["chrome",
|
||||
"chrome_android",
|
||||
"chrome_webdriver",
|
||||
"edge",
|
||||
"edge_webdriver",
|
||||
"fennec",
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
from .base import Browser, ExecutorBrowser, require_arg
|
||||
from ..webdriver_server import ChromeDriverServer
|
||||
from ..executors import executor_kwargs as base_executor_kwargs
|
||||
from ..executors.executorselenium import (SeleniumTestharnessExecutor, # noqa: F401
|
||||
SeleniumRefTestExecutor) # noqa: F401
|
||||
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
|
||||
WebDriverRefTestExecutor) # noqa: F401
|
||||
from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
|
||||
|
||||
|
||||
__wptrunner__ = {"product": "chrome",
|
||||
"check_args": "check_args",
|
||||
"browser": "ChromeBrowser",
|
||||
"executor": {"testharness": "SeleniumTestharnessExecutor",
|
||||
"reftest": "SeleniumRefTestExecutor",
|
||||
"executor": {"testharness": "WebDriverTestharnessExecutor",
|
||||
"reftest": "WebDriverRefTestExecutor",
|
||||
"wdspec": "ChromeDriverWdspecExecutor"},
|
||||
"browser_kwargs": "browser_kwargs",
|
||||
"executor_kwargs": "executor_kwargs",
|
||||
|
@ -30,34 +30,43 @@ def browser_kwargs(test_type, run_info_data, config, **kwargs):
|
|||
|
||||
def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
|
||||
**kwargs):
|
||||
from selenium.webdriver import DesiredCapabilities
|
||||
|
||||
executor_kwargs = base_executor_kwargs(test_type, server_config,
|
||||
cache_manager, run_info_data,
|
||||
**kwargs)
|
||||
executor_kwargs["close_after_done"] = True
|
||||
capabilities = dict(DesiredCapabilities.CHROME.items())
|
||||
capabilities.setdefault("goog:chromeOptions", {})["prefs"] = {
|
||||
"profile": {
|
||||
"default_content_setting_values": {
|
||||
"popups": 1
|
||||
}
|
||||
|
||||
capabilities = {
|
||||
"browserName": "chrome",
|
||||
"platform": "ANY",
|
||||
"version": "",
|
||||
"goog:chromeOptions": {
|
||||
"prefs": {
|
||||
"profile": {
|
||||
"default_content_setting_values": {
|
||||
"popups": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"w3c": True
|
||||
}
|
||||
}
|
||||
|
||||
for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
|
||||
if kwargs[kwarg] is not None:
|
||||
capabilities["goog:chromeOptions"][capability] = kwargs[kwarg]
|
||||
|
||||
if kwargs["headless"]:
|
||||
if "args" not in capabilities["goog:chromeOptions"]:
|
||||
capabilities["goog:chromeOptions"]["args"] = []
|
||||
if "--headless" not in capabilities["goog:chromeOptions"]["args"]:
|
||||
capabilities["goog:chromeOptions"]["args"].append("--headless")
|
||||
|
||||
if test_type == "testharness":
|
||||
capabilities["goog:chromeOptions"]["useAutomationExtension"] = False
|
||||
capabilities["goog:chromeOptions"]["excludeSwitches"] = ["enable-automation"]
|
||||
if test_type == "wdspec":
|
||||
capabilities["goog:chromeOptions"]["w3c"] = True
|
||||
|
||||
executor_kwargs["capabilities"] = capabilities
|
||||
|
||||
return executor_kwargs
|
||||
|
||||
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
from .base import inherit
|
||||
from . import chrome
|
||||
|
||||
from ..executors import executor_kwargs as base_executor_kwargs
|
||||
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
|
||||
WebDriverRefTestExecutor) # noqa: F401
|
||||
|
||||
|
||||
inherit(chrome, globals(), "chrome_webdriver")
|
||||
|
||||
# __wptrunner__ magically appears from inherit, F821 is undefined name
|
||||
__wptrunner__["executor_kwargs"] = "executor_kwargs" # noqa: F821
|
||||
__wptrunner__["executor"]["testharness"] = "WebDriverTestharnessExecutor" # noqa: F821
|
||||
__wptrunner__["executor"]["reftest"] = "WebDriverRefTestExecutor" # noqa: F821
|
||||
|
||||
|
||||
def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
|
||||
**kwargs):
|
||||
executor_kwargs = base_executor_kwargs(test_type, server_config,
|
||||
cache_manager, run_info_data,
|
||||
**kwargs)
|
||||
executor_kwargs["close_after_done"] = True
|
||||
|
||||
capabilities = {
|
||||
"browserName": "chrome",
|
||||
"platform": "ANY",
|
||||
"version": "",
|
||||
"goog:chromeOptions": {
|
||||
"prefs": {
|
||||
"profile": {
|
||||
"default_content_setting_values": {
|
||||
"popups": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"w3c": True
|
||||
}
|
||||
}
|
||||
|
||||
for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
|
||||
if kwargs[kwarg] is not None:
|
||||
capabilities["goog:chromeOptions"][capability] = kwargs[kwarg]
|
||||
|
||||
if kwargs["headless"]:
|
||||
if "args" not in capabilities["goog:chromeOptions"]:
|
||||
capabilities["goog:chromeOptions"]["args"] = []
|
||||
if "--headless" not in capabilities["goog:chromeOptions"]["args"]:
|
||||
capabilities["goog:chromeOptions"]["args"].append("--headless")
|
||||
|
||||
if test_type == "testharness":
|
||||
capabilities["goog:chromeOptions"]["useAutomationExtension"] = False
|
||||
capabilities["goog:chromeOptions"]["excludeSwitches"] = ["enable-automation"]
|
||||
|
||||
executor_kwargs["capabilities"] = capabilities
|
||||
|
||||
return executor_kwargs
|
|
@ -226,8 +226,12 @@ class SeleniumRun(object):
|
|||
|
||||
flag = self.result_flag.wait(timeout + 2 * extra_timeout)
|
||||
if self.result is None:
|
||||
assert not flag
|
||||
self.result = False, ("EXTERNAL-TIMEOUT", None)
|
||||
if flag:
|
||||
# flag is True unless we timeout; this *shouldn't* happen, but
|
||||
# it can if self._run fails to set self.result due to raising
|
||||
self.result = False, ("INTERNAL-ERROR", "self._run didn't set a result")
|
||||
else:
|
||||
self.result = False, ("EXTERNAL-TIMEOUT", None)
|
||||
|
||||
return self.result
|
||||
|
||||
|
@ -239,7 +243,7 @@ class SeleniumRun(object):
|
|||
except (socket.timeout, exceptions.ErrorInResponseException):
|
||||
self.result = False, ("CRASH", None)
|
||||
except Exception as e:
|
||||
message = getattr(e, "message", "")
|
||||
message = str(getattr(e, "message", ""))
|
||||
if message:
|
||||
message += "\n"
|
||||
message += traceback.format_exc(e)
|
||||
|
|
|
@ -228,8 +228,12 @@ class WebDriverRun(object):
|
|||
|
||||
flag = self.result_flag.wait(timeout + 2 * extra_timeout)
|
||||
if self.result is None:
|
||||
assert not flag
|
||||
self.result = False, ("EXTERNAL-TIMEOUT", None)
|
||||
if flag:
|
||||
# flag is True unless we timeout; this *shouldn't* happen, but
|
||||
# it can if self._run fails to set self.result due to raising
|
||||
self.result = False, ("INTERNAL-ERROR", "self._run didn't set a result")
|
||||
else:
|
||||
self.result = False, ("EXTERNAL-TIMEOUT", None)
|
||||
|
||||
return self.result
|
||||
|
||||
|
@ -247,11 +251,11 @@ class WebDriverRun(object):
|
|||
# workaround for https://bugs.chromium.org/p/chromedriver/issues/detail?id=2001
|
||||
self.result = False, ("EXTERNAL-TIMEOUT", None)
|
||||
else:
|
||||
message = getattr(e, "message", "")
|
||||
message = str(getattr(e, "message", ""))
|
||||
if message:
|
||||
message += "\n"
|
||||
message += traceback.format_exc(e)
|
||||
self.result = False, ("ERROR", message)
|
||||
self.result = False, ("INTERNAL-ERROR", message)
|
||||
finally:
|
||||
self.result_flag.set()
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ from multiprocessing import Process, current_process, Queue
|
|||
|
||||
from mozlog import structuredlog
|
||||
|
||||
import wptlogging
|
||||
|
||||
# Special value used as a sentinal in various commands
|
||||
Stop = object()
|
||||
|
||||
|
@ -40,12 +42,13 @@ for level_name in structuredlog.log_levels:
|
|||
|
||||
|
||||
class TestRunner(object):
|
||||
def __init__(self, command_queue, result_queue, executor):
|
||||
def __init__(self, logger, command_queue, result_queue, executor):
|
||||
"""Class implementing the main loop for running tests.
|
||||
|
||||
This class delegates the job of actually running a test to the executor
|
||||
that is passed in.
|
||||
|
||||
:param logger: Structured logger
|
||||
:param command_queue: subprocess.Queue used to send commands to the
|
||||
process
|
||||
:param result_queue: subprocess.Queue used to send results to the
|
||||
|
@ -57,7 +60,7 @@ class TestRunner(object):
|
|||
|
||||
self.executor = executor
|
||||
self.name = current_process().name
|
||||
self.logger = MessageLogger(self.send_message)
|
||||
self.logger = logger
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
@ -117,30 +120,31 @@ class TestRunner(object):
|
|||
def start_runner(runner_command_queue, runner_result_queue,
|
||||
executor_cls, executor_kwargs,
|
||||
executor_browser_cls, executor_browser_kwargs,
|
||||
stop_flag):
|
||||
capture_stdio, stop_flag):
|
||||
"""Launch a TestRunner in a new process"""
|
||||
def log(level, msg):
|
||||
runner_result_queue.put(("log", (level, {"message": msg})))
|
||||
|
||||
def send_message(command, *args):
|
||||
runner_result_queue.put((command, args))
|
||||
|
||||
def handle_error(e):
|
||||
log("critical", traceback.format_exc())
|
||||
logger.critical(traceback.format_exc())
|
||||
stop_flag.set()
|
||||
|
||||
try:
|
||||
browser = executor_browser_cls(**executor_browser_kwargs)
|
||||
executor = executor_cls(browser, **executor_kwargs)
|
||||
with TestRunner(runner_command_queue, runner_result_queue, executor) as runner:
|
||||
try:
|
||||
runner.run()
|
||||
except KeyboardInterrupt:
|
||||
stop_flag.set()
|
||||
except Exception as e:
|
||||
handle_error(e)
|
||||
except Exception as e:
|
||||
handle_error(e)
|
||||
finally:
|
||||
runner_command_queue = None
|
||||
runner_result_queue = None
|
||||
logger = MessageLogger(send_message)
|
||||
|
||||
with wptlogging.CaptureIO(logger, capture_stdio):
|
||||
try:
|
||||
browser = executor_browser_cls(**executor_browser_kwargs)
|
||||
executor = executor_cls(browser, **executor_kwargs)
|
||||
with TestRunner(logger, runner_command_queue, runner_result_queue, executor) as runner:
|
||||
try:
|
||||
runner.run()
|
||||
except KeyboardInterrupt:
|
||||
stop_flag.set()
|
||||
except Exception as e:
|
||||
handle_error(e)
|
||||
except Exception as e:
|
||||
handle_error(e)
|
||||
|
||||
|
||||
manager_count = 0
|
||||
|
@ -255,7 +259,8 @@ RunnerManagerState = _RunnerManagerState()
|
|||
class TestRunnerManager(threading.Thread):
|
||||
def __init__(self, suite_name, test_queue, test_source_cls, browser_cls, browser_kwargs,
|
||||
executor_cls, executor_kwargs, stop_flag, rerun=1, pause_after_test=False,
|
||||
pause_on_unexpected=False, restart_on_unexpected=True, debug_info=None):
|
||||
pause_on_unexpected=False, restart_on_unexpected=True, debug_info=None,
|
||||
capture_stdio=True):
|
||||
"""Thread that owns a single TestRunner process and any processes required
|
||||
by the TestRunner (e.g. the Firefox binary).
|
||||
|
||||
|
@ -313,6 +318,8 @@ class TestRunnerManager(threading.Thread):
|
|||
|
||||
self.browser = None
|
||||
|
||||
self.capture_stdio = capture_stdio
|
||||
|
||||
def run(self):
|
||||
"""Main loop for the TestManager.
|
||||
|
||||
|
@ -479,6 +486,7 @@ class TestRunnerManager(threading.Thread):
|
|||
self.executor_kwargs,
|
||||
executor_browser_cls,
|
||||
executor_browser_kwargs,
|
||||
self.capture_stdio,
|
||||
self.child_stop_flag)
|
||||
self.test_runner_proc = Process(target=start_runner,
|
||||
args=args,
|
||||
|
@ -737,7 +745,8 @@ class ManagerGroup(object):
|
|||
pause_after_test=False,
|
||||
pause_on_unexpected=False,
|
||||
restart_on_unexpected=True,
|
||||
debug_info=None):
|
||||
debug_info=None,
|
||||
capture_stdio=True):
|
||||
"""Main thread object that owns all the TestManager threads."""
|
||||
self.suite_name = suite_name
|
||||
self.size = size
|
||||
|
@ -752,6 +761,7 @@ class ManagerGroup(object):
|
|||
self.restart_on_unexpected = restart_on_unexpected
|
||||
self.debug_info = debug_info
|
||||
self.rerun = rerun
|
||||
self.capture_stdio = capture_stdio
|
||||
|
||||
self.pool = set()
|
||||
# Event that is polled by threads so that they can gracefully exit in the face
|
||||
|
@ -788,7 +798,8 @@ class ManagerGroup(object):
|
|||
self.pause_after_test,
|
||||
self.pause_on_unexpected,
|
||||
self.restart_on_unexpected,
|
||||
self.debug_info)
|
||||
self.debug_info,
|
||||
self.capture_stdio)
|
||||
manager.start()
|
||||
self.pool.add(manager)
|
||||
self.wait()
|
||||
|
|
|
@ -17,7 +17,7 @@ if "CURRENT_TOX_ENV" in os.environ:
|
|||
current_tox_env_split = os.environ["CURRENT_TOX_ENV"].split("-")
|
||||
|
||||
tox_env_extra_browsers = {
|
||||
"chrome": {"chrome_android", "chrome_webdriver"},
|
||||
"chrome": {"chrome_android"},
|
||||
"edge": {"edge_webdriver"},
|
||||
"safari": {"safari_webdriver"},
|
||||
"servo": {"servodriver"},
|
||||
|
|
|
@ -48,6 +48,7 @@ def get_loader(test_paths, product, debug=None, run_info_extras=None, **kwargs):
|
|||
run_info = wpttest.get_run_info(kwargs["run_info"], product,
|
||||
browser_version=kwargs.get("browser_version"),
|
||||
browser_channel=kwargs.get("browser_channel"),
|
||||
verify=kwargs.get("verify"),
|
||||
debug=debug,
|
||||
extras=run_info_extras)
|
||||
|
||||
|
@ -265,7 +266,8 @@ def run_tests(config, test_paths, product, **kwargs):
|
|||
kwargs["pause_after_test"],
|
||||
kwargs["pause_on_unexpected"],
|
||||
kwargs["restart_on_unexpected"],
|
||||
kwargs["debug_info"]) as manager_group:
|
||||
kwargs["debug_info"],
|
||||
not kwargs["no_capture_stdio"]) as manager_group:
|
||||
try:
|
||||
manager_group.run(test_type, run_tests)
|
||||
except KeyboardInterrupt:
|
||||
|
|
|
@ -70,6 +70,7 @@ class RunInfo(dict):
|
|||
def __init__(self, metadata_root, product, debug,
|
||||
browser_version=None,
|
||||
browser_channel=None,
|
||||
verify=None,
|
||||
extras=None):
|
||||
import mozinfo
|
||||
self._update_mozinfo(metadata_root)
|
||||
|
@ -94,6 +95,10 @@ class RunInfo(dict):
|
|||
self["browser_version"] = browser_version
|
||||
if browser_channel:
|
||||
self["browser_channel"] = browser_channel
|
||||
|
||||
self["verify"] = verify
|
||||
if "wasm" not in self:
|
||||
self["wasm"] = False
|
||||
if extras is not None:
|
||||
self.update(extras)
|
||||
|
||||
|
|
|
@ -7,8 +7,10 @@
|
|||
//HTML tests
|
||||
function createHTMLTest(policyName, policy, expectedHTML, t) {
|
||||
let p = window.TrustedTypes.createPolicy(policyName, policy);
|
||||
assert_true(p.createHTML('whatever') instanceof TrustedHTML);
|
||||
assert_equals(p.createHTML('whatever') + "", expectedHTML);
|
||||
let html = p.createHTML('whatever');
|
||||
assert_true(html instanceof TrustedHTML);
|
||||
assert_true(TrustedTypes.isHTML(html));
|
||||
assert_equals(html + "", expectedHTML);
|
||||
}
|
||||
|
||||
test(t => {
|
||||
|
@ -77,8 +79,10 @@
|
|||
//Script tests
|
||||
function createScriptTest(policyName, policy, expectedScript, t) {
|
||||
let p = window.TrustedTypes.createPolicy(policyName, policy);
|
||||
assert_true(p.createScript('whatever') instanceof TrustedScript);
|
||||
assert_equals(p.createScript('whatever') + "", expectedScript);
|
||||
let script = p.createScript('whatever');
|
||||
assert_true(script instanceof TrustedScript);
|
||||
assert_true(TrustedTypes.isScript(script));
|
||||
assert_equals(script + "", expectedScript);
|
||||
}
|
||||
|
||||
test(t => {
|
||||
|
@ -150,8 +154,10 @@
|
|||
//ScriptURL tests
|
||||
function createScriptURLTest(policyName, policy, expectedScriptURL, t) {
|
||||
let p = window.TrustedTypes.createPolicy(policyName, policy);
|
||||
assert_true(p.createScriptURL(INPUTS.SCRIPTURL) instanceof TrustedScriptURL);
|
||||
assert_equals(p.createScriptURL(INPUTS.SCRIPTURL) + "", expectedScriptURL);
|
||||
let scriptUrl = p.createScriptURL(INPUTS.SCRIPTURL);
|
||||
assert_true(scriptUrl instanceof TrustedScriptURL);
|
||||
assert_true(TrustedTypes.isScriptURL(scriptUrl));
|
||||
assert_equals(scriptUrl + "", expectedScriptURL);
|
||||
}
|
||||
|
||||
test(t => {
|
||||
|
@ -223,8 +229,10 @@
|
|||
//URL tests
|
||||
function createURLTest(policyName, policy, expectedURL, t) {
|
||||
let p = window.TrustedTypes.createPolicy(policyName, policy);
|
||||
assert_true(p.createURL(INPUTS.URL) instanceof TrustedURL);
|
||||
assert_equals(p.createURL(INPUTS.URL) + "", expectedURL);
|
||||
let url = p.createURL(INPUTS.URL);
|
||||
assert_true(url instanceof TrustedURL);
|
||||
assert_true(TrustedTypes.isURL(url));
|
||||
assert_equals(url + "", expectedURL);
|
||||
}
|
||||
|
||||
test(t => {
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="support/helper.sub.js"></script>
|
||||
|
||||
<meta http-equiv="Content-Security-Policy" content="trusted-types">
|
||||
<body>
|
||||
<script>
|
||||
// Policy settings for all tests
|
||||
const noopPolicy = {
|
||||
'createHTML': (s) => s,
|
||||
'createScriptURL': (s) => s,
|
||||
'createURL': (s) => s,
|
||||
'createScript': (s) => s,
|
||||
};
|
||||
|
||||
// isHTML tests
|
||||
test(t => {
|
||||
const p = TrustedTypes.createPolicy('html', noopPolicy);
|
||||
let html = p.createHTML(INPUTS.HTML);
|
||||
|
||||
assert_true(TrustedTypes.isHTML(html));
|
||||
let html2 = Object.create(html);
|
||||
|
||||
// instanceof can pass, but we rely on isHTML
|
||||
assert_true(html2 instanceof TrustedHTML);
|
||||
assert_false(TrustedTypes.isHTML(html2));
|
||||
|
||||
let html3 = Object.assign({}, html, {toString: () => 'fake'});
|
||||
|
||||
assert_false(TrustedTypes.isHTML(html3));
|
||||
}, 'TrustedTypePolicyFactory.isHTML requires the object to be created via policy.');
|
||||
|
||||
// isScript tests
|
||||
test(t => {
|
||||
const p = TrustedTypes.createPolicy('script', noopPolicy);
|
||||
let script = p.createScript(INPUTS.SCRIPT);
|
||||
|
||||
assert_true(TrustedTypes.isScript(script));
|
||||
let script2 = Object.create(script);
|
||||
|
||||
// instanceof can pass, but we rely on isScript
|
||||
assert_true(script2 instanceof TrustedScript);
|
||||
assert_false(TrustedTypes.isScript(script2));
|
||||
|
||||
let script3 = Object.assign({}, script, {toString: () => 'fake'});
|
||||
|
||||
assert_false(TrustedTypes.isScript(script3));
|
||||
}, 'TrustedTypePolicyFactory.isScript requires the object to be created via policy.');
|
||||
|
||||
// isScriptURL tests
|
||||
test(t => {
|
||||
const p = TrustedTypes.createPolicy('script_url', noopPolicy);
|
||||
let script = p.createScriptURL(INPUTS.SCRIPTURL);
|
||||
|
||||
assert_true(TrustedTypes.isScriptURL(script));
|
||||
let script2 = Object.create(script);
|
||||
|
||||
// instanceof can pass, but we rely on isScript
|
||||
assert_true(script2 instanceof TrustedScriptURL);
|
||||
assert_false(TrustedTypes.isScriptURL(script2));
|
||||
|
||||
let script3 = Object.assign({}, script, {toString: () => 'fake'});
|
||||
|
||||
assert_false(TrustedTypes.isScriptURL(script3));
|
||||
}, 'TrustedTypePolicyFactory.isScriptURL requires the object to be created via policy.');
|
||||
|
||||
// isURL tests
|
||||
test(t => {
|
||||
const p = TrustedTypes.createPolicy('url', noopPolicy);
|
||||
let url = p.createURL(INPUTS.URL);
|
||||
|
||||
assert_true(TrustedTypes.isURL(url));
|
||||
let url2 = Object.create(url);
|
||||
|
||||
// instanceof can pass, but we rely on isScript
|
||||
assert_true(url2 instanceof TrustedURL);
|
||||
assert_false(TrustedTypes.isURL(url2));
|
||||
|
||||
let url3 = Object.assign({}, url, {toString: () => 'fake'});
|
||||
|
||||
assert_false(TrustedTypes.isURL(url3));
|
||||
}, 'TrustedTypePolicyFactory.isURL requires the object to be created via policy.');
|
||||
|
||||
// Redefinition tests
|
||||
// TODO(vogelheim): Implement TrustedTypes (& policy objects) as 'frozen'.
|
||||
/* test(t => {
|
||||
assert_throws(new TypeError(), _ => {
|
||||
TrustedTypes.isHTML = () => true;
|
||||
});
|
||||
|
||||
assert_false(TrustedTypes.isHTML({}));
|
||||
}, 'TrustedTypePolicyFactory.IsHTML cannot be redefined.');
|
||||
|
||||
test(t => {
|
||||
assert_throws(new TypeError(), _ => {
|
||||
TrustedTypes.isScript = () => true;
|
||||
});
|
||||
|
||||
assert_false(TrustedTypes.isScript({}));
|
||||
}, 'TrustedTypePolicyFactory.isScript cannot be redefined.');
|
||||
|
||||
test(t => {
|
||||
assert_throws(new TypeError(), _ => {
|
||||
TrustedTypes.isScriptURL = () => true;
|
||||
});
|
||||
|
||||
assert_false(TrustedTypes.isScriptURL({}));
|
||||
}, 'TrustedTypePolicyFactory.isScriptURL cannot be redefined.');
|
||||
|
||||
test(t => {
|
||||
assert_throws(new TypeError(), _ => {
|
||||
TrustedTypes.isURL = () => true;
|
||||
});
|
||||
|
||||
assert_false(TrustedTypes.isURL({}));
|
||||
}, 'TrustedTypePolicyFactory.isURL cannot be redefined.');*/
|
||||
</script>
|
|
@ -73,4 +73,14 @@
|
|||
test(t => {
|
||||
assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', null, 'null');
|
||||
}, "a.rel accepts null");
|
||||
|
||||
test(t => {
|
||||
let el = document.createElement('iframe');
|
||||
|
||||
assert_throws(new TypeError(), _ => {
|
||||
el.setAttribute('SrC', INPUTS.URL);
|
||||
});
|
||||
|
||||
assert_equals(el.src, '');
|
||||
}, "`Element.prototype.setAttribute.SrC = string` throws.");
|
||||
</script>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
should(() => {
|
||||
convolver.buffer = audioBuffer;
|
||||
}, 'Set buffer a second time').throw(DOMException, 'InvalidStateError');
|
||||
}, 'Set buffer a second time').notThrow();
|
||||
|
||||
should(() => {
|
||||
convolver.buffer = null;
|
||||
|
@ -39,8 +39,8 @@
|
|||
|
||||
should(() => {
|
||||
convolver.buffer = audioBuffer;
|
||||
}, 'Set buffer to non-null to verify to throw an error')
|
||||
.throw(DOMException, 'InvalidStateError');
|
||||
}, 'Set buffer to non-null to verify it is set')
|
||||
.notThrow();
|
||||
|
||||
task.done();
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for WebVTT rendering, align:middle</title>
|
||||
<title>Reference for WebVTT rendering, align:center</title>
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="reftest-wait">
|
||||
<title>WebVTT rendering, align:middle</title>
|
||||
<link rel="match" href="align_middle-ref.html">
|
||||
<title>WebVTT rendering, align:center</title>
|
||||
<link rel="match" href="align_center-ref.html">
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
||||
|
@ -14,7 +14,7 @@ body { margin:0 }
|
|||
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
|
||||
<source src="/media/white.webm" type="video/webm">
|
||||
<source src="/media/white.mp4" type="video/mp4">
|
||||
<track src="support/align_middle.vtt">
|
||||
<track src="support/align_center.vtt">
|
||||
<script>
|
||||
document.getElementsByTagName('track')[0].track.mode = 'showing';
|
||||
</script>
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for WebVTT rendering, align:middle, position:50%</title>
|
||||
<title>Reference for WebVTT rendering, align:center, position:50%</title>
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="reftest-wait">
|
||||
<title>WebVTT rendering, align:middle, position:50%</title>
|
||||
<link rel="match" href="align_middle_position_50-ref.html">
|
||||
<title>WebVTT rendering, align:center, position:50%</title>
|
||||
<link rel="match" href="align_center_position_50-ref.html">
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
||||
|
@ -14,7 +14,7 @@ body { margin:0 }
|
|||
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
|
||||
<source src="/media/white.webm" type="video/webm">
|
||||
<source src="/media/white.mp4" type="video/mp4">
|
||||
<track src="support/align_middle_position_50.vtt">
|
||||
<track src="support/align_center_position_50.vtt">
|
||||
<script>
|
||||
document.getElementsByTagName('track')[0].track.mode = 'showing';
|
||||
</script>
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for WebVTT rendering, align:middle, position greater than 50%</title>
|
||||
<title>Reference for WebVTT rendering, align:center, position greater than 50%</title>
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="reftest-wait">
|
||||
<title>WebVTT rendering, align:middle, position greater than 50%</title>
|
||||
<link rel="match" href="align_middle_position_gt_50-ref.html">
|
||||
<title>WebVTT rendering, align:center, position greater than 50%</title>
|
||||
<link rel="match" href="align_center_position_gt_50-ref.html">
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
||||
|
@ -14,7 +14,7 @@ body { margin:0 }
|
|||
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
|
||||
<source src="/media/white.webm" type="video/webm">
|
||||
<source src="/media/white.mp4" type="video/mp4">
|
||||
<track src="support/align_middle_position_gt_50.vtt">
|
||||
<track src="support/align_center_position_gt_50.vtt">
|
||||
<script>
|
||||
document.getElementsByTagName('track')[0].track.mode = 'showing';
|
||||
</script>
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for WebVTT rendering, align:middle, position less than 50%</title>
|
||||
<title>Reference for WebVTT rendering, align:center, position less than 50%</title>
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="reftest-wait">
|
||||
<title>WebVTT rendering, align:middle, position less than 50%</title>
|
||||
<link rel="match" href="align_middle_position_lt_50-ref.html">
|
||||
<title>WebVTT rendering, align:center, position less than 50%</title>
|
||||
<link rel="match" href="align_center_position_lt_50-ref.html">
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|
||||
|
@ -14,7 +14,7 @@ body { margin:0 }
|
|||
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
|
||||
<source src="/media/white.webm" type="video/webm">
|
||||
<source src="/media/white.mp4" type="video/mp4">
|
||||
<track src="support/align_middle_position_lt_50.vtt">
|
||||
<track src="support/align_center_position_lt_50.vtt">
|
||||
<script>
|
||||
document.getElementsByTagName('track')[0].track.mode = 'showing';
|
||||
</script>
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for WebVTT rendering, align:middle, position less than 50%, size greater than maximum size</title>
|
||||
<title>Reference for WebVTT rendering, align:center, position less than 50%, size greater than maximum size</title>
|
||||
<style>
|
||||
html { overflow:hidden }
|
||||
body { margin:0 }
|