Changeset 247192 in webkit


Ignore:
Timestamp:
Jul 6, 2019 1:14:16 AM (5 years ago)
Author:
Chris Fleizach
Message:

AX: CrashTracer: com.apple.WebKit.WebContent at WebKit: WebKit::WebSpeechSynthesisClient::speak
https://bugs.webkit.org/show_bug.cgi?id=199435

Reviewed by Ryosuke Niwa.

Ensure we don't access null observers in speech callbacks.

  • WebProcess/WebCoreSupport/WebSpeechSynthesisClient.cpp:

(WebKit::WebSpeechSynthesisClient::voiceList):
(WebKit::WebSpeechSynthesisClient::speak):
(WebKit::WebSpeechSynthesisClient::pause):
(WebKit::WebSpeechSynthesisClient::resume):

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::speakingErrorOccurred):
(WebKit::WebPage::boundaryEventOccurred):
(WebKit::WebPage::voicesDidChange):

Location:
trunk/Source/WebKit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r247190 r247192  
     12019-07-06  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: CrashTracer: com.apple.WebKit.WebContent at WebKit: WebKit::WebSpeechSynthesisClient::speak
     4        https://bugs.webkit.org/show_bug.cgi?id=199435
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Ensure we don't access null observers in speech callbacks.
     9
     10        * WebProcess/WebCoreSupport/WebSpeechSynthesisClient.cpp:
     11        (WebKit::WebSpeechSynthesisClient::voiceList):
     12        (WebKit::WebSpeechSynthesisClient::speak):
     13        (WebKit::WebSpeechSynthesisClient::pause):
     14        (WebKit::WebSpeechSynthesisClient::resume):
     15        * WebProcess/WebPage/WebPage.cpp:
     16        (WebKit::WebPage::speakingErrorOccurred):
     17        (WebKit::WebPage::boundaryEventOccurred):
     18        (WebKit::WebPage::voicesDidChange):
     19
    1202019-07-05  Chris Dumez  <cdumez@apple.com>
    221
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechSynthesisClient.cpp

    r245178 r247192  
    4444
    4545    m_voices.clear();
    46     for (auto& voice : voiceList) {
     46    for (auto& voice : voiceList)
    4747        m_voices.append(WebCore::PlatformSpeechSynthesisVoice::create(voice.voiceURI, voice.name, voice.lang, voice.localService, voice.defaultLang));
    48        
    49     }
    5048    return m_voices;
     49}
     50
     51WebCore::SpeechSynthesisClientObserver* WebSpeechSynthesisClient::corePageObserver() const
     52{
     53    if (m_page.corePage() && m_page.corePage()->speechSynthesisClient() && m_page.corePage()->speechSynthesisClient()->observer())
     54        return m_page.corePage()->speechSynthesisClient()->observer().get();
     55    return nullptr;
    5156}
    5257
     
    5459{
    5560    WTF::CompletionHandler<void()> completionHandler = [this, weakThis = makeWeakPtr(*this)]() mutable {
    56         if (weakThis)
    57             m_page.corePage()->speechSynthesisClient()->observer()->didFinishSpeaking();
     61        if (!weakThis)
     62            return;
     63        if (auto observer = corePageObserver())
     64            observer->didFinishSpeaking();
    5865    };
    5966
     
    6673
    6774    m_page.sendWithAsyncReply(Messages::WebPageProxy::SpeechSynthesisSpeak(utterance->text(), utterance->lang(), utterance->volume(), utterance->rate(), utterance->pitch(), utterance->startTime(), voiceURI, name, lang, localService, isDefault), WTFMove(completionHandler));
    68 
    69     m_page.corePage()->speechSynthesisClient()->observer()->didStartSpeaking();
     75    if (auto observer = corePageObserver())
     76        observer->didStartSpeaking();
    7077}
    7178
     
    7885{
    7986    WTF::CompletionHandler<void()> completionHandler = [this, weakThis = makeWeakPtr(*this)]() mutable {
    80         if (weakThis)
    81             m_page.corePage()->speechSynthesisClient()->observer()->didPauseSpeaking();
     87        if (!weakThis)
     88            return;
     89        if (auto observer = corePageObserver())
     90            observer->didPauseSpeaking();
    8291    };
    8392   
     
    8897{
    8998    WTF::CompletionHandler<void()> completionHandler = [this, weakThis = makeWeakPtr(*this)]() mutable {
    90         if (weakThis)
    91             m_page.corePage()->speechSynthesisClient()->observer()->didResumeSpeaking();
     99        if (!weakThis)
     100            return;
     101        if (auto observer = corePageObserver())
     102            observer->didResumeSpeaking();
    92103    };
    93104   
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechSynthesisClient.h

    r243002 r247192  
    5050    void pause() override;
    5151    void resume() override;
    52    
     52private:
    5353    void setObserver(WeakPtr<WebCore::SpeechSynthesisClientObserver> observer) override { m_observer = observer; }
    5454    WeakPtr<WebCore::SpeechSynthesisClientObserver> observer() const override { return m_observer; }
     55
     56    WebCore::SpeechSynthesisClientObserver* corePageObserver() const;
    5557   
    56 
    57 private:
    5858    WebPage& m_page;
    5959    WeakPtr<WebCore::SpeechSynthesisClientObserver> m_observer;
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r247161 r247192  
    65856585void WebPage::speakingErrorOccurred()
    65866586{
    6587     corePage()->speechSynthesisClient()->observer()->speakingErrorOccurred();
     6587    if (auto observer = corePage()->speechSynthesisClient()->observer())
     6588        observer->speakingErrorOccurred();
    65886589}
    65896590
    65906591void WebPage::boundaryEventOccurred(bool wordBoundary, unsigned charIndex)
    65916592{
    6592     corePage()->speechSynthesisClient()->observer()->boundaryEventOccurred(wordBoundary, charIndex);
     6593    if (auto observer = corePage()->speechSynthesisClient()->observer())
     6594        observer->boundaryEventOccurred(wordBoundary, charIndex);
    65936595}
    65946596
    65956597void WebPage::voicesDidChange()
    65966598{
    6597     corePage()->speechSynthesisClient()->observer()->voicesChanged();
     6599    if (auto observer = corePage()->speechSynthesisClient()->observer())
     6600        observer->voicesChanged();
    65986601}
    65996602#endif
Note: See TracChangeset for help on using the changeset viewer.