Index: chrome/browser/speech/extension_api/tts_engine_extension_api.cc |
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc |
index 4c9b8d55efb89dc177fcb9e011085dee6364687b..fa7f9440398ac07c8c45cfad67f84ecb7416ab21 100644 |
--- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc |
+++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc |
@@ -9,6 +9,8 @@ |
#include "base/json/json_writer.h" |
#include "base/values.h" |
#include "chrome/browser/extensions/event_router.h" |
+#include "chrome/browser/extensions/extension_host.h" |
+#include "chrome/browser/extensions/extension_process_manager.h" |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/extension_system.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -17,21 +19,50 @@ |
#include "chrome/browser/speech/tts_controller.h" |
#include "chrome/common/extensions/api/speech/tts_engine_manifest_handler.h" |
#include "chrome/common/extensions/extension.h" |
+#include "chrome/common/extensions/extension_messages.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/render_view_host.h" |
+#include "content/public/common/console_message_level.h" |
+using extensions::EventRouter; |
using extensions::Extension; |
+using extensions::ExtensionSystem; |
namespace constants = tts_extension_api_constants; |
namespace tts_engine_events { |
const char kOnSpeak[] = "ttsEngine.onSpeak"; |
const char kOnStop[] = "ttsEngine.onStop"; |
+const char kOnPause[] = "ttsEngine.onPause"; |
+const char kOnResume[] = "ttsEngine.onResume"; |
}; // namespace tts_engine_events |
+namespace { |
+void WarnIfMissingPauseOrResumeListener( |
+ Profile* profile, EventRouter* event_router, std::string extension_id) { |
+ bool has_onpause = event_router->ExtensionHasEventListener( |
+ extension_id, tts_engine_events::kOnPause); |
+ bool has_onresume = event_router->ExtensionHasEventListener( |
+ extension_id, tts_engine_events::kOnResume); |
+ if (has_onpause == has_onresume) |
+ return; |
+ |
+ ExtensionProcessManager* process_manager = |
+ ExtensionSystem::Get(profile)->process_manager(); |
+ extensions::ExtensionHost* host = |
+ process_manager->GetBackgroundHostForExtension(extension_id); |
+ host->render_process_host()->Send(new ExtensionMsg_AddMessageToConsole( |
+ host->render_view_host()->GetRoutingID(), |
+ content::CONSOLE_MESSAGE_LEVEL_WARNING, |
+ constants::kErrorMissingPauseOrResume)); |
+}; |
+} // anonymous namespace |
+ |
void GetExtensionVoices(Profile* profile, std::vector<VoiceData>* out_voices) { |
ExtensionService* service = profile->GetExtensionService(); |
DCHECK(service); |
- extensions::EventRouter* event_router = |
- extensions::ExtensionSystem::Get(profile)->event_router(); |
+ EventRouter* event_router = |
+ ExtensionSystem::Get(profile)->event_router(); |
DCHECK(event_router); |
const ExtensionSet* extensions = service->extensions(); |
@@ -118,7 +149,7 @@ void ExtensionTtsEngineSpeak(Utterance* utterance, const VoiceData& voice) { |
scoped_ptr<extensions::Event> event(new extensions::Event( |
tts_engine_events::kOnSpeak, args.Pass())); |
event->restrict_to_profile = utterance->profile(); |
- extensions::ExtensionSystem::Get(utterance->profile())->event_router()-> |
+ ExtensionSystem::Get(utterance->profile())->event_router()-> |
DispatchEventToExtension(utterance->extension_id(), event.Pass()); |
} |
@@ -127,10 +158,34 @@ void ExtensionTtsEngineStop(Utterance* utterance) { |
scoped_ptr<extensions::Event> event(new extensions::Event( |
tts_engine_events::kOnStop, args.Pass())); |
event->restrict_to_profile = utterance->profile(); |
- extensions::ExtensionSystem::Get(utterance->profile())->event_router()-> |
+ ExtensionSystem::Get(utterance->profile())->event_router()-> |
DispatchEventToExtension(utterance->extension_id(), event.Pass()); |
} |
+void ExtensionTtsEnginePause(Utterance* utterance) { |
+ scoped_ptr<ListValue> args(new ListValue()); |
+ scoped_ptr<extensions::Event> event(new extensions::Event( |
+ tts_engine_events::kOnPause, args.Pass())); |
+ Profile* profile = utterance->profile(); |
+ event->restrict_to_profile = profile; |
+ EventRouter* event_router = ExtensionSystem::Get(profile)->event_router(); |
+ std::string id = utterance->extension_id(); |
+ event_router->DispatchEventToExtension(id, event.Pass()); |
+ WarnIfMissingPauseOrResumeListener(profile, event_router, id); |
+} |
+ |
+void ExtensionTtsEngineResume(Utterance* utterance) { |
+ scoped_ptr<ListValue> args(new ListValue()); |
+ scoped_ptr<extensions::Event> event(new extensions::Event( |
+ tts_engine_events::kOnResume, args.Pass())); |
+ Profile* profile = utterance->profile(); |
+ event->restrict_to_profile = profile; |
+ EventRouter* event_router = ExtensionSystem::Get(profile)->event_router(); |
+ std::string id = utterance->extension_id(); |
+ event_router->DispatchEventToExtension(id, event.Pass()); |
+ WarnIfMissingPauseOrResumeListener(profile, event_router, id); |
+} |
+ |
bool ExtensionTtsEngineSendTtsEventFunction::RunImpl() { |
int utterance_id; |
std::string error_message; |
@@ -192,6 +247,12 @@ bool ExtensionTtsEngineSendTtsEventFunction::RunImpl() { |
event->GetString(constants::kErrorMessageKey, &error_message); |
controller->OnTtsEvent( |
utterance_id, TTS_EVENT_ERROR, char_index, error_message); |
+ } else if (event_type == constants::kEventTypePause) { |
+ controller->OnTtsEvent( |
+ utterance_id, TTS_EVENT_PAUSE, char_index, std::string()); |
+ } else if (event_type == constants::kEventTypeResume) { |
+ controller->OnTtsEvent( |
+ utterance_id, TTS_EVENT_RESUME, char_index, std::string()); |
} else { |
EXTENSION_FUNCTION_VALIDATE(false); |
} |