CSS Test Reference
+
+
+Should see a green square centered and at the bottom of the blue square.
+
diff --git a/css/css-align/content-distribution/place-content-shorthand-007.html b/css/css-align/content-distribution/place-content-shorthand-007.html
new file mode 100644
index 00000000000000..be954c9712189d
--- /dev/null
+++ b/css/css-align/content-distribution/place-content-shorthand-007.html
@@ -0,0 +1,22 @@
+
+
+CSS Box Alignment: place-content shorthand with fallback
+
+
+
+
+
+Should see a green square centered and at the bottom of the blue square.
+
+
+
diff --git a/css/css-text/astral-bidi/support/adlam.css b/css/css-text/astral-bidi/support/adlam.css
new file mode 100644
index 00000000000000..56020cae6039c1
--- /dev/null
+++ b/css/css-text/astral-bidi/support/adlam.css
@@ -0,0 +1,9 @@
+@font-face {
+ font-family: "Noto Sans Adlam";
+ font-weight: normal;
+ font-style: normal;
+ src: url("../../../fonts/noto/NotoSansAdlam-hinted/NotoSansAdlam-Regular.ttf") format("truetype");
+}
+p {
+ font-family: "Noto Sans Adlam";
+}
diff --git a/css/css-text/astral-bidi/support/cypriot.css b/css/css-text/astral-bidi/support/cypriot.css
new file mode 100644
index 00000000000000..23fcb7db5d3a82
--- /dev/null
+++ b/css/css-text/astral-bidi/support/cypriot.css
@@ -0,0 +1,9 @@
+@font-face {
+ font-family: "Noto Sans Cypriot";
+ font-weight: normal;
+ font-style: normal;
+ src: url("../../../fonts/noto/NotoSansCypriot-hinted/NotoSansCypriot-Regular.ttf") format("truetype");
+}
+p {
+ font-family: "Noto Sans Cypriot";
+}
diff --git a/css/css-values/calc-ch-ex-lang-ref.html b/css/css-values/calc-ch-ex-lang-ref.html
new file mode 100644
index 00000000000000..e0ac1ead1e5247
--- /dev/null
+++ b/css/css-values/calc-ch-ex-lang-ref.html
@@ -0,0 +1,12 @@
+
+
+CSS Test Reference
+
+
+
diff --git a/css/css-values/calc-ch-ex-lang.html b/css/css-values/calc-ch-ex-lang.html
new file mode 100644
index 00000000000000..eb447475d52887
--- /dev/null
+++ b/css/css-values/calc-ch-ex-lang.html
@@ -0,0 +1,16 @@
+
+
+CSS Test: Calc in font-size with ch / ex units across lang changes
+
+
+
+
+
+
+
+
+
diff --git a/css/css-values/calc-rem-lang-ref.html b/css/css-values/calc-rem-lang-ref.html
new file mode 100644
index 00000000000000..a0f6add684a57f
--- /dev/null
+++ b/css/css-values/calc-rem-lang-ref.html
@@ -0,0 +1,6 @@
+
+
+CSS Test Reference
+
+
You should see a green box twice-the-initial-font-size wide.
+
diff --git a/css/css-values/calc-rem-lang.html b/css/css-values/calc-rem-lang.html
new file mode 100644
index 00000000000000..3994efc003b5a1
--- /dev/null
+++ b/css/css-values/calc-rem-lang.html
@@ -0,0 +1,17 @@
+
+
+
+CSS Test: Calc with rem and relative units on the root element
+
+
+
+
+
+
+
You should see a green box twice-the-initial-font-size wide.
+
+
diff --git a/css/cssom-view/elementFromPoint-dynamic-anon-box.html b/css/cssom-view/elementFromPoint-dynamic-anon-box.html
new file mode 100644
index 00000000000000..e0acb90fb8fe76
--- /dev/null
+++ b/css/cssom-view/elementFromPoint-dynamic-anon-box.html
@@ -0,0 +1,44 @@
+
+
+CSS Test: Hit testing on element previously hidden by an anonymous scroll box
+
+
+
+
+
+
+
+
+Should be clickable
+
diff --git a/css/fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt b/css/fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt
new file mode 100644
index 00000000000000..d952d62c065f3f
--- /dev/null
+++ b/css/fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt
@@ -0,0 +1,92 @@
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/css/fonts/noto/NotoSansAdlam-hinted/NotoSansAdlam-Regular.ttf b/css/fonts/noto/NotoSansAdlam-hinted/NotoSansAdlam-Regular.ttf
new file mode 100644
index 00000000000000..0ab5d995c96402
Binary files /dev/null and b/css/fonts/noto/NotoSansAdlam-hinted/NotoSansAdlam-Regular.ttf differ
diff --git a/css/fonts/noto/NotoSansAdlam-hinted/README b/css/fonts/noto/NotoSansAdlam-hinted/README
new file mode 100644
index 00000000000000..d22876499aa332
--- /dev/null
+++ b/css/fonts/noto/NotoSansAdlam-hinted/README
@@ -0,0 +1,11 @@
+This package is part of the noto project. Visit
+google.com/get/noto for more information.
+
+Built on 2017-10-24 from the following noto repository:
+-----
+Repo: noto-fonts
+Tag: v2017-10-24-phase3-second-cleanup
+Date: 2017-10-24 12:10:34 GMT
+Commit: 8ef14e6c606a7a0ef3943b9ca01fd49445620d79
+
+Remove some files that aren't for release.
diff --git a/css/fonts/noto/NotoSansCypriot-hinted/LICENSE_OFL.txt b/css/fonts/noto/NotoSansCypriot-hinted/LICENSE_OFL.txt
new file mode 100644
index 00000000000000..d952d62c065f3f
--- /dev/null
+++ b/css/fonts/noto/NotoSansCypriot-hinted/LICENSE_OFL.txt
@@ -0,0 +1,92 @@
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/css/fonts/noto/NotoSansCypriot-hinted/NotoSansCypriot-Regular.ttf b/css/fonts/noto/NotoSansCypriot-hinted/NotoSansCypriot-Regular.ttf
new file mode 100644
index 00000000000000..6727e13d62857f
Binary files /dev/null and b/css/fonts/noto/NotoSansCypriot-hinted/NotoSansCypriot-Regular.ttf differ
diff --git a/css/fonts/noto/NotoSansCypriot-hinted/README b/css/fonts/noto/NotoSansCypriot-hinted/README
new file mode 100644
index 00000000000000..d22876499aa332
--- /dev/null
+++ b/css/fonts/noto/NotoSansCypriot-hinted/README
@@ -0,0 +1,11 @@
+This package is part of the noto project. Visit
+google.com/get/noto for more information.
+
+Built on 2017-10-24 from the following noto repository:
+-----
+Repo: noto-fonts
+Tag: v2017-10-24-phase3-second-cleanup
+Date: 2017-10-24 12:10:34 GMT
+Commit: 8ef14e6c606a7a0ef3943b9ca01fd49445620d79
+
+Remove some files that aren't for release.
diff --git a/css/selectors/invalidation/selectorText-dynamic-001.html b/css/selectors/invalidation/selectorText-dynamic-001.html
new file mode 100644
index 00000000000000..c705c2b3e85f59
--- /dev/null
+++ b/css/selectors/invalidation/selectorText-dynamic-001.html
@@ -0,0 +1,24 @@
+
+
+CSS Test: invalidation of class changes when the selector in a rule has changed
+
+
+
+
+
+
+
+Should have a green background.
+
+
diff --git a/css/selectors/invalidation/sheet-going-away-001.html b/css/selectors/invalidation/sheet-going-away-001.html
new file mode 100644
index 00000000000000..7b704eca97ff5b
--- /dev/null
+++ b/css/selectors/invalidation/sheet-going-away-001.html
@@ -0,0 +1,26 @@
+
+
+CSS Test: invalidation of class changes when the sheet the style depends on goes away
+
+
+
+
+
+
+
+
+Should have a green background.
+
+
diff --git a/css/selectors/invalidation/sheet-going-away-002-ref.html b/css/selectors/invalidation/sheet-going-away-002-ref.html
new file mode 100644
index 00000000000000..67841617736730
--- /dev/null
+++ b/css/selectors/invalidation/sheet-going-away-002-ref.html
@@ -0,0 +1,7 @@
+
+
+CSS Test Reference
+
+
+ Should be green.
+
diff --git a/css/selectors/invalidation/sheet-going-away-002.html b/css/selectors/invalidation/sheet-going-away-002.html
new file mode 100644
index 00000000000000..41778239518d4d
--- /dev/null
+++ b/css/selectors/invalidation/sheet-going-away-002.html
@@ -0,0 +1,23 @@
+
+
+CSS Test: invalidation of class changes when the sheet the style depends on goes away
+
+
+
+
+
+
+
+
+ Should be green.
+
+
+
diff --git a/custom-elements/attribute-changed-callback.html b/custom-elements/attribute-changed-callback.html
index bd467912b99959..5090bfbfbfecdf 100644
--- a/custom-elements/attribute-changed-callback.html
+++ b/custom-elements/attribute-changed-callback.html
@@ -11,6 +11,7 @@
+
diff --git a/custom-elements/parser/parser-sets-attributes-and-children.html b/custom-elements/parser/parser-sets-attributes-and-children.html
index ba331370a78daa..ef4689fac0729e 100644
--- a/custom-elements/parser/parser-sets-attributes-and-children.html
+++ b/custom-elements/parser/parser-sets-attributes-and-children.html
@@ -8,6 +8,7 @@
+
@@ -15,6 +16,7 @@
var numberOfAttributesInConstructor;
var numberOfChildNodesInConstructor;
+var attributesChangedCalls = [];
class MyCustomElement extends HTMLElement {
constructor(...args) {
@@ -22,6 +24,14 @@
numberOfAttributesInConstructor = this.attributes.length;
numberOfChildNodesInConstructor = this.childNodes.length;
}
+
+ attributeChangedCallback(...args) {
+ attributesChangedCalls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+
+ static get observedAttributes() {
+ return ['id', 'class'];
+ }
};
customElements.define('my-custom-element', MyCustomElement);
@@ -54,6 +64,12 @@
assert_equals(numberOfChildNodesInConstructor, 0, 'HTML parser must not append child nodes to a custom element before invoking the constructor');
}, 'HTML parser must set the attributes or append children before calling constructor');
+test(function () {
+ assert_equals(attributesChangedCalls.length, 2);
+ assert_attribute_log_entry(attributesChangedCalls[0], {name: 'id', oldValue: null, newValue: 'custom-element-id', namespace: null});
+ assert_attribute_log_entry(attributesChangedCalls[1], {name: 'class', oldValue: null, newValue: 'class1 class2', namespace: null});
+}, 'HTML parser must enqueue attributeChanged reactions');
+
diff --git a/fetch/api/response/response-init-002.html b/fetch/api/response/response-init-002.html
index 0bb2e8d0b3b28d..a48af833644efe 100644
--- a/fetch/api/response/response-init-002.html
+++ b/fetch/api/response/response-init-002.html
@@ -65,6 +65,11 @@
});
}, "Testing empty Response Content-Type header");
+ test(function() {
+ var response = new Response(null, {status: 204});
+ assert_equals(response.body, null);
+ }, "Testing null Response body");
+
diff --git a/resource-timing/resource_timing.worker.js b/resource-timing/resource_timing.worker.js
new file mode 100644
index 00000000000000..92687f0f7b62b9
--- /dev/null
+++ b/resource-timing/resource_timing.worker.js
@@ -0,0 +1,64 @@
+importScripts("/resources/testharness.js");
+
+function check(initiatorType, protocol) {
+ let entries = performance.getEntries();
+ assert_equals(entries.length, 1);
+
+ assert_true(entries[0] instanceof PerformanceEntry);
+ assert_equals(entries[0].entryType, "resource");
+ assert_true(entries[0].startTime > 0);
+ assert_true(entries[0].duration > 0);
+
+ assert_true(entries[0] instanceof PerformanceResourceTiming);
+ assert_equals(entries[0].initiatorType, initiatorType);
+ assert_equals(entries[0].nextHopProtocol, protocol);
+}
+
+async_test(t => {
+ performance.clearResourceTimings();
+
+ // Fetch
+ fetch("resources/empty.js")
+ .then(r => r.blob())
+ .then(blob => {
+ check("fetch", "http/1.1");
+ })
+
+ // XMLHttpRequest
+ .then(() => {
+ return new Promise(resolve => {
+ performance.clearResourceTimings();
+ let xhr = new XMLHttpRequest();
+ xhr.onload = () => {
+ check("xmlhttprequest", "http/1.1");
+ resolve();
+ };
+ xhr.open("GET", "resources/empty.js");
+ xhr.send();
+ });
+ })
+
+ // Sync XMLHttpREquest
+ .then(() => {
+ performance.clearResourceTimings();
+ let xhr = new XMLHttpRequest();
+ xhr.open("GET", "resources/empty.js", false);
+ xhr.send();
+
+ check("xmlhttprequest", "http/1.1");
+ })
+
+ // ImportScripts
+ .then(() => {
+ performance.clearResourceTimings();
+ importScripts(["resources/empty.js"]);
+ check("other", "http/1.1");
+ })
+
+ // All done.
+ .then(() => {
+ t.done();
+ });
+}, "Performance Resouce Entries in workers");
+
+done();
diff --git a/resource-timing/resources/empty.js b/resource-timing/resources/empty.js
new file mode 100644
index 00000000000000..3b44754e301ded
--- /dev/null
+++ b/resource-timing/resources/empty.js
@@ -0,0 +1 @@
+/* Nothing here */
diff --git a/service-workers/service-worker/local-url-inherit-controller.https.html b/service-workers/service-worker/local-url-inherit-controller.https.html
new file mode 100644
index 00000000000000..e3f0b24f1c94a1
--- /dev/null
+++ b/service-workers/service-worker/local-url-inherit-controller.https.html
@@ -0,0 +1,79 @@
+
+Service Worker: local URL windows and workers inherit controller
+
+
+
+
+
+
+
+
diff --git a/service-workers/service-worker/resources/local-url-inherit-controller-frame.html b/service-workers/service-worker/resources/local-url-inherit-controller-frame.html
new file mode 100644
index 00000000000000..769c2681c0897b
--- /dev/null
+++ b/service-workers/service-worker/resources/local-url-inherit-controller-frame.html
@@ -0,0 +1,85 @@
+
+
+
+
diff --git a/tools/ci/.bashrc b/tools/ci/.bashrc
new file mode 100644
index 00000000000000..bbe03c489aa528
--- /dev/null
+++ b/tools/ci/.bashrc
@@ -0,0 +1,4 @@
+function xvfb_start() {
+ GEOMETRY="$SCREEN_WIDTH""x""$SCREEN_HEIGHT""x""$SCREEN_DEPTH"
+ xvfb-run --server-args="-screen 0 $GEOMETRY -ac +extension RANDR" $@
+}
diff --git a/tools/ci/Dockerfile b/tools/ci/Dockerfile
new file mode 100644
index 00000000000000..28fdd78b3ec008
--- /dev/null
+++ b/tools/ci/Dockerfile
@@ -0,0 +1,76 @@
+FROM ubuntu:16.04
+
+# No interactive frontend during docker build
+ENV DEBIAN_FRONTEND=noninteractive \
+ DEBCONF_NONINTERACTIVE_SEEN=true
+
+# General requirements not in the base image
+RUN apt-get -qqy update \
+ && apt-get -qqy install \
+ bzip2 \
+ ca-certificates \
+ dbus-x11 \
+ git \
+ locales \
+ pulseaudio \
+ python \
+ python-pip \
+ tzdata \
+ sudo \
+ unzip \
+ wget \
+ xvfb
+
+# Installing just the deps of firefox and chrome is moderately tricky, so
+# just install the default versions of them, and some extra deps we happen
+# to know that chrome requires
+
+RUN apt-get -qqy install \
+ firefox \
+ chromium-browser \
+ libnss3-tools \
+ fonts-liberation \
+ indicator-application \
+ libappindicator1 \
+ libappindicator3-1 \
+ libdbusmenu-gtk3-4 \
+ libindicator3-7 \
+ libindicator7
+
+RUN pip install --upgrade pip
+RUN pip install virtualenv
+
+ENV TZ "UTC"
+RUN echo "${TZ}" > /etc/timezone \
+ && dpkg-reconfigure --frontend noninteractive tzdata
+
+RUN useradd test \
+ --shell /bin/bash \
+ --create-home \
+ && usermod -a -G sudo test \
+ && echo 'ALL ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers \
+ && echo 'test:secret' | chpasswd
+
+ENV SCREEN_WIDTH 1280
+ENV SCREEN_HEIGHT 1024
+ENV SCREEN_DEPTH 24
+ENV DISPLAY :99.0
+
+USER test
+
+WORKDIR /home/test
+
+COPY .bashrc /home/test/.bashrc
+
+COPY start.sh /home/test/start.sh
+
+# Remove information on how to use sudo on login
+RUN sudo echo ""
+
+RUN git clone --depth=1 https://github.com/w3c/web-platform-tests.git
+
+RUN mkdir -p /home/test/.fonts && \
+ cp web-platform-tests/fonts/Ahem.ttf ~/.fonts && \
+ fc-cache -f -v
+
+RUN mkdir -p /home/test/artifacts
\ No newline at end of file
diff --git a/tools/ci/ci_taskcluster.sh b/tools/ci/ci_taskcluster.sh
new file mode 100755
index 00000000000000..38c84628f15d53
--- /dev/null
+++ b/tools/ci/ci_taskcluster.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+if [ $1 == "firefox" ]; then
+ ./wpt run firefox --log-tbpl=- --log-tbpl-level=debug --log-wptreport=../artifacts/wpt_report.json --this-chunk=$3 --total-chunks=$4 --test-type=$2 -y --install-browser --no-pause --no-restart-on-unexpected
+elif [ $1 == "chrome" ]; then
+ ./wpt run chrome --log-tbpl=- --log-tbpl-level=debug --log-wptreport=../artifacts/wpt_report.json --this-chunk=$3 --total-chunks=$4 --test-type=$2 -y --no-pause --no-restart-on-unexpected
+fi
diff --git a/tools/ci/commands.json b/tools/ci/commands.json
index d682d2a506440c..862fde037b5a3b 100644
--- a/tools/ci/commands.json
+++ b/tools/ci/commands.json
@@ -2,5 +2,7 @@
"test-jobs": {"path": "jobs.py", "script": "run", "parser": "create_parser", "help": "List test jobs that should run for a set of commits",
"virtualenv": false},
"check-stability": {"path": "check_stability.py", "script": "run", "parser": "get_parser", "parse_known": true, "help": "Check test stability",
- "virtualenv": true, "install": ["requests"], "requirements": ["../wptrunner/requirements.txt"]}
+ "virtualenv": true, "install": ["requests"], "requirements": ["../wptrunner/requirements.txt"]},
+ "generate-tasks": {"path": "taskgraph.py", "script": "run", "parser": "get_parser", "parse_known": true, "help": "Generate taskcluster.yml file containing the run tasks",
+ "virtualenv": true, "install": ["pyyaml"]}
}
diff --git a/tools/ci/start.sh b/tools/ci/start.sh
new file mode 100755
index 00000000000000..f4adb90d7cb22e
--- /dev/null
+++ b/tools/ci/start.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+sudo sh -c 'echo "
+127.0.0.1 web-platform.test
+127.0.0.1 www.web-platform.test
+127.0.0.1 www1.web-platform.test
+127.0.0.1 www2.web-platform.test
+127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
+127.0.0.1 xn--lve-6lad.web-platform.test
+0.0.0.0 nonexistent-origin.web-platform.test" >> /etc/hosts'
+
+cd web-platform-tests
+git pull --depth=1
+
+# Install Chome unstable
+deb_archive=google-chrome-unstable_current_amd64.deb
+wget https://dl.google.com/linux/direct/$deb_archive
+
+# Installation will fail in cases where the package has unmet dependencies.
+# When this occurs, attempt to use the system package manager to fetch the
+# required packages and retry.
+if ! sudo dpkg --install $deb_archive; then
+ sudo apt-get -y install --fix-broken
+ sudo dpkg --install $deb_archive
+fi
+
+sudo Xvfb $DISPLAY -screen 0 ${SCREEN_WIDTH}x${SCREEN_HEIGHT}x${SCREEN_DEPTH} &
diff --git a/tools/ci/taskgraph.py b/tools/ci/taskgraph.py
new file mode 100644
index 00000000000000..523bf286433abf
--- /dev/null
+++ b/tools/ci/taskgraph.py
@@ -0,0 +1,119 @@
+import argparse
+import copy
+import os
+
+import yaml
+
+
+here = os.path.dirname(__file__)
+wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
+
+
+task_template = {
+ "provisionerId": "{{ taskcluster.docker.provisionerId }}",
+ "workerType": "{{ taskcluster.docker.workerType }}",
+ "extra": {
+ "github": {
+ "events": ["push"],
+ "branches": ["master"],
+ },
+ },
+ "payload": {
+ "maxRunTime": 5400,
+ "image": "harjgam/web-platform-tests:0.5",
+ "command":[
+ "/bin/bash",
+ "--login",
+ "-c",
+ """>-
+ ~/start.sh &&
+ cd /home/test/web-platform-tests &&
+ git fetch {{event.head.repo.url}} &&
+ git config advice.detachedHead false &&
+ git checkout {{event.head.sha}} &&
+ %(command)s"""],
+ "artifacts": {
+ "public/results": {
+ "path": "/home/test/artifacts",
+ "type": "directory"
+ }
+ }
+ },
+ "metadata": {
+ "name": "wpt-%(browser_name)s-%(suite)s-%(chunk)s",
+ "description": "",
+ "owner": "{{ event.head.user.email }}",
+ "source": "{{ event.head.repo.url }}",
+ }
+}
+
+
+file_template = {
+ "version": 0,
+ "tasks": [],
+ "allowPullRequests": "collaborators"
+}
+
+suites = {
+ "testharness": {"chunks": 12},
+ "reftest": {"chunks": 6},
+ "wdspec": {"chunks": 1}
+}
+
+browsers = {
+ "firefox": {"name": "firefox-nightly"},
+ "chrome": {"name": "chrome-dev"}
+}
+
+
+def get_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--dest",
+ action="store",
+ default=wpt_root,
+ help="Directory to write the .taskcluster.yml file to")
+ return parser
+
+
+def fill(template, data):
+ rv = {}
+ for key, value in template.iteritems():
+ rv[key] = fill_inner(value, data)
+ return rv
+
+
+def fill_inner(value, data):
+ if isinstance(value, (str, unicode)):
+ return value % data
+ elif isinstance(value, dict):
+ return fill(value, data)
+ elif isinstance(value, list):
+ return [fill_inner(item, data) for item in value]
+ elif isinstance(value, (float, int, long)):
+ return value
+ else:
+ raise ValueError
+
+
+def run(venv, *args, **kwargs):
+ if not os.path.isdir(kwargs["dest"]):
+ raise ValueError("Invalid directory %s" % kwargs["dest"])
+
+ task_config = copy.deepcopy(file_template)
+ for browser, browser_props in browsers.iteritems():
+ for suite, suite_props in suites.iteritems():
+ total_chunks = suite_props.get("chunks", 1)
+ for chunk in xrange(1, total_chunks + 1):
+ data = {
+ "suite": suite,
+ "chunk": chunk,
+ "browser_name": browser_props["name"],
+ "command": ("./tools/ci/ci_taskcluster.sh %s %s %s %s" %
+ (browser, suite, chunk, total_chunks))
+ }
+
+ task_data = fill(task_template, data)
+ task_config["tasks"].append(task_data)
+
+ with open(os.path.join(kwargs["dest"], ".taskcluster.yml"), "w") as f:
+ yaml.dump(task_config, f)
diff --git a/tools/wpt/run.py b/tools/wpt/run.py
index d1e3e49519c914..c6f3dbc0d240e4 100644
--- a/tools/wpt/run.py
+++ b/tools/wpt/run.py
@@ -397,7 +397,8 @@ def log(x):
def run_single(venv, **kwargs):
from wptrunner import wptrunner
- return wptrunner.start(**kwargs)
+ wptrunner.start(**kwargs)
+ return
def main():
diff --git a/tools/wpt/utils.py b/tools/wpt/utils.py
index e1f4cd4bb5c75d..40e1a45d28d0e5 100644
--- a/tools/wpt/utils.py
+++ b/tools/wpt/utils.py
@@ -39,7 +39,7 @@ def call(*args):
Returns a bytestring of the subprocess output if no error.
"""
- logger.debug("%s" % " ".join(args))
+ logger.info("%s" % " ".join(args))
try:
return subprocess.check_output(args)
except subprocess.CalledProcessError as e:
diff --git a/tools/wpt/virtualenv.py b/tools/wpt/virtualenv.py
index 8f36aa93585ffd..6abaec5f875811 100644
--- a/tools/wpt/virtualenv.py
+++ b/tools/wpt/virtualenv.py
@@ -7,6 +7,7 @@
logger = logging.getLogger(__name__)
+
class Virtualenv(object):
def __init__(self, path):
self.path = path
@@ -21,7 +22,7 @@ def exists(self):
def create(self):
if os.path.exists(self.path):
shutil.rmtree(self.path)
- call(self.virtualenv, self.path)
+ call(self.virtualenv, self.path, "-p", sys.executable)
@property
def bin_path(self):
@@ -38,7 +39,14 @@ def pip_path(self):
def activate(self):
path = os.path.join(self.bin_path, "activate_this.py")
+ logger.info("Activating virtualenv %s" % path)
+ old_sys_path = sys.path[:]
+ logger.info(sys.path)
execfile(path, {"__file__": path})
+ logger.info(sys.path)
+ for item in sys.path:
+ if item not in old_sys_path:
+ logger.info(item)
def start(self):
if not self.exists:
@@ -46,7 +54,7 @@ def start(self):
self.activate()
def install(self, *requirements):
- call(self.pip_path, "install", *requirements)
+ logger.info(call(self.pip_path, "install", *requirements))
def install_requirements(self, requirements_path):
- call(self.pip_path, "install", "-r", requirements_path)
+ logger.info(call(self.pip_path, "install", "-r", requirements_path))
diff --git a/tools/wpt/wpt.py b/tools/wpt/wpt.py
index 49f463d2a9ed1e..e183bef230da97 100644
--- a/tools/wpt/wpt.py
+++ b/tools/wpt/wpt.py
@@ -90,7 +90,7 @@ def setup_virtualenv(path, props):
def main(prog=None, argv=None):
- logging.basicConfig(level=logging.INFO)
+ logging.basicConfig(level=logging.DEBUG)
if prog is None:
prog = sys.argv[0]
diff --git a/web-animations/README.md b/web-animations/README.md
index 475f58a57b1283..f6efbf977f95bc 100644
--- a/web-animations/README.md
+++ b/web-animations/README.md
@@ -98,10 +98,19 @@ Guidelines for writing tests
Remember, even if we do need to make all tests take, say 200s each, text
editors are very good at search and replace.
-* Use the `assert_times_equal` assertion for comparing calculated times.
- It tests times are equal using the precision recommended in the spec whilst
- allowing implementations to override the function to meet their own
- precision requirements.
+* Use the `assert_times_equal` assertion for comparing times returned from
+ the API. This asserts that the time values are equal using a tolerance
+ based on the precision recommended in the spec. This tolerance is applied
+ to *both* of the values being compared. That is, it effectively allows
+ double the epsilon that is used when comparing with an absolute value.
+
+ For comparing a time value returned from the API to an absolute value, use
+ `assert_time_equals_literal`. This tests that the actual value is equal to
+ the expected value within the precision recommended in the spec.
+
+ Both `assert_times_equal` and `assert_time_equals_literal` are defined in a
+ way that implementations can override them to meet their own precision
+ requirements.
* There are quite a few bad tests in the repository. We're learning as
we go. Don't just copy them blindly—please fix them!
diff --git a/web-animations/interfaces/Animation/playbackRate.html b/web-animations/interfaces/Animation/playbackRate.html
index 9a3b76240f0272..be5bf969498ceb 100644
--- a/web-animations/interfaces/Animation/playbackRate.html
+++ b/web-animations/interfaces/Animation/playbackRate.html
@@ -14,16 +14,14 @@
previousAnimationCurrentTime,
previousTimelineCurrentTime,
description) {
- const accuracy = 0.001; /* accuracy of DOMHighResTimeStamp */
const animationCurrentTimeDifference =
animation.currentTime - previousAnimationCurrentTime;
const timelineCurrentTimeDifference =
animation.timeline.currentTime - previousTimelineCurrentTime;
- assert_approx_equals(animationCurrentTimeDifference,
- timelineCurrentTimeDifference * animation.playbackRate,
- accuracy,
- description);
+ assert_times_equal(animationCurrentTimeDifference,
+ timelineCurrentTimeDifference * animation.playbackRate,
+ description);
}
promise_test(t => {
diff --git a/web-animations/interfaces/AnimationEffectTiming/direction.html b/web-animations/interfaces/AnimationEffectTiming/direction.html
index 7bc315da967162..3238f5d7a5e842 100644
--- a/web-animations/interfaces/AnimationEffectTiming/direction.html
+++ b/web-animations/interfaces/AnimationEffectTiming/direction.html
@@ -31,13 +31,13 @@
const div = createDiv(t);
const anim = div.animate(null, { duration: 10000, direction: 'normal' });
anim.currentTime = 7000;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.7,
- 'progress before updating direction');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.7,
+ 'progress before updating direction');
anim.effect.timing.direction = 'reverse';
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.3,
- 'progress after updating direction');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3,
+ 'progress after updating direction');
}, 'Can be changed from \'normal\' to \'reverse\' while in progress');
test(t => {
@@ -78,13 +78,13 @@
duration: 10000,
direction: 'normal' });
anim.currentTime = 17000;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.7,
- 'progress before updating direction');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.7,
+ 'progress before updating direction');
anim.effect.timing.direction = 'alternate';
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.3,
- 'progress after updating direction');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3,
+ 'progress after updating direction');
}, 'Can be changed from \'normal\' to \'alternate\' while in progress');
test(t => {
@@ -94,13 +94,13 @@
duration: 10000,
direction: 'alternate' });
anim.currentTime = 17000;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.3,
- 'progress before updating direction');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3,
+ 'progress before updating direction');
anim.effect.timing.direction = 'alternate-reverse';
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.7,
- 'progress after updating direction');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.7,
+ 'progress after updating direction');
}, 'Can be changed from \'alternate\' to \'alternate-reverse\' while in'
+ ' progress');
diff --git a/web-animations/interfaces/AnimationEffectTiming/duration.html b/web-animations/interfaces/AnimationEffectTiming/duration.html
index 9caa0e36e05d03..42913f552dd40b 100644
--- a/web-animations/interfaces/AnimationEffectTiming/duration.html
+++ b/web-animations/interfaces/AnimationEffectTiming/duration.html
@@ -19,10 +19,10 @@
const div = createDiv(t);
const anim = div.animate({ opacity: [ 0, 1 ] }, 2000);
anim.effect.timing.duration = 123.45;
- assert_times_equal(anim.effect.timing.duration, 123.45,
- 'set duration 123.45');
- assert_times_equal(anim.effect.getComputedTiming().duration, 123.45,
- 'getComputedTiming() after set duration 123.45');
+ assert_time_equals_literal(anim.effect.timing.duration, 123.45,
+ 'set duration 123.45');
+ assert_time_equals_literal(anim.effect.getComputedTiming().duration, 123.45,
+ 'getComputedTiming() after set duration 123.45');
}, 'Can be set to a double value');
test(t => {
@@ -176,8 +176,8 @@
assert_equals(anim.effect.getComputedTiming().progress, 1,
'progress when animation is finished');
anim.effect.timing.duration *= 2;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5,
- 'progress after doubling the duration');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5,
+ 'progress after doubling the duration');
anim.effect.timing.duration = 0;
assert_equals(anim.effect.getComputedTiming().progress, 1,
'progress after setting duration to zero');
diff --git a/web-animations/interfaces/AnimationEffectTiming/endDelay.html b/web-animations/interfaces/AnimationEffectTiming/endDelay.html
index b6793edaed5b1b..3062c8c1565d4d 100644
--- a/web-animations/interfaces/AnimationEffectTiming/endDelay.html
+++ b/web-animations/interfaces/AnimationEffectTiming/endDelay.html
@@ -19,10 +19,10 @@
const div = createDiv(t);
const anim = div.animate({ opacity: [ 0, 1 ] }, 2000);
anim.effect.timing.endDelay = 123.45;
- assert_times_equal(anim.effect.timing.endDelay, 123.45,
- 'set endDelay 123.45');
- assert_times_equal(anim.effect.getComputedTiming().endDelay, 123.45,
- 'getComputedTiming() after set endDelay 123.45');
+ assert_time_equals_literal(anim.effect.timing.endDelay, 123.45,
+ 'set endDelay 123.45');
+ assert_time_equals_literal(anim.effect.getComputedTiming().endDelay, 123.45,
+ 'getComputedTiming() after set endDelay 123.45');
}, 'Can be set to a positive number');
test(t => {
diff --git a/web-animations/interfaces/AnimationEffectTiming/iterationStart.html b/web-animations/interfaces/AnimationEffectTiming/iterationStart.html
index 5521f1e85940b9..73bc4810da1958 100644
--- a/web-animations/interfaces/AnimationEffectTiming/iterationStart.html
+++ b/web-animations/interfaces/AnimationEffectTiming/iterationStart.html
@@ -24,7 +24,7 @@
duration: 100,
delay: 1 });
anim.effect.timing.iterationStart = 2.5;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
}, 'Changing the value updates computed timing when backwards-filling');
@@ -37,7 +37,7 @@
duration: 100,
delay: 0 });
anim.effect.timing.iterationStart = 2.5;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
}, 'Changing the value updates computed timing during the active phase');
@@ -51,7 +51,7 @@
delay: 0 });
anim.finish();
anim.effect.timing.iterationStart = 2.5;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
assert_equals(anim.effect.getComputedTiming().currentIteration, 3);
}, 'Changing the value updates computed timing when forwards-filling');
diff --git a/web-animations/interfaces/AnimationEffectTiming/iterations.html b/web-animations/interfaces/AnimationEffectTiming/iterations.html
index 32390626463516..3bfaf8e9920d18 100644
--- a/web-animations/interfaces/AnimationEffectTiming/iterations.html
+++ b/web-animations/interfaces/AnimationEffectTiming/iterations.html
@@ -70,10 +70,12 @@
anim.effect.timing.iterations = 2;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0,
- 'progress after adding an iteration');
- assert_times_equal(anim.effect.getComputedTiming().currentIteration, 1,
- 'current iteration after adding an iteration');
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress,
+ 0,
+ 'progress after adding an iteration');
+ assert_time_equals_literal(anim.effect.getComputedTiming().currentIteration,
+ 1,
+ 'current iteration after adding an iteration');
anim.effect.timing.iterations = 0;
diff --git a/web-animations/testcommon.js b/web-animations/testcommon.js
index 51b84dd3e534ea..be3827fd5d8e54 100644
--- a/web-animations/testcommon.js
+++ b/web-animations/testcommon.js
@@ -21,10 +21,18 @@ const TIME_PRECISION = 0.0005; // ms
// times based on their precision requirements.
if (!window.assert_times_equal) {
window.assert_times_equal = (actual, expected, description) => {
- assert_approx_equals(actual, expected, TIME_PRECISION, description);
+ assert_approx_equals(actual, expected, TIME_PRECISION * 2, description);
};
}
+// Allow implementations to substitute an alternative method for comparing
+// a time value based on its precision requirements with a fixed value.
+if (!window.assert_time_equals_literal) {
+ window.assert_time_equals_literal = (actual, expected, description) => {
+ assert_approx_equals(actual, expected, TIME_PRECISION, description);
+ }
+}
+
// creates div element, appends it to the document body and
// removes the created element during test cleanup
function createDiv(test, doc) {
diff --git a/web-animations/timing-model/animation-effects/active-time.html b/web-animations/timing-model/animation-effects/active-time.html
index 3e3b528d534b10..a2feb2323c3308 100644
--- a/web-animations/timing-model/animation-effects/active-time.html
+++ b/web-animations/timing-model/animation-effects/active-time.html
@@ -25,19 +25,19 @@
test(t => {
const anim = createDiv(t).animate(null, 1000);
anim.currentTime = 500;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
}, 'Active time in active phase and no start delay is the local time');
test(t => {
const anim = createDiv(t).animate(null, { duration: 1000, delay: 500 });
anim.currentTime = 1000;
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
}, 'Active time in active phase and positive start delay is the local time'
+ ' minus the start delay');
test(t => {
const anim = createDiv(t).animate(null, { duration: 1000, delay: -500 });
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
}, 'Active time in active phase and negative start delay is the local time'
+ ' minus the start delay');
@@ -58,7 +58,7 @@
fill: 'forwards' });
anim.finish();
assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.3);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3);
}, 'Active time in after phase with forwards fill is the active duration');
test(t => {
@@ -79,7 +79,7 @@
fill: 'forwards' });
anim.finish();
assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.3);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3);
}, 'Active time in after phase with forwards fill and positive end delay'
+ ' is the active duration');
@@ -91,7 +91,7 @@
fill: 'forwards' });
anim.finish();
assert_equals(anim.effect.getComputedTiming().currentIteration, 1);
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
}, 'Active time in after phase with forwards fill and negative end delay'
+ ' is the active duration + end delay');
@@ -127,7 +127,7 @@
fill: 'both' });
anim.finish();
assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
- assert_times_equal(anim.effect.getComputedTiming().progress, 0.3);
+ assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3);
}, 'Active time in after phase with \'both\' fill is the active duration');
test(t => {
diff --git a/web-animations/timing-model/animations/current-time.html b/web-animations/timing-model/animations/current-time.html
index d2f5075d1b25fa..08f90d9f0c1cbd 100644
--- a/web-animations/timing-model/animations/current-time.html
+++ b/web-animations/timing-model/animations/current-time.html
@@ -68,7 +68,7 @@
return animation.ready.then(() => waitForAnimationFrames(1))
.then(() => {
- assert_times_equal(animation.currentTime, 0);
+ assert_time_equals_literal(animation.currentTime, 0);
});
}, 'The current time does not progress if playback rate is 0');
diff --git a/web-animations/timing-model/animations/playing-an-animation.html b/web-animations/timing-model/animations/playing-an-animation.html
index 2beed475e7ec41..1064192051442e 100644
--- a/web-animations/timing-model/animations/playing-an-animation.html
+++ b/web-animations/timing-model/animations/playing-an-animation.html
@@ -14,26 +14,26 @@
test(t => {
const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
animation.currentTime = 1 * MS_PER_SEC;
- assert_times_equal(animation.currentTime, 1 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 1 * MS_PER_SEC);
animation.play();
- assert_times_equal(animation.currentTime, 1 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 1 * MS_PER_SEC);
}, 'Playing a running animation leaves the current time unchanged');
test(t => {
const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
animation.finish();
- assert_times_equal(animation.currentTime, 100 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 100 * MS_PER_SEC);
animation.play();
- assert_times_equal(animation.currentTime, 0);
+ assert_time_equals_literal(animation.currentTime, 0);
}, 'Playing a finished animation seeks back to the start');
test(t => {
const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
animation.playbackRate = -1;
animation.currentTime = 0;
- assert_times_equal(animation.currentTime, 0);
+ assert_time_equals_literal(animation.currentTime, 0);
animation.play();
- assert_times_equal(animation.currentTime, 100 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 100 * MS_PER_SEC);
}, 'Playing a finished and reversed animation seeks to end');
test(t => {
diff --git a/web-animations/timing-model/animations/set-the-animation-start-time.html b/web-animations/timing-model/animations/set-the-animation-start-time.html
index 1526be05766edb..d2a311d4dd4019 100644
--- a/web-animations/timing-model/animations/set-the-animation-start-time.html
+++ b/web-animations/timing-model/animations/set-the-animation-start-time.html
@@ -80,9 +80,9 @@
// If we set the start time, however, we should clear the hold time.
animation.startTime = document.timeline.currentTime - 2000;
- assert_times_equal(animation.currentTime, 2000,
- 'The current time is calculated from the start time,'
- + ' not the hold time');
+ assert_time_equals_literal(animation.currentTime, 2000,
+ 'The current time is calculated from the start'
+ + ' time, not the hold time');
// Sanity check
assert_equals(animation.playState, 'running',
@@ -99,13 +99,14 @@
// are resolved).
animation.startTime = document.timeline.currentTime - 1000;
assert_equals(animation.playState, 'running');
- assert_times_equal(animation.currentTime, 1000,
- 'Current time is resolved for a running animation')
+ assert_time_equals_literal(animation.currentTime, 1000,
+ 'Current time is resolved for a running animation');
// Clear start time
animation.startTime = null;
- assert_times_equal(animation.currentTime, 1000,
- 'Hold time is set after start time is made unresolved');
+ assert_time_equals_literal(animation.currentTime, 1000,
+ 'Hold time is set after start time is made'
+ + ' unresolved');
assert_equals(animation.playState, 'paused',
'Animation reports it is paused after setting an unresolved'
+ ' start time');
diff --git a/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html b/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html
index 8a4421309b9eda..24f201d550c469 100644
--- a/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html
+++ b/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html
@@ -26,7 +26,7 @@
animation.timeline = document.timeline;
assert_equals(animation.playState, 'paused');
- assert_times_equal(animation.currentTime, 50 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 50 * MS_PER_SEC);
}, 'After setting timeline on paused animation it is still paused');
test(t => {
@@ -39,7 +39,7 @@
animation.timeline = document.timeline;
assert_equals(animation.playState, 'paused');
- assert_times_equal(animation.currentTime, 200 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 200 * MS_PER_SEC);
}, 'After setting timeline on animation paused outside active interval'
+ ' it is still paused');
@@ -141,7 +141,7 @@
assert_false(animation.pending);
assert_equals(animation.playState, 'paused');
- assert_times_equal(animation.currentTime, 50 * MS_PER_SEC);
+ assert_time_equals_literal(animation.currentTime, 50 * MS_PER_SEC);
}, 'After clearing timeline on paused animation it is still paused');
test(t => {