From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Heilig Benedek Date: Thu, 18 Oct 2018 17:08:03 -0700 Subject: tts.patch * Adds patch in //chrome/browser/speech/tts_controller_impl.cc to disable calls using chrome profile class. * Adds patch in //chrome/browser/speech/tts_message_filter.cc to remove reference to browser context when its signaled for destruction from content layer. diff --git a/chrome/browser/speech/tts_controller_delegate_impl.cc b/chrome/browser/speech/tts_controller_delegate_impl.cc index dbfed8996b92c8e1208f3455c56447e35f9e9e43..ab85a77adf20b600cd7e400f105ade7b16d53e86 100644 --- a/chrome/browser/speech/tts_controller_delegate_impl.cc +++ b/chrome/browser/speech/tts_controller_delegate_impl.cc @@ -213,6 +213,7 @@ void TtsControllerDelegateImpl::UpdateUtteranceDefaultsFromPrefs( const PrefService* TtsControllerDelegateImpl::GetPrefService( const content::TtsUtterance* utterance) { const PrefService* prefs = nullptr; +#if 0 // The utterance->GetBrowserContext() is null in tests. if (utterance->GetBrowserContext()) { const Profile* profile = @@ -220,6 +221,7 @@ const PrefService* TtsControllerDelegateImpl::GetPrefService( if (profile) prefs = profile->GetPrefs(); } +#endif return prefs; } diff --git a/chrome/browser/speech/tts_message_filter.cc b/chrome/browser/speech/tts_message_filter.cc index b1ccc84efa99a616d9b196f741dfa57018ae1fd2..f0d9b2ec8b765ffb7e4a3460b2627a2009db500f 100644 --- a/chrome/browser/speech/tts_message_filter.cc +++ b/chrome/browser/speech/tts_message_filter.cc @@ -10,8 +10,11 @@ #include "base/logging.h" #include "base/task/post_task.h" #include "chrome/browser/chrome_notification_types.h" +#if 0 #include "chrome/browser/profiles/profile.h" +#endif #include "chrome/common/tts_messages.h" +#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/notification_service.h" @@ -19,6 +22,29 @@ using content::BrowserThread; +namespace { + +class TtsMessageFilterShutdownNotifierFactory + : public BrowserContextKeyedServiceShutdownNotifierFactory { + public: + static TtsMessageFilterShutdownNotifierFactory* GetInstance() { + return base::Singleton::get(); + } + + private: + friend struct base::DefaultSingletonTraits< + TtsMessageFilterShutdownNotifierFactory>; + + TtsMessageFilterShutdownNotifierFactory() + : BrowserContextKeyedServiceShutdownNotifierFactory("TtsMessageFilter") {} + + ~TtsMessageFilterShutdownNotifierFactory() override {} + + DISALLOW_COPY_AND_ASSIGN(TtsMessageFilterShutdownNotifierFactory); +}; + +} // namespace + TtsMessageFilter::TtsMessageFilter(content::BrowserContext* browser_context) : BrowserMessageFilter(TtsMsgStart), browser_context_(browser_context), @@ -26,28 +52,27 @@ TtsMessageFilter::TtsMessageFilter(content::BrowserContext* browser_context) CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); content::TtsController::GetInstance()->AddVoicesChangedDelegate(this); - // TODO(dmazzoni): make it so that we can listen for a BrowserContext - // being destroyed rather than a Profile. http://crbug.com/444668 - Profile* profile = Profile::FromBrowserContext(browser_context); - notification_registrar_.Add(this, - chrome::NOTIFICATION_PROFILE_DESTROYED, - content::Source(profile)); + browser_context_shutdown_notifier_ = + TtsMessageFilterShutdownNotifierFactory::GetInstance() + ->Get(browser_context) + ->Subscribe(base::Bind(&TtsMessageFilter::BrowserContextDestroyed, + base::RetainedRef(this))); // Balanced in OnChannelClosingInUIThread() to keep the ref-count be non-zero // until all pointers to this class are invalidated. AddRef(); } -void TtsMessageFilter::OverrideThreadForMessage( - const IPC::Message& message, BrowserThread::ID* thread) { +void TtsMessageFilter::OverrideThreadForMessage(const IPC::Message& message, + BrowserThread::ID* thread) { switch (message.type()) { - case TtsHostMsg_InitializeVoiceList::ID: - case TtsHostMsg_Speak::ID: - case TtsHostMsg_Pause::ID: - case TtsHostMsg_Resume::ID: - case TtsHostMsg_Cancel::ID: - *thread = BrowserThread::UI; - break; + case TtsHostMsg_InitializeVoiceList::ID: + case TtsHostMsg_Speak::ID: + case TtsHostMsg_Pause::ID: + case TtsHostMsg_Resume::ID: + case TtsHostMsg_Cancel::ID: + *thread = BrowserThread::UI; + break; } } @@ -210,10 +235,8 @@ void TtsMessageFilter::Cleanup() { content::TtsController::GetInstance()->RemoveUtteranceEventDelegate(this); } -void TtsMessageFilter::Observe( - int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { +void TtsMessageFilter::BrowserContextDestroyed() { + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); browser_context_ = nullptr; - notification_registrar_.RemoveAll(); + browser_context_shutdown_notifier_.reset(); } diff --git a/chrome/browser/speech/tts_message_filter.h b/chrome/browser/speech/tts_message_filter.h index 37c62a4d004ccc8e26f36bbc7244c1a0c6c18ecd..3075b45945911cb3019e8a1eb7896d8e33193598 100644 --- a/chrome/browser/speech/tts_message_filter.h +++ b/chrome/browser/speech/tts_message_filter.h @@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" +#include "components/keyed_service/core/keyed_service_shutdown_notifier.h" #include "content/public/browser/browser_message_filter.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_observer.h" @@ -21,7 +22,6 @@ class BrowserContext; struct TtsUtteranceRequest; class TtsMessageFilter : public content::BrowserMessageFilter, - public content::NotificationObserver, public content::UtteranceEventDelegate, public content::VoicesChangedDelegate { public: @@ -63,15 +63,13 @@ class TtsMessageFilter : public content::BrowserMessageFilter, // about to be deleted. bool Valid(); - // content::NotificationObserver implementation. - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; + void BrowserContextDestroyed(); + std::unique_ptr + browser_context_shutdown_notifier_; content::BrowserContext* browser_context_; mutable base::Lock mutex_; mutable bool valid_; - content::NotificationRegistrar notification_registrar_; DISALLOW_COPY_AND_ASSIGN(TtsMessageFilter); };