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 -->
This commit is contained in:
bors-servo 2018-10-03 04:02:17 -04:00 committed by GitHub
commit bbef671276
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
153 changed files with 3075 additions and 719 deletions

File diff suppressed because it is too large Load diff

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,2 @@
[white-space-empty-text-sibling.html]
expected: FAIL

View file

@ -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

View file

@ -1,5 +1,4 @@
[fetch-in-iframe.html]
expected: CRASH
[Untitled]
expected: FAIL

View file

@ -1,4 +0,0 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -1,4 +0,0 @@
[traverse_the_history_2.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -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

View file

@ -0,0 +1,4 @@
[form-margin-quirk.html]
[form margin quirk]
expected: FAIL

View file

@ -0,0 +1,4 @@
[image-decode-with-quick-attach-svg.tentative.html]
[SVGImageElement.prototype.decode(), attach to DOM before promise resolves.]
expected: FAIL

View file

@ -11,5 +11,5 @@
expected: TIMEOUT
[picture: source (max-width:500px) valid image, img valid image, resize to narrow]
expected: FAIL
expected: TIMEOUT

View file

@ -1,10 +0,0 @@
[non-active-document.html]
[DOMParser]
expected: FAIL
[createHTMLDocument]
expected: FAIL
[<template>]
expected: FAIL

View file

@ -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

View file

@ -1,4 +0,0 @@
[DOMContentLoaded-defer.html]
[The end: DOMContentLoaded and defer scripts]
expected: FAIL

View file

@ -1,4 +0,0 @@
[aborted-parser.window.html]
[document.open() after parser is aborted]
expected: FAIL

View file

@ -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

View 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

View file

@ -0,0 +1,5 @@
[multiple-headers-and-values.html]
expected: ERROR
[Image uses the last recognized Referrer-Policy header value]
expected: NOTRUN

View file

@ -0,0 +1,5 @@
[multiple-headers-combined.html]
expected: ERROR
[Image uses the last recognized Referrer-Policy header value]
expected: NOTRUN

View file

@ -0,0 +1,5 @@
[multiple-headers-one-invalid.html]
expected: ERROR
[Referrer policy header parsing fails if one header is invalid]
expected: NOTRUN

View file

@ -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

View file

@ -0,0 +1,5 @@
[multiple-headers.html]
expected: ERROR
[Image uses the last recognized Referrer-Policy header]
expected: NOTRUN

View file

@ -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

View file

@ -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

View file

@ -1,4 +1,5 @@
[sharedworker-in-worker.html]
expected: ERROR
[Base URL in workers: new SharedWorker()]
expected: FAIL

View file

@ -1,6 +1,6 @@
version: 1
policy:
pullRequests: collaborators
pullRequests: public
tasks:
$flattenDeep:
- $if: tasks_for == "github-push"

View file

@ -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:

View file

@ -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>

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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>

View file

@ -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>

View file

@ -0,0 +1,3 @@
<!DOCTYPE html>
<p>There should be a space between "Two" and "words".</p>
Two words

View file

@ -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>

View file

@ -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>

View file

@ -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>&#x05D0;</div>

View file

@ -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>&#xFEFF;

View file

@ -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>

View 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

View file

@ -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:

View file

@ -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

View file

@ -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>

View file

@ -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();

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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;
};

View file

@ -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>

View file

@ -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>

View file

@ -0,0 +1,2 @@
Referrer-Policy: no-referrer
Referrer-Policy: no-referrer,origin

View file

@ -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>

View file

@ -0,0 +1 @@
Referrer-Policy: no-referrer, origin

View file

@ -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>

View file

@ -0,0 +1,2 @@
Referrer-Policy: origin
Referrer-Policy: origin no-referrer

View file

@ -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>

View file

@ -0,0 +1,2 @@
Referrer-Policy: no-referrer
Referrer-Policy: origin,not-a-valid-token

View file

@ -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>

View file

@ -0,0 +1,2 @@
Referrer-Policy: no-referrer
Referrer-Policy: origin

View file

@ -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 objects “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 ()
}
};
};
//@}
}());

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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';

View file

@ -6,4 +6,4 @@ cd $WPT_ROOT
mkdir -p ~/meta
./wpt manifest -p ~/meta/MANIFEST.json
./wpt lint
./wpt lint --all

View file

@ -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

View file

@ -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.

View file

@ -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,

View file

@ -24,7 +24,6 @@ module global scope.
product_list = ["chrome",
"chrome_android",
"chrome_webdriver",
"edge",
"edge_webdriver",
"fennec",

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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()

View file

@ -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()

View file

@ -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"},

View file

@ -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:

View file

@ -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)

View file

@ -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 => {

View file

@ -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>

View file

@ -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>

View file

@ -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();
});

View file

@ -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 }

View file

@ -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>

View file

@ -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 }

View file

@ -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>

View file

@ -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 }

View file

@ -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>

View file

@ -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 }

View file

@ -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>

View file

@ -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 }

Some files were not shown because too many files have changed in this diff Show more