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 |