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

Side by Side Diff: chrome/browser/extensions/extension_tts_api_controller.cc

Issue 8437080: Fix crash when TTS utterances are queued on shutdown. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extensions/extension_tts_api_controller.h" 5 #include "chrome/browser/extensions/extension_tts_api_controller.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/float_util.h" 10 #include "base/float_util.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 ExtensionTtsController::ExtensionTtsController() 143 ExtensionTtsController::ExtensionTtsController()
144 : current_utterance_(NULL), 144 : current_utterance_(NULL),
145 platform_impl_(NULL) { 145 platform_impl_(NULL) {
146 } 146 }
147 147
148 ExtensionTtsController::~ExtensionTtsController() { 148 ExtensionTtsController::~ExtensionTtsController() {
149 if (current_utterance_) { 149 if (current_utterance_) {
150 current_utterance_->Finish(); 150 current_utterance_->Finish();
151 delete current_utterance_; 151 delete current_utterance_;
152 } 152 }
153 ClearUtteranceQueue(); 153
154 // Clear any queued utterances too.
155 ClearUtteranceQueue(false); // Don't sent events.
154 } 156 }
155 157
156 void ExtensionTtsController::SpeakOrEnqueue(Utterance* utterance) { 158 void ExtensionTtsController::SpeakOrEnqueue(Utterance* utterance) {
157 if (IsSpeaking() && utterance->can_enqueue()) { 159 if (IsSpeaking() && utterance->can_enqueue()) {
158 utterance_queue_.push(utterance); 160 utterance_queue_.push(utterance);
159 } else { 161 } else {
160 Stop(); 162 Stop();
161 SpeakNow(utterance); 163 SpeakNow(utterance);
162 } 164 }
163 } 165 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 if (current_utterance_ && !current_utterance_->extension_id().empty()) { 204 if (current_utterance_ && !current_utterance_->extension_id().empty()) {
203 ExtensionTtsEngineStop(current_utterance_); 205 ExtensionTtsEngineStop(current_utterance_);
204 } else { 206 } else {
205 GetPlatformImpl()->clear_error(); 207 GetPlatformImpl()->clear_error();
206 GetPlatformImpl()->StopSpeaking(); 208 GetPlatformImpl()->StopSpeaking();
207 } 209 }
208 210
209 if (current_utterance_) 211 if (current_utterance_)
210 current_utterance_->OnTtsEvent(TTS_EVENT_INTERRUPTED, -1, std::string()); 212 current_utterance_->OnTtsEvent(TTS_EVENT_INTERRUPTED, -1, std::string());
211 FinishCurrentUtterance(); 213 FinishCurrentUtterance();
212 ClearUtteranceQueue(); 214 ClearUtteranceQueue(true); // Send events.
213 } 215 }
214 216
215 void ExtensionTtsController::OnTtsEvent(int utterance_id, 217 void ExtensionTtsController::OnTtsEvent(int utterance_id,
216 TtsEventType event_type, 218 TtsEventType event_type,
217 int char_index, 219 int char_index,
218 const std::string& error_message) { 220 const std::string& error_message) {
219 // We may sometimes receive completion callbacks "late", after we've 221 // We may sometimes receive completion callbacks "late", after we've
220 // already finished the utterance (for example because another utterance 222 // already finished the utterance (for example because another utterance
221 // interrupted or we got a call to Stop). This is normal and we can 223 // interrupted or we got a call to Stop). This is normal and we can
222 // safely just ignore these events. 224 // safely just ignore these events.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 void ExtensionTtsController::SpeakNextUtterance() { 290 void ExtensionTtsController::SpeakNextUtterance() {
289 // Start speaking the next utterance in the queue. Keep trying in case 291 // Start speaking the next utterance in the queue. Keep trying in case
290 // one fails but there are still more in the queue to try. 292 // one fails but there are still more in the queue to try.
291 while (!utterance_queue_.empty() && !current_utterance_) { 293 while (!utterance_queue_.empty() && !current_utterance_) {
292 Utterance* utterance = utterance_queue_.front(); 294 Utterance* utterance = utterance_queue_.front();
293 utterance_queue_.pop(); 295 utterance_queue_.pop();
294 SpeakNow(utterance); 296 SpeakNow(utterance);
295 } 297 }
296 } 298 }
297 299
298 void ExtensionTtsController::ClearUtteranceQueue() { 300 void ExtensionTtsController::ClearUtteranceQueue(bool send_events) {
299 while (!utterance_queue_.empty()) { 301 while (!utterance_queue_.empty()) {
300 Utterance* utterance = utterance_queue_.front(); 302 Utterance* utterance = utterance_queue_.front();
301 utterance_queue_.pop(); 303 utterance_queue_.pop();
302 utterance->OnTtsEvent(TTS_EVENT_CANCELLED, -1, std::string()); 304 if (send_events)
305 utterance->OnTtsEvent(TTS_EVENT_CANCELLED, -1, std::string());
306 else
307 utterance->Finish();
303 delete utterance; 308 delete utterance;
304 } 309 }
305 } 310 }
306 311
307 void ExtensionTtsController::SetPlatformImpl( 312 void ExtensionTtsController::SetPlatformImpl(
308 ExtensionTtsPlatformImpl* platform_impl) { 313 ExtensionTtsPlatformImpl* platform_impl) {
309 platform_impl_ = platform_impl; 314 platform_impl_ = platform_impl;
310 } 315 }
311 316
312 int ExtensionTtsController::QueueSize() { 317 int ExtensionTtsController::QueueSize() {
313 return static_cast<int>(utterance_queue_.size()); 318 return static_cast<int>(utterance_queue_.size());
314 } 319 }
315 320
316 ExtensionTtsPlatformImpl* ExtensionTtsController::GetPlatformImpl() { 321 ExtensionTtsPlatformImpl* ExtensionTtsController::GetPlatformImpl() {
317 if (!platform_impl_) 322 if (!platform_impl_)
318 platform_impl_ = ExtensionTtsPlatformImpl::GetInstance(); 323 platform_impl_ = ExtensionTtsPlatformImpl::GetInstance();
319 return platform_impl_; 324 return platform_impl_;
320 } 325 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698