mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 20:25:44 +00:00
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:
parent
f2c8a6d8f7
commit
eb157b9add
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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>
|
@ -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>
|
Loading…
Reference in New Issue
Block a user