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_impl.cc b/chrome/browser/speech/tts_controller_impl.cc index 46ea4689a38d1986055058c8bdeef088e732cf79..6156ddb10fba7fe8a1550f45bb364005bd225811 100644 --- a/chrome/browser/speech/tts_controller_impl.cc +++ b/chrome/browser/speech/tts_controller_impl.cc @@ -607,12 +607,14 @@ const PrefService* TtsControllerImpl::GetPrefService( const Utterance* utterance) { const PrefService* prefs = nullptr; // The utterance->browser_context() is null in tests. +#if 0 if (utterance->browser_context()) { const Profile* profile = Profile::FromBrowserContext(utterance->browser_context()); 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 84d2dc145ece4d26c39a338b9a6fcf83a9a3a2da..ab911e1b7d29d675868d1476302d9b6dde7de288 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)); 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; } } @@ -209,10 +234,8 @@ void TtsMessageFilter::Cleanup() { 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 cc9e2806b5c3942472785bf3a3a32e23d859971d..d21fb42f1aca2906b8d8968bd1a46721fbc55edb 100644 --- a/chrome/browser/speech/tts_message_filter.h +++ b/chrome/browser/speech/tts_message_filter.h @@ -9,10 +9,9 @@ #include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" #include "chrome/browser/speech/tts_controller.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" -#include "content/public/browser/notification_registrar.h" namespace content { class BrowserContext; @@ -22,7 +21,6 @@ struct TtsUtteranceRequest; class TtsMessageFilter : public content::BrowserMessageFilter, - public content::NotificationObserver, public UtteranceEventDelegate, public VoicesChangedDelegate { public: @@ -64,15 +62,13 @@ class TtsMessageFilter // 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); };