author | Charlie Harrison <csharrison@chromium.org> |
Fri, 05 Oct 2018 14:21:07 +0000 | |
changeset 440063 | 59cc5078bc4c7f75d04f78a0f068cddf1c01cef1 |
parent 440062 | 159e7ec908050a1c94442af859f4dc03cda392dd |
child 440064 | 045dc67ac4567604c0b05d1cf285a1ebce2ff83f |
push id | 34806 |
push user | nerli@mozilla.com |
push date | Tue, 09 Oct 2018 04:03:56 +0000 |
treeherder | mozilla-central@6a6c984745ef [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | testonly |
bugs | 1492283, 13057, 885297, 1231839, 595128 |
milestone | 64.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/testing/web-platform/tests/interfaces/speech-api.idl +++ b/testing/web-platform/tests/interfaces/speech-api.idl @@ -132,44 +132,57 @@ interface SpeechSynthesisUtterance : Eve attribute EventHandler onend; attribute EventHandler onerror; attribute EventHandler onpause; attribute EventHandler onresume; attribute EventHandler onmark; attribute EventHandler onboundary; }; -[Exposed=Window] +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)] interface SpeechSynthesisEvent : Event { readonly attribute SpeechSynthesisUtterance utterance; readonly attribute unsigned long charIndex; readonly attribute float elapsedTime; readonly attribute DOMString name; }; +dictionary SpeechSynthesisEventInit : EventInit { + required SpeechSynthesisUtterance utterance; + unsigned long charIndex = 0; + float elapsedTime = 0; + DOMString name = ""; +}; + enum SpeechSynthesisErrorCode { "canceled", "interrupted", "audio-busy", "audio-hardware", "network", "synthesis-unavailable", "synthesis-failed", "language-unavailable", "voice-unavailable", "text-too-long", "invalid-argument", "not-allowed", }; -[Exposed=Window] +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)] interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent { readonly attribute SpeechSynthesisErrorCode error; }; +dictionary SpeechSynthesisErrorEventInit : SpeechSynthesisEventInit { + required SpeechSynthesisErrorCode error; +}; + [Exposed=Window] interface SpeechSynthesisVoice { readonly attribute DOMString voiceURI; readonly attribute DOMString name; readonly attribute DOMString lang; readonly attribute boolean localService; readonly attribute boolean default; };
--- a/testing/web-platform/tests/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html +++ b/testing/web-platform/tests/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html @@ -3,14 +3,14 @@ <script src="/resources/testharnessreport.js"></script> <body> <script> // TODO(csharrison): Make this test not tentative once // https://github.com/w3c/speech-api/issues/35 is resolved. async_test(t => { const utter = new SpeechSynthesisUtterance('1'); utter.onerror = t.step_func_done((e) => { - assert_equals(e.name, "not-allowed"); + assert_equals(e.error, "not-allowed"); }); utter.onend = t.step_func_done(() => assert_unreached()); speechSynthesis.speak(utter); }, 'speechSynthesis.speak requires user activation'); </script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/speech-api/SpeechSynthesisErrorEvent-constructor.html @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +/* +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)] +interface SpeechSynthesisErrorEvent : SpeechSynthesisErrorEvent { + readonly attribute SpeechSynthesisErrorCode error; +}; +*/ +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent(); + }); +}, "SpeechSynthesisErrorEvent with no arguments throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type"); + }); +}, "SpeechSynthesisErrorEvent with no eventInitDict throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type", {}); + }); +}, `SpeechSynthesisErrorEvent with empty eventInitDict throws TypeError (requires + utterance and error)`); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type", {error:"not-allowed"}); + }); +}, `SpeechSynthesisErrorEvent with eventInitDict without utterance throws + TypeError`); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type", {utterance: new SpeechSynthesisUtterance()}); + }); +}, `SpeechSynthesisErrorEvent with eventInitDict without error throws + TypeError`); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisErrorEvent("type", {utterance: utterance, error:"not-allowed"}); + assert_equals(event.utterance, utterance); + assert_equals(event.error, "not-allowed"); + assert_equals(event.charIndex, 0); + assert_equals(event.elapsedTime, 0); + assert_equals(event.name, ""); +}, "SpeechSynthesisErrorEvent with eventInitDict having utterance and error"); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisErrorEvent("type", { + utterance: utterance, + charIndex: 5, + elapsedTime: 100, + name: "foo", + error: "synthesis-failed" + }); + assert_equals(event.bubbles, false); + assert_equals(event.cancelable, false); + assert_equals(event.type, "type"); + assert_equals(event.utterance, utterance); + assert_equals(event.charIndex, 5); + assert_equals(event.elapsedTime, 100); + assert_equals(event.name, "foo"); + assert_equals(event.error, "synthesis-failed"); +}, "SpeechSynthesisErrorEvent with custom eventInitDict"); + +test(() => { + function createEventFunc(error) { + return () => { + new SpeechSynthesisErrorEvent("type", { + utterance: new SpeechSynthesisUtterance(), + error: error + }); + }; + }; + assert_throws(new TypeError(), createEventFunc("")); + assert_throws(new TypeError(), createEventFunc("foo")); + assert_throws(new TypeError(), createEventFunc("bar")); +}, "SpeechSynthesisErrorEvent with wrong error enum"); +</script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/speech-api/SpeechSynthesisEvent-constructor.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +/* +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)] +interface SpeechSynthesisEvent : Event { + readonly attribute SpeechSynthesisUtterance utterance; + readonly attribute unsigned long charIndex; + readonly attribute float elapsedTime; + readonly attribute DOMString name; +}; +*/ +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent(); + }); +}, "SpeechSynthesisEvent with no arguments throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent("type"); + }); +}, "SpeechSynthesisEvent with no eventInitDict throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent("type", {}); + }); +}, `SpeechSynthesisEvent with empty eventInitDict throws TypeError (requires + utterance)`); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent("type", {charIndex: 10, elapsedTime: 50, name:"foo"}); + }); +}, `SpeechSynthesisEvent with eventInitDict not having utterance throws + TypeError`); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisEvent("type", {utterance: utterance}); + assert_equals(event.utterance, utterance); + assert_equals(event.charIndex, 0); + assert_equals(event.elapsedTime, 0); + assert_equals(event.name, ""); +}, "SpeechSynthesisEvent with eventInitDict having an utterance"); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisEvent("type", { + utterance: utterance, + charIndex: 5, + elapsedTime: 100, + name: "foo" + }); + assert_equals(event.bubbles, false); + assert_equals(event.cancelable, false); + assert_equals(event.type, "type"); + assert_equals(event.utterance, utterance); + assert_equals(event.charIndex, 5); + assert_equals(event.elapsedTime, 100); + assert_equals(event.name, "foo"); +}, "SpeechSynthesisEvent with custom eventInitDict"); +</script>