Update web-platform-tests to revision 78f764c05c229883e87ad135c7153051a66e2851

This commit is contained in:
WPT Sync Bot 2019-03-06 20:32:15 -05:00
parent 55347aa39f
commit bf84a079f9
1983 changed files with 58006 additions and 31437 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,19 @@
[global-immutable-prototype.any.worker.html]
[Setting to a different prototype]
expected: FAIL
[global-immutable-prototype.any.sharedworker.html]
[Immutability of the global prototype chain]
expected: FAIL
[global-immutable-prototype.any.serviceworker.html]
[Immutability of the global prototype chain]
expected: FAIL
[global-immutable-prototype.any.html]
[Setting to a different prototype]
expected: FAIL

View file

@ -0,0 +1,2 @@
[flex-basis-010.html]
expected: FAIL

View file

@ -323,3 +323,15 @@
[Matching font-style: 'italic' should prefer 'oblique 20deg' over 'oblique 30deg 60deg']
expected: FAIL
[Matching font-style: 'oblique 10deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
expected: FAIL
[Matching font-weight: '399' should prefer '500 501' over '502 510']
expected: FAIL
[Matching font-stretch: '100%' should prefer '100%' over '110% 120%']
expected: FAIL
[Matching font-style: 'oblique -10deg' should prefer 'oblique -50deg -40deg' over 'italic']
expected: FAIL

View file

@ -0,0 +1,2 @@
[stacking-context-001.html]
expected: TIMEOUT

View file

@ -3,3 +3,18 @@
[customElements.define must upgrade elements in the shadow-including tree order]
expected: FAIL
[customElements.define must get "observedAttributes" property on the constructor prototype when "attributeChangedCallback" is present]
expected: FAIL
[customElements.define must rethrow an exception thrown while retrieving Symbol.iterator on disabledFeatures]
expected: FAIL
[customElements.define must rethrow an exception thrown while getting disabledFeatures on the constructor prototype]
expected: FAIL
[customElements.define must rethrow an exception thrown while iterating over disabledFeatures to sequence<DOMString>]
expected: FAIL
[customElements.define must rethrow an exception thrown while converting the value of disabledFeatures to sequence<DOMString>]
expected: FAIL

View file

@ -0,0 +1,2 @@
[HTMLMediaElement.html]
expected: CRASH

View file

@ -0,0 +1,7 @@
[HTMLMetaElement.html]
[httpEquiv on HTMLMetaElement must enqueue an attributeChanged reaction when adding a new attribute]
expected: FAIL
[httpEquiv on HTMLMetaElement must enqueue an attributeChanged reaction when replacing an existing attribute]
expected: FAIL

View file

@ -0,0 +1,4 @@
[Event-dispatch-listener-order.window.html]
[Event-dispatch-listener-order]
expected: FAIL

View file

@ -0,0 +1,109 @@
[Document-createEvent.https.html]
[createEvent('TextEvent') should be initialized correctly.]
expected: FAIL
[compositionevent should be an alias for CompositionEvent.]
expected: FAIL
[createEvent('DRAGEVENT') should be initialized correctly.]
expected: FAIL
[DEVICEMOTIONEVENT should be an alias for DeviceMotionEvent.]
expected: FAIL
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "CloseEvent"]
expected: FAIL
[createEvent('DeviceMotionEvent') should be initialized correctly.]
expected: FAIL
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "ProgressEvent"]
expected: FAIL
[TEXTEVENT should be an alias for CompositionEvent.]
expected: FAIL
[createEvent('compositionevent') should be initialized correctly.]
expected: FAIL
[devicemotionevent should be an alias for DeviceMotionEvent.]
expected: FAIL
[createEvent('DeviceOrientationEvent') should be initialized correctly.]
expected: FAIL
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "PageTransitionEvent"]
expected: FAIL
[DRAGEVENT should be an alias for DragEvent.]
expected: FAIL
[TextEvent should be an alias for CompositionEvent.]
expected: FAIL
[createEvent('COMPOSITIONEVENT') should be initialized correctly.]
expected: FAIL
[DEVICEORIENTATIONEVENT should be an alias for DeviceOrientationEvent.]
expected: FAIL
[createEvent('dragevent') should be initialized correctly.]
expected: FAIL
[createEvent('textevent') should be initialized correctly.]
expected: FAIL
[CompositionEvent should be an alias for CompositionEvent.]
expected: FAIL
[createEvent('DEVICEMOTIONEVENT') should be initialized correctly.]
expected: FAIL
[createEvent('devicemotionevent') should be initialized correctly.]
expected: FAIL
[DragEvent should be an alias for DragEvent.]
expected: FAIL
[dragevent should be an alias for DragEvent.]
expected: FAIL
[textevent should be an alias for CompositionEvent.]
expected: FAIL
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "PopStateEvent"]
expected: FAIL
[createEvent('CompositionEvent') should be initialized correctly.]
expected: FAIL
[deviceorientationevent should be an alias for DeviceOrientationEvent.]
expected: FAIL
[DeviceOrientationEvent should be an alias for DeviceOrientationEvent.]
expected: FAIL
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "WebGLContextEvent"]
expected: FAIL
[createEvent('DEVICEORIENTATIONEVENT') should be initialized correctly.]
expected: FAIL
[createEvent('TEXTEVENT') should be initialized correctly.]
expected: FAIL
[createEvent('DragEvent') should be initialized correctly.]
expected: FAIL
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "ErrorEvent"]
expected: FAIL
[COMPOSITIONEVENT should be an alias for CompositionEvent.]
expected: FAIL
[createEvent('deviceorientationevent') should be initialized correctly.]
expected: FAIL
[DeviceMotionEvent should be an alias for DeviceMotionEvent.]
expected: FAIL

View file

@ -0,0 +1,2 @@
[report.tentative.https.sub.html]
expected: TIMEOUT

View file

@ -1,4 +0,0 @@
[javascript-url-abort-return-value-string.tentative.html]
[Aborting fetch for javascript:string navigation]
expected: FAIL

View file

@ -1,4 +0,0 @@
[navigation-unload-same-origin-fragment.html]
[Tests that a fragment navigation in the unload handler will not block the initial navigation]
expected: FAIL

View file

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

View file

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

View file

@ -8,3 +8,12 @@
[Integer value of 0 should not activate the feature]
expected: FAIL
[Invalid feature names should not tokenize as "noopener"]
expected: FAIL
[Integer value of 0 should not activate "noopener"]
expected: FAIL
[Feature "noopener" should be converted to ASCII lowercase]
expected: FAIL

View file

@ -0,0 +1,19 @@
[open-features-tokenization-noreferrer.html]
[Tokenizing "noreferrer" should ignore window feature separators except "," after initial "=" and before value]
expected: FAIL
[Tokenizing "noreferrer" should read characters until first window feature separator as `value`]
expected: FAIL
[After "noreferrer", tokenization should skip window features separators that are not "=" or ","]
expected: FAIL
[Integer values other than 0 should activate the feature]
expected: FAIL
[Tokenization of "noreferrer" should skip window features separators before feature]
expected: FAIL
[Feature "noreferrer" should be converted to ASCII lowercase]
expected: FAIL

View file

@ -0,0 +1,4 @@
[window-open-noreferrer.html]
[window.open() with "noreferrer" tests]
expected: FAIL

View file

@ -6783,12 +6783,6 @@
[HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
expected: PASS
[HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type]
expected: PASS
[HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type]
expected: FAIL
@ -6807,12 +6801,6 @@
[HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type]
expected: PASS
[HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type]
expected: PASS
[HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type]
expected: FAIL
@ -6831,12 +6819,6 @@
[HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type]
expected: FAIL
[HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type]
expected: PASS
[HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type]
expected: PASS
[HTMLMediaElement interface: attribute crossOrigin]
expected: FAIL
@ -6855,12 +6837,6 @@
[HTMLMediaElement interface: attribute controls]
expected: FAIL
[HTMLMediaElement interface: attribute audioTracks]
expected: PASS
[HTMLMediaElement interface: attribute videoTracks]
expected: PASS
[HTMLMapElement interface: attribute name]
expected: FAIL
@ -9375,6 +9351,27 @@
[HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" with the proper type]
expected: FAIL
[HTMLOptionElement interface: named constructor]
expected: FAIL
[HTMLOptionElement interface: named constructor prototype property]
expected: FAIL
[HTMLAudioElement interface: named constructor without 'new']
expected: FAIL
[HTMLOptionElement interface: named constructor object]
expected: FAIL
[HTMLOptionElement interface: named constructor name]
expected: FAIL
[HTMLOptionElement interface: named constructor length]
expected: FAIL
[HTMLImageElement interface: named constructor without 'new']
expected: FAIL
[interfaces.https.html?exclude=(Document|Window|HTML.*)]
[HTML IDL tests]
@ -9407,177 +9404,12 @@
[DOMStringList interface: operation contains(DOMString)]
expected: FAIL
[AudioTrackList interface: existence and properties of interface object]
expected: PASS
[AudioTrackList interface object length]
expected: PASS
[AudioTrackList interface object name]
expected: PASS
[AudioTrackList interface: existence and properties of interface prototype object]
expected: PASS
[AudioTrackList interface: existence and properties of interface prototype object's "constructor" property]
expected: PASS
[AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property]
expected: PASS
[AudioTrackList interface: attribute length]
expected: PASS
[AudioTrackList interface: operation getTrackById(DOMString)]
expected: PASS
[AudioTrackList interface: attribute onchange]
expected: PASS
[AudioTrackList interface: attribute onaddtrack]
expected: PASS
[AudioTrackList interface: attribute onremovetrack]
expected: PASS
[AudioTrack interface: existence and properties of interface object]
expected: PASS
[AudioTrack interface object length]
expected: PASS
[AudioTrack interface object name]
expected: PASS
[AudioTrack interface: existence and properties of interface prototype object]
expected: PASS
[AudioTrack interface: existence and properties of interface prototype object's "constructor" property]
expected: PASS
[AudioTrack interface: existence and properties of interface prototype object's @@unscopables property]
expected: PASS
[AudioTrack interface: attribute id]
expected: PASS
[AudioTrack interface: attribute kind]
expected: PASS
[AudioTrack interface: attribute label]
expected: PASS
[AudioTrack interface: attribute language]
expected: PASS
[AudioTrack interface: attribute enabled]
expected: PASS
[VideoTrackList interface: existence and properties of interface object]
expected: PASS
[VideoTrackList interface object length]
expected: PASS
[VideoTrackList interface object name]
expected: PASS
[VideoTrackList interface: existence and properties of interface prototype object]
expected: PASS
[VideoTrackList interface: existence and properties of interface prototype object's "constructor" property]
expected: PASS
[VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property]
expected: PASS
[VideoTrackList interface: attribute length]
expected: PASS
[VideoTrackList interface: operation getTrackById(DOMString)]
expected: PASS
[VideoTrackList interface: attribute selectedIndex]
expected: PASS
[VideoTrackList interface: attribute onchange]
expected: PASS
[VideoTrackList interface: attribute onaddtrack]
expected: PASS
[VideoTrackList interface: attribute onremovetrack]
expected: PASS
[VideoTrack interface: existence and properties of interface object]
expected: PASS
[VideoTrack interface object length]
expected: PASS
[VideoTrack interface object name]
expected: PASS
[VideoTrack interface: existence and properties of interface prototype object]
expected: PASS
[VideoTrack interface: existence and properties of interface prototype object's "constructor" property]
expected: PASS
[VideoTrack interface: existence and properties of interface prototype object's @@unscopables property]
expected: PASS
[VideoTrack interface: attribute id]
expected: PASS
[VideoTrack interface: attribute kind]
expected: PASS
[VideoTrack interface: attribute label]
expected: PASS
[VideoTrack interface: attribute language]
expected: PASS
[VideoTrack interface: attribute selected]
expected: PASS
[TextTrack interface: attribute inBandMetadataTrackDispatchType]
expected: FAIL
[TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type]
expected: FAIL
[TrackEvent interface: existence and properties of interface object]
expected: PASS
[TrackEvent interface object length]
expected: PASS
[TrackEvent interface object name]
expected: PASS
[TrackEvent interface: existence and properties of interface prototype object]
expected: PASS
[TrackEvent interface: existence and properties of interface prototype object's "constructor" property]
expected: PASS
[TrackEvent interface: existence and properties of interface prototype object's @@unscopables property]
expected: PASS
[TrackEvent interface: attribute track]
expected: PASS
[TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})]
expected: PASS
[Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})]
expected: PASS
[TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type]
expected: PASS
[ValidityState must be primary interface of document.createElement("input").validity]
expected: FAIL

View file

@ -0,0 +1,16 @@
[table-ua-stylesheet.html]
[Computed 'display' on table should match html spec]
expected: FAIL
[Computed 'box-sizing' on table should match html spec]
expected: FAIL
[Computed 'border-collapse' on table should match html spec]
expected: FAIL
[Computed 'text-indent' on table should match html spec]
expected: FAIL
[Computed 'border-spacing' on table should match html spec]
expected: FAIL

View file

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

View file

@ -30,3 +30,6 @@
[Option constructor does not set dirtiness (so, manipulating the selected content attribute still updates the selected IDL attribute)]
expected: FAIL
[Prototype of object created with named constructor]
expected: FAIL

View file

@ -1,4 +0,0 @@
[activation-behavior.window.html]
[<a> that is not connected should be followed]
expected: FAIL

View file

@ -1,2 +0,0 @@
[script-onerror-insertion-point-2.html]
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[activation-transfer-without-click.tentative.html]
[User activation transfer from inactive frame]
expected: FAIL

View file

@ -0,0 +1,13 @@
[Worker-messageport.html]
[Test sending message to a worker on a port.]
expected: FAIL
[Test sending messages to workers with no port.]
expected: FAIL
[Test getting messages from a worker on a port.]
expected: FAIL
[Test sending many messages to workers using ports.]
expected: FAIL

View file

@ -0,0 +1,22 @@
[Worker-multi-port.html]
[Test postMessage without sequence throws exception]
expected: FAIL
[Test postMessage on channel with previous failed postMessage calls.]
expected: FAIL
[Test postMessage with no port.]
expected: FAIL
[Test postMessage with two ports.]
expected: FAIL
[Test postMessage with no ports and empty array.]
expected: FAIL
[Test postMessage with null ports throws exception.]
expected: FAIL
[Test postMessage with incorrect ports throws exception]
expected: FAIL

View file

@ -0,0 +1,4 @@
[WorkerGlobalScope-close.html]
[Test sending a message after closing.]
expected: FAIL

View file

@ -1,4 +1,5 @@
[005.html]
expected: ERROR
[dedicated worker in shared worker in dedicated worker]
expected: FAIL

View file

@ -183,7 +183,7 @@ jobs:
- template: tools/ci/azure/install_certs.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- script: python ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --test-types reftest testharness --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-tbpl - --log-tbpl-level info --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json edge_webdriver
- script: python ./wpt run --no-manifest-update --no-fail-on-unexpected --install-fonts --test-types reftest testharness --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-tbpl - --log-tbpl-level info --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json edge_webdriver
displayName: 'Run tests'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'

View file

@ -89,6 +89,7 @@ tasks:
--this-chunk=${chunk[1]}
--total-chunks=${chunk[2]};
- $if: tasks_for == "github-pull-request"
# PR tasks that run the tests in various configurations
then:
# Taskcluster responds to a number of events issued by the GitHub API
# which should not trigger re-validation.
@ -166,3 +167,66 @@ tasks:
--
--channel=${browser.channel}
${operation.extra_args};
- $map:
- name: lint
description: >-
Lint for wpt-specific requirements
script: tools/ci/ci_lint.sh
conditions:
push
pull-request
each(operation):
# Note: jsone doesn't short-circuit evaluation so all parts of the conditional are evaluated
# Accessing properties using the [] notation allows them to evaluate as null in case they're undefined
# TODO: Allow running pushes on branches other than master
- $if: ("push" in operation.conditions && tasks_for == "github-push" && event['ref'] == "refs/heads/master") || ("pull-request" in operation.conditions && tasks_for == "github-pull-request" && event['action'] in ['opened', 'reopened', 'synchronize'])
then:
$let:
checkout_ref:
$if: tasks_for == "github-push"
then:
${event.ref}
else:
refs/pull/${event.number}/merge
in:
taskId: {$eval: 'as_slugid(operation.name)'}
taskGroupId: {$eval: 'as_slugid("task group")'}
created: {$fromNow: ''}
deadline: {$fromNow: '24 hours'}
provisionerId: aws-provisioner-v1
workerType:
$if: event.repository.full_name == 'web-platform-tests/wpt'
then:
wpt-docker-worker
else:
github-worker
metadata:
name: ${operation.name}
description: ${operation.description}
owner: ${event.sender.login}@users.noreply.github.com
source: ${event.repository.url}
payload:
image: harjgam/web-platform-tests:0.29
maxRunTime: 7200
artifacts:
public/results:
path: /home/test/artifacts
type: directory
# Fetch the GitHub-provided merge commit (rather than the pull
# request branch) so that the tasks simulate the behavior of the
# submitted patch after it is merged. Using the merge commit also
# simplifies detection of modified files because the first parent
# of the merge commit can consistently be used to summarize the
# changes.
command:
- /bin/bash
- --login
- -c
- set -ex;
~/start.sh
${event.repository.clone_url}
${checkout_ref}
FETCH_HEAD
none;
cd ~/web-platform-tests;
${operation.script};

View file

@ -28,11 +28,6 @@ matrix:
secure: "EljDx50oNpDLs7rzwIv+z1PxIgB5KMnx1W0OQkpNvltR0rBW9g/aQaE+Z/c8M/sPqN1bkvKPybKzGKjb6j9Dw3/EJhah4SskH78r3yMAe2DU/ngxqqjjfXcCc2t5MKxzHAILTAxqScPj2z+lG1jeK1Z+K5hTbSP9lk+AvS0D16w="
file: $WPT_MANIFEST_FILE.gz
skip_cleanup: true
- name: "lint"
# lint is run both on master and on PRs
os: linux
python: "2.7"
env: JOB=lint SCRIPT=tools/ci/ci_lint.sh
- name: "update-built-tests.sh"
if: type = pull_request
os: linux

View file

@ -198,7 +198,7 @@
("empty", "", None),
("onlyspace", " ", None),
("space", " 100", 100),
("whitespace", "\n\t\f100", 100),
("whitespace", "\r\n\t\f100", 100),
("plus", "+100", 100),
("minus", "-100", None),
("octal", "0100", 100),
@ -235,11 +235,13 @@
for name, string, exp in cases:
code = ""
code, testing, expected = gen(name, string, exp, code)
# We need to replace \r with &#xD; because \r\n gets converted to \n in the HTML parser.
htmlString = string.replace('\r', '&#xD;')
tests.append( {
"name": "size.attributes.parse.%s" % name,
"desc": "Parsing of non-negative integers",
"testing": testing,
"canvas": 'width="%s" height="%s"' % (string, string),
"canvas": 'width="%s" height="%s"' % (htmlString, htmlString),
"code": code,
"expected": expected
} )

View file

@ -4,101 +4,79 @@
<meta name="help" href="https://w3c.github.io/IndexedDB/#inject-key-into-value">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script src="support-promises.js"></script>
<script>
indexeddb_test(
(t, db) => {
promise_test(async t => {
const db = await createDatabase(t, db => {
db.createObjectStore('store');
},
(t, db) => {
const tx = db.transaction('store', 'readwrite');
const request = tx.objectStore('store').put(
'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']);
});
const setter_called = false;
Object.defineProperty(Object.prototype, '10', {
configurable: true,
set: t.step_func((value) => { setter_called = true; }),
});
request.onerror = t.unreached_func('request should not fail');
request.onsuccess = t.step_func(() => {
const result = request.result;
assert_false(setter_called,
'Setter should not be called for key result.');
assert_true(
result.hasOwnProperty('10'),
'Result should have own-property overriding prototype setter.');
assert_equals(result[10], 'key',
'Result should have expected property.');
let setter_called = false;
Object.defineProperty(Object.prototype, '10', {
configurable: true,
set: value => { setter_called = true; },
});
t.add_cleanup(() => { delete Object.prototype['10']; });
delete Object.prototype['10'];
t.done();
});
},
'Returning keys to script should bypass prototype setters'
);
const tx = db.transaction('store', 'readwrite');
const result = await promiseForRequest(t, tx.objectStore('store').put(
'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']));
indexeddb_test(
(t, db) => {
assert_false(setter_called,
'Setter should not be called for key result.');
assert_true(result.hasOwnProperty('10'),
'Result should have own-property overriding prototype setter.');
assert_equals(result[10], 'key',
'Result should have expected property.');
}, 'Returning keys to script should bypass prototype setters');
promise_test(async t => {
const db = await createDatabase(t, db => {
db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'});
},
(t, db) => {
const tx = db.transaction('store', 'readwrite');
tx.objectStore('store').put({});
const request = tx.objectStore('store').get(1);
});
const setter_called = false;
Object.defineProperty(Object.prototype, 'id', {
configurable: true,
set: t.step_func(function(value) { setter_called = true; }),
});
request.onerror = t.unreached_func('request should not fail');
request.onsuccess = t.step_func(function() {
const result = request.result;
assert_false(setter_called,
'Setter should not be called for key result.');
assert_true(
result.hasOwnProperty('id'),
'Result should have own-property overriding prototype setter.');
assert_equals(result.id, 1,
'Own property should match primary key generator value');
let setter_called = false;
Object.defineProperty(Object.prototype, 'id', {
configurable: true,
set: value => { setter_called = true; },
});
t.add_cleanup(() => { delete Object.prototype['id']; });
delete Object.prototype['id'];
t.done();
});
},
'Returning values to script should bypass prototype setters'
);
const tx = db.transaction('store', 'readwrite');
tx.objectStore('store').put({});
const result = await promiseForRequest(t, tx.objectStore('store').get(1));
indexeddb_test(
(t, db) => {
assert_false(setter_called,
'Setter should not be called for key result.');
assert_true(result.hasOwnProperty('id'),
'Result should have own-property overriding prototype setter.');
assert_equals(result.id, 1,
'Own property should match primary key generator value');
}, 'Returning values to script should bypass prototype setters');
promise_test(async t => {
const db = await createDatabase(t, db => {
db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.c'});
},
(t, db) => {
const tx = db.transaction('store', 'readwrite');
tx.objectStore('store').put({});
const request = tx.objectStore('store').get(1);
});
Object.prototype.a = {b: {c: 'on proto'}};
Object.prototype.a = {b: {c: 'on proto'}};
t.add_cleanup(() => { delete Object.prototype.a; });
request.onerror = t.unreached_func('request should not fail');
request.onsuccess = t.step_func(function() {
const result = request.result;
assert_true(result.hasOwnProperty('a'),
'Result should have own-properties overriding prototype.');
assert_true(result.a.hasOwnProperty('b'),
'Result should have own-properties overriding prototype.');
assert_true(result.a.b.hasOwnProperty('c'),
'Result should have own-properties overriding prototype.');
assert_equals(result.a.b.c, 1,
'Own property should match primary key generator value');
assert_equals(Object.prototype.a.b.c, 'on proto',
'Prototype should not be modified');
t.done();
});
},
'Returning values to script should bypass prototype chain'
);
const tx = db.transaction('store', 'readwrite');
tx.objectStore('store').put({});
const result = await promiseForRequest(t, tx.objectStore('store').get(1));
assert_true(result.hasOwnProperty('a'),
'Result should have own-properties overriding prototype.');
assert_true(result.a.hasOwnProperty('b'),
'Result should have own-properties overriding prototype.');
assert_true(result.a.b.hasOwnProperty('c'),
'Result should have own-properties overriding prototype.');
assert_equals(result.a.b.c, 1,
'Own property should match primary key generator value');
assert_equals(Object.prototype.a.b.c, 'on proto',
'Prototype should not be modified');
}, 'Returning values to script should bypass prototype chain');
</script>

View file

@ -0,0 +1,25 @@
// META: global=window,worker
// META: title=Immutability of the global prototype chain
const objects = [];
setup(() => {
for (let object = self; object; object = Object.getPrototypeOf(object)) {
objects.push(object);
}
});
test(() => {
for (const object of objects) {
assert_throws(new TypeError(), () => {
Object.setPrototypeOf(object, {});
});
}
}, "Setting to a different prototype");
test(() => {
for (const object of objects) {
const expected = Object.getPrototypeOf(object);
Object.setPrototypeOf(object, expected);
assert_equals(Object.getPrototypeOf(object), expected);
}
}, "Setting to the same prototype");

0
tests/wpt/web-platform-tests/acid/acid2/reference.html Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid2/reference.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before After
Before After

0
tests/wpt/web-platform-tests/acid/acid2/test.html Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/empty.css Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/empty.html Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/empty.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 260 B

After

Width:  |  Height:  |  Size: 260 B

Before After
Before After

0
tests/wpt/web-platform-tests/acid/acid3/empty.txt Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/empty.xml Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/favicon.ico Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/reference.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before After
Before After

View file

0
tests/wpt/web-platform-tests/acid/acid3/support-a.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

0
tests/wpt/web-platform-tests/acid/acid3/support-b.png Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/svg.xml Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 386 B

After

Width:  |  Height:  |  Size: 386 B

Before After
Before After

0
tests/wpt/web-platform-tests/acid/acid3/xhtml.1 Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/xhtml.2 Executable file → Normal file
View file

0
tests/wpt/web-platform-tests/acid/acid3/xhtml.3 Executable file → Normal file
View file

View file

@ -48,7 +48,11 @@ async_test(t => {
animation.play();
assert_equals(data, '0.4');
waitForAsyncAnimationFrames(1).then(t.step_func_done(() => {
// wait until local times are synced back to the main thread.
waitForAnimationFrameWithCondition(_ => {
return getComputedStyle(target).opacity != '1';
}).then(t.step_func_done(() => {
assert_equals(getComputedStyle(target).opacity, '0.5');
}));
});

View file

@ -16,7 +16,10 @@
const animation = new WorkletAnimation('constant_time', effect);
animation.play();
await waitForAsyncAnimationFrames(1);
// wait until local times are synced back to the main thread.
await waitForAnimationFrameWithCondition(_ => {
return getComputedStyle(target).opacity != '1';
});
assert_equals(getComputedStyle(target).opacity, "0.5");
}, "Simple worklet animation should output values at specified local time");
</script>

View file

@ -29,7 +29,10 @@
const animation = new WorkletAnimation('test_animator', effect, document.timeline, options);
animation.play();
await waitForAsyncAnimationFrames(1);
// wait until local times are synced back to the main thread.
await waitForAnimationFrameWithCondition(_ => {
return getComputedStyle(target).opacity != '1';
});
assert_equals(getComputedStyle(target).opacity, "0.5");
}, "Animator should be able to use options to update the animation");
</script>

View file

@ -16,6 +16,19 @@ function registerConstantLocalTimeAnimator(localTime) {
`);
}
// TODO(majidvp): This is used to sidestep a bug where we currently animate
// with currentTime=NaN when scroll timeline is not active. Remove once we fix
// http://crbug.com/937456
function registerPassthroughExceptNaNAnimator() {
return runInAnimationWorklet(`
registerAnimator('passthrough_except_nan', class {
animate(currentTime, effect) {
if (Number.isNaN(currentTime)) return;
effect.localTime = currentTime;
}
});
`);
}
function runInAnimationWorklet(code) {
return CSS.animationWorklet.addModule(

View file

@ -33,7 +33,11 @@ runInAnimationWorklet(
const effect = new KeyframeEffect(target, [{ opacity: 0 }], { duration: 1000 });
const animation = new WorkletAnimation('iframe_animator', effect);
animation.play();
waitForAnimationFrames(2).then(_ => {
// wait until local times are synced back to the main thread.
waitForAnimationFrameWithCondition(_ => {
return getComputedStyle(target).opacity != '1';
}).then(_ => {
window.parent.postMessage(getComputedStyle(target).opacity, '*');
});
});

View file

@ -57,14 +57,15 @@ function createAndPlayTestAnimation(elements, timeline_orientation) {
timeRange: 1000,
orientation: timeline_orientation
});
const animation = new WorkletAnimation('passthrough', effect, timeline);
const animation = new WorkletAnimation('passthrough_except_nan', effect, timeline);
animation.play();
return animation;
}
setup(setupAndRegisterTests, {explicit_done: true});
function setupAndRegisterTests() {
registerPassthroughAnimator().then(() => {
registerPassthroughExceptNaNAnimator().then(() => {
// Note that block horizontal-tb is tested implicitly in the basic
// ScrollTimeline tests (as it is the default).
async_test(
@ -90,14 +91,14 @@ function setupAndRegisterTests() {
function block_vertical_lr(t) {
const elements = createTestDOM(true, 'vertical-lr', 'ltr');
createAndPlayTestAnimation(elements, 'block');
const animation = createAndPlayTestAnimation(elements, 'block');
// Move the scroller to the 25% point.
const maxScroll =
elements.scroller.scrollWidth - elements.scroller.clientWidth;
elements.scroller.scrollLeft = 0.25 * maxScroll;
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
assert_equals(
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
}));
@ -105,7 +106,7 @@ function block_vertical_lr(t) {
function block_vertical_rl(t) {
const elements = createTestDOM(true, 'vertical-rl', 'ltr');
createAndPlayTestAnimation(elements, 'block');
const animation = createAndPlayTestAnimation(elements, 'block');
// Move the scroller to the 75% point. Since it is vertical-rl, this is
// equivalent to the 25% point for the ScrollTimeline.
@ -113,7 +114,7 @@ function block_vertical_rl(t) {
elements.scroller.scrollWidth - elements.scroller.clientWidth;
elements.scroller.scrollLeft = 0.75 * maxScroll;
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
assert_equals(
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
}));
@ -121,7 +122,7 @@ function block_vertical_rl(t) {
function inline_horizontal_tb_rtl(t) {
const elements = createTestDOM(true, 'horizontal-tb', 'rtl');
createAndPlayTestAnimation(elements, 'inline');
const animation = createAndPlayTestAnimation(elements, 'inline');
// Move the scroller to the 75% point. Since it is direction: rtl, this is
// equivalent to the 25% point for the ScrollTimeline.
@ -129,7 +130,7 @@ function inline_horizontal_tb_rtl(t) {
elements.scroller.scrollWidth - elements.scroller.clientWidth;
elements.scroller.scrollLeft = 0.75 * maxScroll;
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
assert_equals(
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
}));
@ -137,14 +138,14 @@ function inline_horizontal_tb_rtl(t) {
function inline_vertical_writing_mode_ltr(t) {
const elements = createTestDOM(false, 'vertical-lr', 'ltr');
createAndPlayTestAnimation(elements, 'inline');
const animation = createAndPlayTestAnimation(elements, 'inline');
// Move the scroller to the 25% point.
const maxScroll =
elements.scroller.scrollHeight - elements.scroller.clientHeight;
elements.scroller.scrollTop = 0.25 * maxScroll;
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
assert_equals(
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
}));
@ -152,7 +153,7 @@ function inline_vertical_writing_mode_ltr(t) {
function inline_vertical_writing_mode_rtl(t) {
const elements = createTestDOM(false, 'vertical-lr', 'rtl');
createAndPlayTestAnimation(elements, 'inline');
const animation = createAndPlayTestAnimation(elements, 'inline');
// Move the scroller to the 75% point. Since this is a vertical writing mode
// and direction: rtl, this is 25% of the ScrollTimeline currentTime.
@ -160,7 +161,7 @@ function inline_vertical_writing_mode_rtl(t) {
elements.scroller.scrollHeight - elements.scroller.clientHeight;
elements.scroller.scrollTop = 0.75 * maxScroll;
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
assert_equals(
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
}));

View file

@ -0,0 +1,74 @@
<html class="reftest-wait">
<title>Scroll timeline with WorkletAnimation and transition from display:none to display:block</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Scroll timeline should properly handle going from display:none to display:block">
<link rel="match" href="worklet-animation-with-scroll-timeline-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
<script src="common.js"></script>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
#scroller {
overflow: auto;
height: 100px;
width: 100px;
}
.removed {
display: none;
}
#contents {
height: 1000px;
width: 100%;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<div id="scroller">
<div id="contents"></div>
</div>
<script>
registerPassthroughAnimator().then(()=>{
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
[
{ transform: 'translateY(0)', opacity: 1 },
{ transform: 'translateY(200px)', opacity: 0 }
], {
duration: 1000,
}
);
const scroller = document.getElementById('scroller');
scroller.classList.add('removed');
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
const animation = new WorkletAnimation('passthrough', effect, timeline);
animation.play();
waitForAsyncAnimationFrames(1).then(_ => {
scroller.classList.remove('removed');
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
waitForAsyncAnimationFrames(1).then(_ => {
takeScreenshot();
});
});
});
</script>

View file

@ -0,0 +1,43 @@
<!DOCTYPE html>
<title>Scroll timeline with WorkletAnimation using a scroller with overflow hidden</title>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
transform: translate(0, 100px);
opacity: 0.5;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
#scroller {
overflow: hidden;
height: 100px;
width: 100px;
}
#contents {
height: 1000px;
width: 100%;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<div id="scroller">
<div id="contents"></div>
</div>
<script>
window.addEventListener('load', function() {
// Move the scroller to halfway.
const scroller = document.getElementById("scroller");
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
});
</script>

View file

@ -0,0 +1,68 @@
<html class="reftest-wait">
<title>Scroll timeline with WorkletAnimation using a scroller with overflow hidden</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Worklet animation correctly updates values when using a overflow: hidden on the scroller being used as the source for the ScrollTimeline">
<link rel="match" href="worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
<script src="common.js"></script>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
#scroller {
overflow: hidden;
height: 100px;
width: 100px;
}
#contents {
height: 1000px;
width: 100%;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<div id="scroller">
<div id="contents"></div>
</div>
<script>
registerPassthroughAnimator().then(_ => {
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
[
{transform: 'translateY(0)', opacity: 1},
{transform: 'translateY(200px)', opacity: 0}
], {
duration: 1000,
}
);
const scroller = document.getElementById('scroller');
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
const animation = new WorkletAnimation('passthrough', effect, timeline);
animation.play();
// Move the scroller to the halfway point.
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
waitForAnimationFrameWithCondition(_ => {
return getComputedStyle(box).transform != 'matrix(1, 0, 0, 1, 0, 0)';
}).then(_ => {
takeScreenshot();
});
});
</script>

View file

@ -0,0 +1,45 @@
<!DOCTYPE html>
<title>Reference for Animation Worklet with scroll timeline tests</title>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
transform: translate(0, 100px);
opacity: 0.5;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
#scroller {
overflow: auto;
height: 100px;
width: 100px;
/* TODO(yigu): Rewrite the test to not rely on compositing. */
will-change: transform;
}
#contents {
height: 1000px;
width: 100%;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<div id="scroller">
<div id="contents"></div>
</div>
<script>
window.addEventListener('load', function() {
// Move the scroller to halfway.
const scroller = document.getElementById("scroller");
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
});
</script>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<title>Reference for Scroll timeline with WorkletAnimation using the root scroller</title>
<style>
html {
min-height: 100%;
min-width: 100%;
padding-bottom: 100px;
padding-right: 100px;
}
#box {
width: 100px;
height: 100px;
background-color: green;
transform: translate(0, 100px);
opacity: 0.5;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<script>
window.addEventListener('load', function() {
// Move the scroller to halfway.
const scroller = document.scrollingElement;
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
});
</script>

View file

@ -0,0 +1,62 @@
<html class="reftest-wait">
<title>Scroll timeline with WorkletAnimation using the root scroller</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Worklet animation correctly updates values when using the root scroller as the source for the ScrollTimeline">
<link rel="match" href="worklet-animation-with-scroll-timeline-root-scroller-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
<script src="common.js"></script>
<style>
html {
min-height: 100%;
min-width: 100%;
padding-bottom: 100px;
padding-right: 100px;
}
#box {
width: 100px;
height: 100px;
background-color: green;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<script>
registerPassthroughAnimator().then(()=>{
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
[
{transform: 'translateY(0)', opacity: 1},
{transform: 'translateY(200px)', opacity: 0}
], {
duration: 1000,
}
);
const scroller = document.scrollingElement;
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
const animation = new WorkletAnimation('passthrough', effect, timeline);
animation.play();
// Move the scroller to the halfway point.
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
waitForAnimationFrameWithCondition(_ => {
return getComputedStyle(box).transform != 'matrix(1, 0, 0, 1, 0, 0)';
}).then(_ => {
takeScreenshot();
});
});
</script>

View file

@ -0,0 +1,67 @@
<html class="reftest-wait">
<title>Basic use of scroll timeline with WorkletAnimation</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Should be able to use the scroll timeline to drive the worklet animation timing">
<link rel="match" href="worklet-animation-with-scroll-timeline-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
<script src="common.js"></script>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
}
#covered {
width: 100px;
height: 100px;
background-color: red;
}
#scroller {
overflow: auto;
height: 100px;
width: 100px;
}
#contents {
height: 1000px;
width: 100%;
}
</style>
<div id="box"></div>
<div id="covered"></div>
<div id="scroller">
<div id="contents"></div>
</div>
<script>
registerPassthroughAnimator().then(() => {
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
[
{ transform: 'translateY(0)', opacity: 1},
{ transform: 'translateY(200px)', opacity: 0}
], {
duration: 1000,
}
);
const scroller = document.getElementById('scroller');
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
const animation = new WorkletAnimation('passthrough', effect, timeline);
animation.play();
// Move the scroller to the halfway point.
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
waitForAsyncAnimationFrames(1).then(_ => {
takeScreenshot();
});
});
</script>

View file

@ -1,44 +0,0 @@
<!doctype html>
<meta charset=utf-8>
<title>Test setSinkId behavior </title>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
"use strict";
const audio = new Audio();
promise_test(t => audio.setSinkId(""), "setSinkId on default audio output should always work");
promise_test(t => promise_rejects(t, "NotFoundError", audio.setSinkId("nonexistent_device_id")),
"setSinkId fails with NotFoundError on made up deviceid");
promise_test(async t => {
const list = await navigator.mediaDevices.enumerateDevices();
const outputDevicesList = list.filter(({kind}) => kind == "audiooutput");
assert_not_equals(outputDevicesList.length, 0,
"media device list includes at least one audio output device");
let acceptedDevices = 0;
for (const {deviceId} of outputDevicesList) {
const {deviceId} = outputDevicesList[0];
const p1 = audio.setSinkId(deviceId);
assert_equals(audio.sinkId, "", "before it resolves, setSinkId is unchanged");
try {
let r = await p1;
assert_equals(acceptedDevices, 0, "only the default sink device can be set");
acceptedDevices++;
assert_equals(r, undefined, "setSinkId resolves with undefined");
assert_equals(audio.sinkId, deviceId, "when it resolves, setSinkId updates sinkId to the requested deviceId");
r = await audio.setSinkId(deviceId);
assert_equals(r, undefined, "resetting sinkid on same current value should always work");
r = await audio.setSinkId("");
assert_equals(r, undefined, "resetting sinkid on default audio output should always work");
} catch (e) {
assert_equals(e.name, "NotAllowedError", "Non-default devices are failing with NotAllowed error");
}
}
}, "List device, setSinkId should be allowed on the default, the rest of the devices will get a NotAllowedError");
</script>

View file

@ -1,5 +1,6 @@
<html>
<title>Accept-CH-Lifetime test with same-origin iframe</title>
<meta name="timeout" content="long">
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

View file

@ -1,5 +1,6 @@
<html>
<title>Accept-CH-Lifetime test with subresource</title>
<meta name="timeout" content="long">
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

View file

@ -18,3 +18,5 @@ def main(request, response):
response.headers.set("downlink-received", request.headers.get("downlink"))
if "ect" in request.headers:
response.headers.set("ect-received", request.headers.get("ect"))
if "Sec-CH-Lang" in request.headers:
response.headers.set("lang-received", request.headers.get("Sec-CH-Lang"))

View file

@ -1,5 +1,5 @@
<html>
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect">
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect, lang">
<title>Accept-CH http-equiv insecure transport test</title>
<body>
<script src="/resources/testharness.js"></script>
@ -27,6 +27,7 @@ promise_test(t => {
assert_false(r.headers.has("rtt-received"), "rtt-received");
assert_false(r.headers.has("downlink-received"), "downlink-received");
assert_false(r.headers.has("ect-received"), "ect-received");
assert_false(r.headers.has("lang-received"), "lang-received");
});
}, "Accept-CH http-equiv test over insecure transport");

View file

@ -1,5 +1,5 @@
<html>
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect">
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect, lang">
<title>Accept-CH http-equiv cross-navigation test</title>
<body>
<script src="/resources/testharness.js"></script>
@ -39,9 +39,9 @@ promise_test(t => {
// not persisted for the origin.
window.open("resources/do_not_expect_client_hints_headers.html");
async_test(t => {
window.addEventListener('message', function(event) {
t.done();
})
window.addEventListener('message', t.step_func_done(e => {
assert_equals(e.data, 'PASS');
}));
}, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
</script>

View file

@ -1,5 +1,5 @@
<html>
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect">
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect, lang">
<title>Accept-CH http-equiv same-origin and cross-origin test</title>
<body>
<script src="/resources/testharness.js"></script>
@ -38,6 +38,8 @@ promise_test(t => {
assert_in_array(r.headers.get("ect-received"), ["slow-2g", "2g",
"3g", "4g"], 'ect-received is unexpected');
assert_true(r.headers.has("lang-received"), "lang-received");
});
}, "Same origin Accept-CH http-equiv test");
@ -52,6 +54,7 @@ promise_test(t => {
assert_false(r.headers.has("rtt-received"), "rtt-received");
assert_false(r.headers.has("downlink-received"), "downlink-received");
assert_false(r.headers.has("ect-received"), "ect-received");
assert_false(r.headers.has("lang-received"), "lang-received");
});
}, "Cross-Origin Accept-CH http-equiv test");

View file

@ -1,5 +1,6 @@
<html>
<title>Accept-CH-Lifetime test with same-origin iframe</title>
<meta name="timeout" content="long">
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

View file

@ -1,5 +1,6 @@
<html>
<title>Accept-CH-Lifetime test with subresource</title>
<meta name="timeout" content="long">
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

View file

@ -5,6 +5,14 @@
"html-aria/combobox-autocomplete-list/div-haswarn.html": "The \u201ctextbox\u201d role is unnecessary for an \u201cinput\u201d element that has no \u201clist\u201d attribute and whose type is \u201ctext\u201d.",
"html-aria/host-language/implicit-semantics-checkbox-disparity-haswarn.html": "The \u201ccheckbox\u201d role is unnecessary for element \u201cinput\u201d whose type is \u201ccheckbox\u201d.",
"html-aria/host-language/implicit-semantics-checkbox-role-haswarn.html": "The \u201ccheckbox\u201d role is unnecessary for element \u201cinput\u201d whose type is \u201ccheckbox\u201d.",
"html-aria/live-events/test-case-live-event-1-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/name-computation-general/597-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/name-computation-general/598-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/name-computation-general/599-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/name-computation-img/557-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/name-computation-img/565-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/name-computation-img/566-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-aria/properties-global-norole/properties-global-norole-aria-label-Test-string-value-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
"html-rdfa/0019-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cdiv\u201d at this point.",
"html-rdfa/0035-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
"html-rdfa/0037-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",

View file

@ -15,6 +15,36 @@
t2.done();
}));
}, "Event is fired");
async_test(function(t3) {
var observer = new ReportingObserver(function(reports, observer) {
t3.step(function() {
assert_equals(reports.length, 1);
// Ensure that the contents of the report are valid.
var base_url = "{{location[scheme]}}://{{location[host]}}/content-security-policy/"
var document_url = base_url + "reporting-api/reporting-api-sends-reports-on-violation.https.sub.html";
assert_equals(reports[0].type, "csp-violation");
assert_equals(reports[0].url, document_url);
assert_equals(reports[0].body.documentURL, document_url);
assert_equals(reports[0].body.referrer, null);
assert_equals(reports[0].body.blockedURL,
base_url + "support/fail.png");
assert_equals(reports[0].body.effectiveDirective, "img-src");
assert_equals(reports[0].body.originalPolicy,
"script-src 'self' 'unsafe-inline'; img-src 'none'; report-to csp-group");
assert_equals(reports[0].body.sourceFile, document_url);
assert_equals(reports[0].body.sample, null);
assert_equals(reports[0].body.disposition, "enforce");
assert_equals(reports[0].body.statusCode, 0);
assert_equals(reports[0].body.lineNumber, 53);
assert_equals(reports[0].body.columnNumber, 0);
});
t3.done();
});
observer.observe();
}, "Report is observable to ReportingObserver");
</script>
<img src='/content-security-policy/support/fail.png'
onload='t1.unreached_func("The image should not have loaded");'

View file

@ -38,7 +38,7 @@
span
{
background-color: yellow;
font-size: large;
font-size: larger;
}
</style>

View file

@ -374,12 +374,12 @@ test(t => {
assert_equals(animations[1].effect.target.type, '::before',
'The animation targeting the ::before pseudo-element ' +
'should be returned second');
assert_equals(animations[1].effect.target.parentElement, parent,
assert_equals(animations[1].effect.target.element, parent,
'This ::before element should be child of parent element');
assert_equals(animations[2].effect.target.type, '::after',
'The animation targeting the ::after pesudo-element ' +
'should be returned third');
assert_equals(animations[2].effect.target.parentElement, parent,
assert_equals(animations[2].effect.target.element, parent,
'This ::after element should be child of parent element');
assert_equals(animations[3].effect.target, child,
@ -388,12 +388,12 @@ test(t => {
assert_equals(animations[4].effect.target.type, '::before',
'The animation targeting the ::before pseudo-element ' +
'should be returned fifth');
assert_equals(animations[4].effect.target.parentElement, child,
assert_equals(animations[4].effect.target.element, child,
'This ::before element should be child of child element');
assert_equals(animations[5].effect.target.type, '::after',
'The animation targeting the ::after pesudo-element ' +
'should be returned last');
assert_equals(animations[5].effect.target.parentElement, child,
assert_equals(animations[5].effect.target.element, child,
'This ::after element should be child of child element');
}, '{ subtree: true } on an element with a child returns animations from the'
+ ' element, its pseudo-elements, its child and its child pseudo-elements');

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Flexbox Test: Indefinite % flex-basis should cause height to be ignored</title>
<link rel="author" title="Google LLC" href="https://www.google.com">
<link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property">
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
<style>
#container {
background-color: red;
display: flex;
width: 100px;
flex-direction: column;
}
#item {
flex: 0 0 0%;
height: 500px;
background-color: red;
}
#child {
height: 100px;
background-color: green;
}
</style>
<body>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="container">
<div id="item">
<div id="child"></div>
</div>
</div>
</body>

View file

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<title>CSS Flexbox: min-height: auto with nested flexboxes</title>
<link rel="author" title="Google LLC" href="https://www.google.com/" />
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto" />
<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=933931" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<style>
.outer {
display: flex;
flex-direction: column;
height: 20px;
width: 100px;
background: red;
}
.middle {
display: flex;
flex-direction: column;
background: green;
}
.inner {
display: flex;
flex-direction: column;
}
.tall {
width: 50px;
height: 100px;
background: green;
}
</style>
<body>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="outer">
<div class="middle">
<div class="inner">
<div class="tall"></div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<link rel="author" title="Google LLC" href="http://www.google.com" />
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing" />
<title>css-flexbox: Tests that we size items in a wrapping column flexbox as fit-content</title>
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="The flexbox here should have one flex line, 100px by 100px. The flex items overflow but are transparent." />
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- This makes sure that we only see green if the flex items are sized correctly -->
<div style="position: absolute; width: 100px; height: 100px; background: green;"></div>
<div style="display: flex; flex-direction: column; flex-wrap: wrap; width: 200px; height: 100px; line-height: 20px; align-content: flex-start;">
<div style="background-color: red; height: 100px; max-width: 50%; align-self: center;">
<!-- These zero-height divs give the flex item a min-content width of
50px and a max-content width of 250px -->
<div style="width: 50px; display: inline-block;"></div>
<div style="width: 50px; display: inline-block;"></div>
<div style="width: 50px; display: inline-block;"></div>
<div style="width: 50px; display: inline-block;"></div>
<div style="width: 50px; display: inline-block;"></div>
</div>
</div>

View file

@ -1,9 +0,0 @@
<title>In quirks mode a flex item should resolve its percentage height against its first ancestor with a defined height.</title>
<link rel="help" href="https://quirks.spec.whatwg.org/#the-percentage-height-calculation-quirk">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<p style="margin-top: 1em;">Test passes if there is a filled green square.</p>
<div style="width: 200px; height: 200px;">
<div style="display: flex;">
<div style="width: 50%; height: 50%; background: green;"></div>
</div>
</div>

View file

@ -0,0 +1,17 @@
<!-- quirks mode -->
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#the-height-property">
<meta name="assert" content="The percentage height resolution quirk isn't applied to flexboxes.">
<p>There should be a green square to the left of a blue square, and no red.</p>
<div id="container" style="width:200px; height:456px;">
<div style="display:flex; background:blue;" data-expected-height="100">
<img style="width:100px; height: 50%;" src="support/1x1-green.png" data-expected-height="100">
<div style="width: 50px; height: 100%; background: red;" data-expected-height="0"></div>
</div>
</div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<script>
checkLayout("#container");
</script>

View file

@ -0,0 +1,23 @@
<!doctype html>
<title>Testing font-style angle's unit type consideration</title>
<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-style-prop" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body {
font-style: oblique 0.785398165rad;
}
</style>
<script>
var test_description = "font-style angle's unit type must be considered";
promise_test(
t => {
return new Promise(test => addEventListener('load', () => test()))
.then(test => assert_equals(getComputedStyle(document.querySelector("body"))['font-style'], "oblique 45deg", "Invalid gCS($(\"body\"))['font-style'];"))
},
test_description
);
</script>

View file

@ -0,0 +1,96 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Grid Layout Test: minimum contribution with baseline-alignment shim</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content" title="11.5. Resolve Intrinsic Track Sizes">
<meta name="assert" content="Checks that the minimum contribution takes the baseline-alignment shim into account when calculating the outer size that grid items would have if their preferred size were their minimum size. Also checks that the shim is used again when clamping the automatic minimum size to less than or equal to the stretch fit into the grid area.">
<style>
.grid {
display: grid;
position: relative;
font-size: 0;
height: 0;
width: 0;
margin-bottom: 125px;
grid-template-rows: 50px 50px;
justify-items: baseline;
}
.item1, .item2 {
writing-mode: vertical-lr;
}
.item1 {
padding-left: 25px;
background: yellow;
}
.item2 {
padding-right: 25px;
background: magenta;
}
.item1::before, .item2::before {
content: '';
display: inline-block;
width: 25px;
height: 25px;
vertical-align: top;
}
.item2::before {
vertical-align: bottom;
}
.area {
position: absolute;
z-index: -1;
left: 0;
right: 0;
top: 0;
bottom: 0;
grid-column: 1 / 2;
grid-row: 1 / 3;
background: cyan;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<div id="log"></div>
<div class="grid" style="grid-template-columns: minmax(auto, 0px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="75" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 75px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="75" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 88px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="88" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 100px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 150px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, auto);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<script>
checkLayout(".grid");
</script>

View file

@ -0,0 +1,96 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Grid Layout Test: minimum contribution with baseline-alignment shim</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content" title="11.5. Resolve Intrinsic Track Sizes">
<meta name="assert" content="Checks that the minimum contribution takes the baseline-alignment shim into account when calculating the outer size that grid items would have if their preferred size were their minimum size. Also checks that the shim is used again when clamping the automatic minimum size to less than or equal to the stretch fit into the grid area.">
<style>
.grid {
display: grid;
position: relative;
font-size: 0;
height: 0;
width: 0;
margin-bottom: 125px;
grid-template-rows: 50px 50px;
justify-items: baseline;
}
.item1, .item2 {
writing-mode: vertical-rl;
}
.item1 {
padding-left: 25px;
background: yellow;
}
.item2 {
padding-right: 25px;
background: magenta;
}
.item1::before, .item2::before {
content: '';
display: inline-block;
width: 25px;
height: 25px;
vertical-align: top;
}
.item2::before {
vertical-align: bottom;
}
.area {
position: absolute;
z-index: -1;
left: 0;
right: 0;
top: 0;
bottom: 0;
grid-column: 1 / 2;
grid-row: 1 / 3;
background: cyan;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<div id="log"></div>
<div class="grid" style="grid-template-columns: minmax(auto, 0px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="75" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 75px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="75" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 88px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="88" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 100px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, 150px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-columns: minmax(auto, auto);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<script>
checkLayout(".grid");
</script>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Grid Layout Test: minimum contribution with baseline-alignment shim</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content" title="11.5. Resolve Intrinsic Track Sizes">
<meta name="assert" content="Checks that the minimum contribution takes the baseline-alignment shim into account when calculating the outer size that grid items would have if their preferred size were their minimum size. Also checks that the shim is used again when clamping the automatic minimum size to less than or equal to the stretch fit into the grid area.">
<style>
.grid {
display: grid;
position: relative;
font-size: 0;
height: 0;
width: 0;
margin-bottom: 125px;
grid-template-columns: 50px 50px;
align-items: baseline;
}
.item1 {
padding-top: 25px;
background: yellow;
}
.item2 {
padding-bottom: 25px;
background: magenta;
}
.item1::before, .item2::before {
content: '';
display: inline-block;
width: 25px;
height: 25px;
vertical-align: bottom;
}
.item2::before {
vertical-align: top;
}
.area {
position: absolute;
z-index: -1;
left: 0;
right: 0;
top: 0;
bottom: 0;
grid-column: 1 / 3;
grid-row: 1 / 2;
background: cyan;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
<div id="log"></div>
<div class="grid" style="grid-template-rows: minmax(auto, 0px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="75"></div>
</div>
<div class="grid" style="grid-template-rows: minmax(auto, 75px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="75"></div>
</div>
<div class="grid" style="grid-template-rows: minmax(auto, 88px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="88"></div>
</div>
<div class="grid" style="grid-template-rows: minmax(auto, 100px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-rows: minmax(auto, 150px);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<div class="grid" style="grid-template-rows: minmax(auto, auto);">
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
<div class="area" data-expected-width="100" data-expected-height="100"></div>
</div>
<script>
checkLayout(".grid");
</script>

View file

@ -0,0 +1,41 @@
<!DOCTYPE html>
<title>Hit-test of clip-path objectBoundingBox &lt;clipPath> with additional transform</title>
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body {
margin: 0;
}
.box {
width: 100px;
height: 100px;
background-color: blue;
margin: 100px;
clip-path: url(#clip);
}
</style>
<div class="box"></div>
<svg height="0">
<clipPath id="clip" clipPathUnits="objectBoundingBox" transform="scale(0.01, 0.01)">
<polygon points="50,0 100,50 50,100 0,50"/>
</clipPath>
</svg>
<script>
function assert_element_at(element, pointlist) {
for (let point of pointlist) {
let result = document.elementFromPoint(point[0], point[1]);
assert_equals(result, element, point.join(','));
}
}
test(function() {
let div = document.querySelector('.box');
// Points inside clip-path.
assert_element_at(div, [[150, 150], [150, 125], [150, 175], [125, 150], [175, 150]]);
// Points outside clip-path.
assert_element_at(document.body, [[120, 120], [180, 120], [120, 180], [180, 180]]);
});
</script>

View file

@ -0,0 +1,44 @@
<!DOCTYPE html>
<title>Hit-test of clip-path nested objectBoundingBox &lt;clipPath></title>
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body {
margin: 0;
}
.box {
width: 200px;
height: 200px;
background-color: blue;
margin: 100px;
clip-path: url(#clip);
}
</style>
<div class="box"></div>
<svg height="0">
<clipPath id="nested" clipPathUnits="objectBoundingBox">
<circle cx="0.25" cy="0.25" r="0.25"/>
</clipPath>
<clipPath id="clip" clipPathUnits="objectBoundingBox" clip-path="url(#nested)">
<rect width="0.5" height="0.5"/>
</clipPath>
</svg>
<script>
function assert_element_at(element, pointlist) {
for (let point of pointlist) {
let result = document.elementFromPoint(point[0], point[1]);
assert_equals(result, element, point.join(','));
}
}
test(function() {
let div = document.querySelector('.box');
// Points inside clip-path.
assert_element_at(div, [[150, 150], [150, 125], [150, 175], [125, 150], [175, 150]]);
// Points outside clip-path.
assert_element_at(document.body, [[110, 110], [190, 110], [110, 190], [190, 190]]);
});
</script>

View file

@ -0,0 +1,41 @@
<!DOCTYPE html>
<title>Hit-test of clip-path userSpaceOnUse &lt;clipPath></title>
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body {
margin: 0;
}
.box {
width: 100px;
height: 100px;
background-color: blue;
margin: 100px;
clip-path: url(#clip);
}
</style>
<div class="box"></div>
<svg height="0">
<clipPath id="clip" clipPathUnits="userSpaceOnUse">
<polygon points="50,0 100,50 50,100 0,50"/>
</clipPath>
</svg>
<script>
function assert_element_at(element, pointlist) {
for (let point of pointlist) {
let result = document.elementFromPoint(point[0], point[1]);
assert_equals(result, element, point.join(','));
}
}
test(function() {
let div = document.querySelector('.box');
// Points inside clip-path.
assert_element_at(div, [[150, 150], [150, 125], [150, 175], [125, 150], [175, 150]]);
// Points outside clip-path.
assert_element_at(document.body, [[120, 120], [180, 120], [120, 180], [180, 180]]);
});
</script>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<title>Hit-test of clip-path polygon combined with box-shadow</title>
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body {
margin: 0;
}
.box {
width: 100px;
height: 100px;
background-color: blue;
box-shadow: -100px 0px red;
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
}
</style>
<div class="box"></div>
<script>
function assert_element_at(element, pointlist) {
for (let point of pointlist) {
let result = document.elementFromPoint(point[0], point[1]);
assert_equals(result, element, point.join(','));
}
}
test(function() {
let div = document.querySelector('.box');
// Points inside clip-path.
assert_element_at(div, [[50, 50], [50, 25], [50, 75], [25, 50], [75, 50]]);
// Points outside clip-path.
assert_element_at(document.body, [[20, 20], [80, 20], [20, 80], [80, 80]]);
});
</script>

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<style>
#test {
width: 100px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
border: solid thin grey;
font: 20px 'Ahem';
line-height: 40px;
}
</style>
<p>This tests the -webkit-line-clamp property with line-height applied.</p>
<div id="test">
XXXX XXX
</div>

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