Bug 1492283 [wpt PR 13057] - Add SpeechSynthesisErrorEvent IDL interface, a=testonly

Automatic update from web-platform-testsAdd SpeechSynthesisErrorEvent IDL interface

See spec:
https://w3c.github.io/speech-api/#speechsynthesiserrorevent

and discussion on i2s on blink-dev:
https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/8_H3FUZm23g

Previously, errors were just going through as SpeechSynthesisEvents.
This CL now dispatches errors as SpeechSynthesisErrorEvents with an
empty "error" method.

This CL also adds constructors on both SpeechSynthesisEvent and
SpeechSynthesisErrorEvent.

Bug: 885297
Change-Id: I70ba998182943a50e17f2fc11eb7e163d8289e94
Reviewed-on: https://chromium-review.googlesource.com/1231839
Commit-Queue: Charlie Harrison <csharrison@chromium.org>
Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: Philip Jägenstedt <foolip@chromium.org>
Cr-Commit-Position: refs/heads/master@{#595128}

--

wpt-commits: 95b97e23ea267ac700cfa5f3a131581203f15c62
wpt-pr: 13057
This commit is contained in:
Charlie Harrison 2018-10-05 14:21:07 +00:00 committed by moz-wptsync-bot
parent f2c8a6d8f7
commit eb157b9add
4 changed files with 171 additions and 3 deletions

View File

@ -137,7 +137,8 @@ interface SpeechSynthesisUtterance : EventTarget {
attribute EventHandler onboundary;
};
[Exposed=Window]
[Exposed=Window,
Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)]
interface SpeechSynthesisEvent : Event {
readonly attribute SpeechSynthesisUtterance utterance;
readonly attribute unsigned long charIndex;
@ -145,6 +146,13 @@ interface SpeechSynthesisEvent : Event {
readonly attribute DOMString name;
};
dictionary SpeechSynthesisEventInit : EventInit {
required SpeechSynthesisUtterance utterance;
unsigned long charIndex = 0;
float elapsedTime = 0;
DOMString name = "";
};
enum SpeechSynthesisErrorCode {
"canceled",
"interrupted",
@ -160,11 +168,16 @@ enum SpeechSynthesisErrorCode {
"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;

View File

@ -8,7 +8,7 @@
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);

View File

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

View File

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