Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Unified Diff: chrome/browser/speech/extension_api/tts_engine_extension_observer.cc

Issue 361363003: Support onvoiceschanged for extension-based tts engines. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clang Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/speech/extension_api/tts_engine_extension_observer.cc
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_observer.cc b/chrome/browser/speech/extension_api/tts_engine_extension_observer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..be97a1150f23ce1bd66adec1bd4c196820ff6ca4
--- /dev/null
+++ b/chrome/browser/speech/extension_api/tts_engine_extension_observer.cc
@@ -0,0 +1,141 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/speech/extension_api/tts_engine_extension_observer.h"
+
+#include "base/logging.h"
+#include "base/memory/singleton.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system_factory.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/speech/extension_api/tts_engine_extension_api.h"
+#include "chrome/browser/speech/tts_controller.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_system.h"
+#include "grit/browser_resources.h"
+
+// Factory to load one instance of TtsExtensionLoaderChromeOs per profile.
+class TtsEngineExtensionObserverFactory
+ : public BrowserContextKeyedServiceFactory {
+ public:
+ static TtsEngineExtensionObserver* GetForProfile(Profile* profile) {
+ return static_cast<TtsEngineExtensionObserver*>(
+ GetInstance()->GetServiceForBrowserContext(profile, true));
+ }
+
+ static TtsEngineExtensionObserverFactory* GetInstance() {
+ return Singleton<TtsEngineExtensionObserverFactory>::get();
+ }
+
+ private:
+ friend struct DefaultSingletonTraits<TtsEngineExtensionObserverFactory>;
+
+ TtsEngineExtensionObserverFactory()
+ : BrowserContextKeyedServiceFactory(
+ "TtsEngineExtensionObserver",
+ BrowserContextDependencyManager::GetInstance()) {
+ DependsOn(extensions::ExtensionSystemFactory::GetInstance());
+ }
+
+ virtual ~TtsEngineExtensionObserverFactory() {}
+
+ virtual content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const OVERRIDE {
+ // If given an incognito profile (including the Chrome OS login
+ // profile), share the service with the original profile.
+ return chrome::GetBrowserContextRedirectedInIncognito(context);
+ }
+
+ virtual KeyedService* BuildServiceInstanceFor(
+ content::BrowserContext* profile) const OVERRIDE {
+ return new TtsEngineExtensionObserver(static_cast<Profile*>(profile));
+ }
+};
+
+TtsEngineExtensionObserver* TtsEngineExtensionObserver::GetInstance(
+ Profile* profile) {
+ return TtsEngineExtensionObserverFactory::GetInstance()->GetForProfile(
+ profile);
+}
+
+TtsEngineExtensionObserver::TtsEngineExtensionObserver(Profile* profile)
+ : extension_registry_observer_(this),
+ profile_(profile),
+ saw_tts_engine_added_(false) {
+ extension_registry_observer_.Add(
+ extensions::ExtensionRegistry::Get(profile_));
+
+ extensions::ExtensionSystem* system =
+ extensions::ExtensionSystem::Get(profile_);
+ DCHECK(system);
+ extensions::EventRouter* event_router = system->event_router();
+ DCHECK(event_router);
+ event_router->RegisterObserver(this, tts_engine_events::kOnSpeak);
+ event_router->RegisterObserver(this, tts_engine_events::kOnStop);
+}
+
+TtsEngineExtensionObserver::~TtsEngineExtensionObserver() {
+}
+
+bool TtsEngineExtensionObserver::SawExtensionLoad(
+ const std::string& extension_id,
+ bool update) {
+ bool previously_loaded =
+ engine_extension_ids_.find(extension_id) != engine_extension_ids_.end();
+
+ if (update)
+ engine_extension_ids_.insert(extension_id);
+
+ return previously_loaded;
+}
+
+void TtsEngineExtensionObserver::Shutdown() {
+ extensions::EventRouter::Get(profile_)->UnregisterObserver(this);
+}
+
+bool TtsEngineExtensionObserver::IsLoadedTtsEngine(
+ const std::string& extension_id) {
+ extensions::ExtensionSystem* system =
+ extensions::ExtensionSystem::Get(profile_);
+ DCHECK(system);
+ extensions::EventRouter* event_router = system->event_router();
+ DCHECK(event_router);
+ if (event_router->ExtensionHasEventListener(extension_id,
+ tts_engine_events::kOnSpeak) &&
+ event_router->ExtensionHasEventListener(extension_id,
+ tts_engine_events::kOnStop)) {
+ return true;
+ }
+
+ return false;
+}
+
+void TtsEngineExtensionObserver::OnListenerAdded(
+ const extensions::EventListenerInfo& details) {
+ if (!IsLoadedTtsEngine(details.extension_id))
+ return;
+
+ if (!saw_tts_engine_added_) {
+ saw_tts_engine_added_ = true;
+ TtsController::GetInstance()->RetrySpeakingQueuedUtterances();
+ }
+
+ TtsController::GetInstance()->VoicesChanged();
+ engine_extension_ids_.insert(details.extension_id);
+}
+
+void TtsEngineExtensionObserver::OnExtensionUnloaded(
+ content::BrowserContext* browser_context,
+ const extensions::Extension* extension,
+ extensions::UnloadedExtensionInfo::Reason reason) {
+ if (engine_extension_ids_.find(extension->id()) !=
+ engine_extension_ids_.end()) {
+ engine_extension_ids_.erase(extension->id());
+ TtsController::GetInstance()->VoicesChanged();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698