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

Side by Side Diff: chrome/browser/speech/extension_api/tts_engine_extension_api.cc

Issue 15108002: Add Pause and Resume to Web TTS & Extension TTS APIs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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) {
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
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));
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698