| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/speech/extension_api/tts_engine_extension_api.h" | 5 #include "chrome/browser/speech/extension_api/tts_engine_extension_api.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| 11 #include "chrome/browser/extensions/event_router.h" | 11 #include "chrome/browser/extensions/event_router.h" |
| 12 #include "chrome/browser/extensions/extension_host.h" |
| 13 #include "chrome/browser/extensions/extension_process_manager.h" |
| 12 #include "chrome/browser/extensions/extension_service.h" | 14 #include "chrome/browser/extensions/extension_service.h" |
| 13 #include "chrome/browser/extensions/extension_system.h" | 15 #include "chrome/browser/extensions/extension_system.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/speech/extension_api/tts_extension_api.h" | 17 #include "chrome/browser/speech/extension_api/tts_extension_api.h" |
| 16 #include "chrome/browser/speech/extension_api/tts_extension_api_constants.h" | 18 #include "chrome/browser/speech/extension_api/tts_extension_api_constants.h" |
| 17 #include "chrome/browser/speech/tts_controller.h" | 19 #include "chrome/browser/speech/tts_controller.h" |
| 18 #include "chrome/common/extensions/api/speech/tts_engine_manifest_handler.h" | 20 #include "chrome/common/extensions/api/speech/tts_engine_manifest_handler.h" |
| 19 #include "chrome/common/extensions/extension.h" | 21 #include "chrome/common/extensions/extension.h" |
| 22 #include "chrome/common/extensions/extension_messages.h" |
| 23 #include "content/public/browser/render_process_host.h" |
| 24 #include "content/public/browser/render_view_host.h" |
| 25 #include "content/public/common/console_message_level.h" |
| 20 | 26 |
| 27 using extensions::EventRouter; |
| 21 using extensions::Extension; | 28 using extensions::Extension; |
| 29 using extensions::ExtensionSystem; |
| 22 | 30 |
| 23 namespace constants = tts_extension_api_constants; | 31 namespace constants = tts_extension_api_constants; |
| 24 | 32 |
| 25 namespace tts_engine_events { | 33 namespace tts_engine_events { |
| 26 const char kOnSpeak[] = "ttsEngine.onSpeak"; | 34 const char kOnSpeak[] = "ttsEngine.onSpeak"; |
| 27 const char kOnStop[] = "ttsEngine.onStop"; | 35 const char kOnStop[] = "ttsEngine.onStop"; |
| 36 const char kOnPause[] = "ttsEngine.onPause"; |
| 37 const char kOnResume[] = "ttsEngine.onResume"; |
| 28 }; // namespace tts_engine_events | 38 }; // namespace tts_engine_events |
| 29 | 39 |
| 40 namespace { |
| 41 void WarnIfMissingPauseOrResumeListener( |
| 42 Profile* profile, EventRouter* event_router, std::string extension_id) { |
| 43 bool has_onpause = event_router->ExtensionHasEventListener( |
| 44 extension_id, tts_engine_events::kOnPause); |
| 45 bool has_onresume = event_router->ExtensionHasEventListener( |
| 46 extension_id, tts_engine_events::kOnResume); |
| 47 if (has_onpause == has_onresume) |
| 48 return; |
| 49 |
| 50 ExtensionProcessManager* process_manager = |
| 51 ExtensionSystem::Get(profile)->process_manager(); |
| 52 extensions::ExtensionHost* host = |
| 53 process_manager->GetBackgroundHostForExtension(extension_id); |
| 54 host->render_process_host()->Send(new ExtensionMsg_AddMessageToConsole( |
| 55 host->render_view_host()->GetRoutingID(), |
| 56 content::CONSOLE_MESSAGE_LEVEL_WARNING, |
| 57 constants::kErrorMissingPauseOrResume)); |
| 58 }; |
| 59 } // anonymous namespace |
| 60 |
| 30 void GetExtensionVoices(Profile* profile, std::vector<VoiceData>* out_voices) { | 61 void GetExtensionVoices(Profile* profile, std::vector<VoiceData>* out_voices) { |
| 31 ExtensionService* service = profile->GetExtensionService(); | 62 ExtensionService* service = profile->GetExtensionService(); |
| 32 DCHECK(service); | 63 DCHECK(service); |
| 33 extensions::EventRouter* event_router = | 64 EventRouter* event_router = |
| 34 extensions::ExtensionSystem::Get(profile)->event_router(); | 65 ExtensionSystem::Get(profile)->event_router(); |
| 35 DCHECK(event_router); | 66 DCHECK(event_router); |
| 36 | 67 |
| 37 const ExtensionSet* extensions = service->extensions(); | 68 const ExtensionSet* extensions = service->extensions(); |
| 38 ExtensionSet::const_iterator iter; | 69 ExtensionSet::const_iterator iter; |
| 39 for (iter = extensions->begin(); iter != extensions->end(); ++iter) { | 70 for (iter = extensions->begin(); iter != extensions->end(); ++iter) { |
| 40 const Extension* extension = *iter; | 71 const Extension* extension = *iter; |
| 41 | 72 |
| 42 if (!event_router->ExtensionHasEventListener( | 73 if (!event_router->ExtensionHasEventListener( |
| 43 extension->id(), tts_engine_events::kOnSpeak) || | 74 extension->id(), tts_engine_events::kOnSpeak) || |
| 44 !event_router->ExtensionHasEventListener( | 75 !event_router->ExtensionHasEventListener( |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 options->Remove(constants::kIsFinalEventKey, NULL); | 142 options->Remove(constants::kIsFinalEventKey, NULL); |
| 112 if (options->HasKey(constants::kOnEventKey)) | 143 if (options->HasKey(constants::kOnEventKey)) |
| 113 options->Remove(constants::kOnEventKey, NULL); | 144 options->Remove(constants::kOnEventKey, NULL); |
| 114 | 145 |
| 115 args->Set(1, options.release()); | 146 args->Set(1, options.release()); |
| 116 args->Set(2, Value::CreateIntegerValue(utterance->id())); | 147 args->Set(2, Value::CreateIntegerValue(utterance->id())); |
| 117 | 148 |
| 118 scoped_ptr<extensions::Event> event(new extensions::Event( | 149 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 119 tts_engine_events::kOnSpeak, args.Pass())); | 150 tts_engine_events::kOnSpeak, args.Pass())); |
| 120 event->restrict_to_profile = utterance->profile(); | 151 event->restrict_to_profile = utterance->profile(); |
| 121 extensions::ExtensionSystem::Get(utterance->profile())->event_router()-> | 152 ExtensionSystem::Get(utterance->profile())->event_router()-> |
| 122 DispatchEventToExtension(utterance->extension_id(), event.Pass()); | 153 DispatchEventToExtension(utterance->extension_id(), event.Pass()); |
| 123 } | 154 } |
| 124 | 155 |
| 125 void ExtensionTtsEngineStop(Utterance* utterance) { | 156 void ExtensionTtsEngineStop(Utterance* utterance) { |
| 126 scoped_ptr<ListValue> args(new ListValue()); | 157 scoped_ptr<ListValue> args(new ListValue()); |
| 127 scoped_ptr<extensions::Event> event(new extensions::Event( | 158 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 128 tts_engine_events::kOnStop, args.Pass())); | 159 tts_engine_events::kOnStop, args.Pass())); |
| 129 event->restrict_to_profile = utterance->profile(); | 160 event->restrict_to_profile = utterance->profile(); |
| 130 extensions::ExtensionSystem::Get(utterance->profile())->event_router()-> | 161 ExtensionSystem::Get(utterance->profile())->event_router()-> |
| 131 DispatchEventToExtension(utterance->extension_id(), event.Pass()); | 162 DispatchEventToExtension(utterance->extension_id(), event.Pass()); |
| 132 } | 163 } |
| 133 | 164 |
| 165 void ExtensionTtsEnginePause(Utterance* utterance) { |
| 166 scoped_ptr<ListValue> args(new ListValue()); |
| 167 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 168 tts_engine_events::kOnPause, args.Pass())); |
| 169 Profile* profile = utterance->profile(); |
| 170 event->restrict_to_profile = profile; |
| 171 EventRouter* event_router = ExtensionSystem::Get(profile)->event_router(); |
| 172 std::string id = utterance->extension_id(); |
| 173 event_router->DispatchEventToExtension(id, event.Pass()); |
| 174 WarnIfMissingPauseOrResumeListener(profile, event_router, id); |
| 175 } |
| 176 |
| 177 void ExtensionTtsEngineResume(Utterance* utterance) { |
| 178 scoped_ptr<ListValue> args(new ListValue()); |
| 179 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 180 tts_engine_events::kOnResume, args.Pass())); |
| 181 Profile* profile = utterance->profile(); |
| 182 event->restrict_to_profile = profile; |
| 183 EventRouter* event_router = ExtensionSystem::Get(profile)->event_router(); |
| 184 std::string id = utterance->extension_id(); |
| 185 event_router->DispatchEventToExtension(id, event.Pass()); |
| 186 WarnIfMissingPauseOrResumeListener(profile, event_router, id); |
| 187 } |
| 188 |
| 134 bool ExtensionTtsEngineSendTtsEventFunction::RunImpl() { | 189 bool ExtensionTtsEngineSendTtsEventFunction::RunImpl() { |
| 135 int utterance_id; | 190 int utterance_id; |
| 136 std::string error_message; | 191 std::string error_message; |
| 137 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &utterance_id)); | 192 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &utterance_id)); |
| 138 | 193 |
| 139 DictionaryValue* event; | 194 DictionaryValue* event; |
| 140 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &event)); | 195 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &event)); |
| 141 | 196 |
| 142 std::string event_type; | 197 std::string event_type; |
| 143 EXTENSION_FUNCTION_VALIDATE( | 198 EXTENSION_FUNCTION_VALIDATE( |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 controller->OnTtsEvent( | 240 controller->OnTtsEvent( |
| 186 utterance_id, TTS_EVENT_SENTENCE, char_index, std::string()); | 241 utterance_id, TTS_EVENT_SENTENCE, char_index, std::string()); |
| 187 } else if (event_type == constants::kEventTypeMarker) { | 242 } else if (event_type == constants::kEventTypeMarker) { |
| 188 controller->OnTtsEvent( | 243 controller->OnTtsEvent( |
| 189 utterance_id, TTS_EVENT_MARKER, char_index, std::string()); | 244 utterance_id, TTS_EVENT_MARKER, char_index, std::string()); |
| 190 } else if (event_type == constants::kEventTypeError) { | 245 } else if (event_type == constants::kEventTypeError) { |
| 191 std::string error_message; | 246 std::string error_message; |
| 192 event->GetString(constants::kErrorMessageKey, &error_message); | 247 event->GetString(constants::kErrorMessageKey, &error_message); |
| 193 controller->OnTtsEvent( | 248 controller->OnTtsEvent( |
| 194 utterance_id, TTS_EVENT_ERROR, char_index, error_message); | 249 utterance_id, TTS_EVENT_ERROR, char_index, error_message); |
| 250 } else if (event_type == constants::kEventTypePause) { |
| 251 controller->OnTtsEvent( |
| 252 utterance_id, TTS_EVENT_PAUSE, char_index, std::string()); |
| 253 } else if (event_type == constants::kEventTypeResume) { |
| 254 controller->OnTtsEvent( |
| 255 utterance_id, TTS_EVENT_RESUME, char_index, std::string()); |
| 195 } else { | 256 } else { |
| 196 EXTENSION_FUNCTION_VALIDATE(false); | 257 EXTENSION_FUNCTION_VALIDATE(false); |
| 197 } | 258 } |
| 198 | 259 |
| 199 return true; | 260 return true; |
| 200 } | 261 } |
| OLD | NEW |