REGRESSION (iOS 13.4.1): SpeechSynthesisUtterance.onend event won't fire on cancel().
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 May 2020 05:46:51 +0000 (05:46 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 May 2020 05:46:51 +0000 (05:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=211776
<rdar://problem/63130249>

Reviewed by Per Arne Vollan.

With the move to having speech synthesis happen in the client, the cancel case hits a snag.
We cancel the speech job and clear out the current utterance. By the time the cancel callback comes back,
the current utterance is gone and nothing happens.

The fix is to process the speechError event immediately and not wait on the speech synthesizer -- which seems sane,
since we're just cancelling a speech job.

* Modules/speech/SpeechSynthesis.cpp:
(WebCore::SpeechSynthesis::cancel):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@261984 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/speech/SpeechSynthesis.cpp

index fbdd285..ed17acd 100644 (file)
@@ -1,3 +1,21 @@
+2020-05-20  Chris Fleizach  <cfleizach@apple.com>
+
+        REGRESSION (iOS 13.4.1): SpeechSynthesisUtterance.onend event won't fire on cancel().
+        https://bugs.webkit.org/show_bug.cgi?id=211776
+        <rdar://problem/63130249>
+
+        Reviewed by Per Arne Vollan.
+
+        With the move to having speech synthesis happen in the client, the cancel case hits a snag.
+        We cancel the speech job and clear out the current utterance. By the time the cancel callback comes back,
+        the current utterance is gone and nothing happens.
+
+        The fix is to process the speechError event immediately and not wait on the speech synthesizer -- which seems sane,
+        since we're just cancelling a speech job.
+
+        * Modules/speech/SpeechSynthesis.cpp:
+        (WebCore::SpeechSynthesis::cancel):
+
 2020-05-20  Darin Adler  <darin@apple.com>
 
         Dictation context should be an object identifier, not a type-punned pointer
index 668d3cb..00b1843 100644 (file)
@@ -151,6 +151,9 @@ void SpeechSynthesis::cancel()
     m_utteranceQueue.clear();
     if (m_speechSynthesisClient) {
         m_speechSynthesisClient->cancel();
+        // If we wait for cancel to callback speakingErrorOccurred, then m_currentSpeechUtterance will be null
+        // and the event won't be processed. Instead we process the error immediately.
+        speakingErrorOccurred();
         m_currentSpeechUtterance = nullptr;
     } else if (m_platformSpeechSynthesizer) {
         m_platformSpeechSynthesizer->cancel();