Chromium Code Reviews| 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) { |
|
not at google - send to devlin
2013/05/20 17:29:53
passing in the profile and event router would be u
dmazzoni
2013/05/21 04:56:28
Method of what class? This isn't being called from
not at google - send to devlin
2013/05/21 17:22:55
ah sorry, misread and assumed this was on an exten
|
| + 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)); |
|
not at google - send to devlin
2013/05/20 17:29:53
this is pretty handy, I think there are lots of pl
dmazzoni
2013/05/21 04:56:28
A method in UIThreadExtensionFunction wouldn't hel
|
| +}; |
| +} // 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); |
| } |