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

Side by Side Diff: chrome/browser/speech/tts_message_filter.cc

Issue 692203002: Stop utterances from a tab when that tab is closed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't hold lock during destruction Created 6 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
« no previous file with comments | « chrome/browser/speech/tts_message_filter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/tts_message_filter.h" 5 #include "chrome/browser/speech/tts_message_filter.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "content/public/browser/browser_context.h" 9 #include "content/public/browser/browser_context.h"
10 #include "content/public/browser/render_process_host.h" 10 #include "content/public/browser/render_process_host.h"
11 11
12 using content::BrowserThread; 12 using content::BrowserThread;
13 13
14 TtsMessageFilter::TtsMessageFilter(int render_process_id, 14 TtsMessageFilter::TtsMessageFilter(int render_process_id,
15 content::BrowserContext* browser_context) 15 content::BrowserContext* browser_context)
16 : BrowserMessageFilter(TtsMsgStart), 16 : BrowserMessageFilter(TtsMsgStart),
17 render_process_id_(render_process_id), 17 render_process_id_(render_process_id),
18 browser_context_(browser_context), 18 browser_context_(browser_context),
19 weak_ptr_factory_(this) { 19 valid_(true) {
20 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 20 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
21 TtsController::GetInstance()->AddVoicesChangedDelegate(this); 21 TtsController::GetInstance()->AddVoicesChangedDelegate(this);
22 22
23 // Balanced in OnChannelClosingInUIThread() to keep the ref-count be non-zero 23 // Balanced in OnChannelClosingInUIThread() to keep the ref-count be non-zero
24 // until all WeakPtr's are invalidated. 24 // until all pointers to this class are invalidated.
25 AddRef(); 25 AddRef();
26 } 26 }
27 27
28 void TtsMessageFilter::OverrideThreadForMessage( 28 void TtsMessageFilter::OverrideThreadForMessage(
29 const IPC::Message& message, BrowserThread::ID* thread) { 29 const IPC::Message& message, BrowserThread::ID* thread) {
30 switch (message.type()) { 30 switch (message.type()) {
31 case TtsHostMsg_InitializeVoiceList::ID: 31 case TtsHostMsg_InitializeVoiceList::ID:
32 case TtsHostMsg_Speak::ID: 32 case TtsHostMsg_Speak::ID:
33 case TtsHostMsg_Pause::ID: 33 case TtsHostMsg_Pause::ID:
34 case TtsHostMsg_Resume::ID: 34 case TtsHostMsg_Resume::ID:
(...skipping 10 matching lines...) Expand all
45 IPC_MESSAGE_HANDLER(TtsHostMsg_Speak, OnSpeak) 45 IPC_MESSAGE_HANDLER(TtsHostMsg_Speak, OnSpeak)
46 IPC_MESSAGE_HANDLER(TtsHostMsg_Pause, OnPause) 46 IPC_MESSAGE_HANDLER(TtsHostMsg_Pause, OnPause)
47 IPC_MESSAGE_HANDLER(TtsHostMsg_Resume, OnResume) 47 IPC_MESSAGE_HANDLER(TtsHostMsg_Resume, OnResume)
48 IPC_MESSAGE_HANDLER(TtsHostMsg_Cancel, OnCancel) 48 IPC_MESSAGE_HANDLER(TtsHostMsg_Cancel, OnCancel)
49 IPC_MESSAGE_UNHANDLED(handled = false) 49 IPC_MESSAGE_UNHANDLED(handled = false)
50 IPC_END_MESSAGE_MAP() 50 IPC_END_MESSAGE_MAP()
51 return handled; 51 return handled;
52 } 52 }
53 53
54 void TtsMessageFilter::OnChannelClosing() { 54 void TtsMessageFilter::OnChannelClosing() {
55 base::AutoLock lock(mutex_);
56 valid_ = false;
55 BrowserThread::PostTask( 57 BrowserThread::PostTask(
56 BrowserThread::UI, FROM_HERE, 58 BrowserThread::UI, FROM_HERE,
57 base::Bind(&TtsMessageFilter::OnChannelClosingInUIThread, this)); 59 base::Bind(&TtsMessageFilter::OnChannelClosingInUIThread, this));
58 } 60 }
59 61
62 bool TtsMessageFilter::Valid() {
63 base::AutoLock lock(mutex_);
64 return valid_;
65 }
66
60 void TtsMessageFilter::OnDestruct() const { 67 void TtsMessageFilter::OnDestruct() const {
68 {
69 base::AutoLock lock(mutex_);
70 valid_ = false;
71 }
61 BrowserThread::DeleteOnUIThread::Destruct(this); 72 BrowserThread::DeleteOnUIThread::Destruct(this);
62 } 73 }
63 74
75 TtsMessageFilter::~TtsMessageFilter() {
76 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
77 Cleanup();
78 }
79
64 void TtsMessageFilter::OnInitializeVoiceList() { 80 void TtsMessageFilter::OnInitializeVoiceList() {
65 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 81 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
66 TtsController* tts_controller = TtsController::GetInstance(); 82 TtsController* tts_controller = TtsController::GetInstance();
67 std::vector<VoiceData> voices; 83 std::vector<VoiceData> voices;
68 tts_controller->GetVoices(browser_context_, &voices); 84 tts_controller->GetVoices(browser_context_, &voices);
69 85
70 std::vector<TtsVoice> out_voices; 86 std::vector<TtsVoice> out_voices;
71 out_voices.resize(voices.size()); 87 out_voices.resize(voices.size());
72 for (size_t i = 0; i < voices.size(); ++i) { 88 for (size_t i = 0; i < voices.size(); ++i) {
73 TtsVoice& out_voice = out_voices[i]; 89 TtsVoice& out_voice = out_voices[i];
(...skipping 15 matching lines...) Expand all
89 utterance->set_lang(request.lang); 105 utterance->set_lang(request.lang);
90 utterance->set_voice_name(request.voice); 106 utterance->set_voice_name(request.voice);
91 utterance->set_can_enqueue(true); 107 utterance->set_can_enqueue(true);
92 108
93 UtteranceContinuousParameters params; 109 UtteranceContinuousParameters params;
94 params.rate = request.rate; 110 params.rate = request.rate;
95 params.pitch = request.pitch; 111 params.pitch = request.pitch;
96 params.volume = request.volume; 112 params.volume = request.volume;
97 utterance->set_continuous_parameters(params); 113 utterance->set_continuous_parameters(params);
98 114
99 utterance->set_event_delegate(weak_ptr_factory_.GetWeakPtr()); 115 utterance->set_event_delegate(this);
100 116
101 TtsController::GetInstance()->SpeakOrEnqueue(utterance.release()); 117 TtsController::GetInstance()->SpeakOrEnqueue(utterance.release());
102 } 118 }
103 119
104 void TtsMessageFilter::OnPause() { 120 void TtsMessageFilter::OnPause() {
105 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 121 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
106 TtsController::GetInstance()->Pause(); 122 TtsController::GetInstance()->Pause();
107 } 123 }
108 124
109 void TtsMessageFilter::OnResume() { 125 void TtsMessageFilter::OnResume() {
110 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 126 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
111 TtsController::GetInstance()->Resume(); 127 TtsController::GetInstance()->Resume();
112 } 128 }
113 129
114 void TtsMessageFilter::OnCancel() { 130 void TtsMessageFilter::OnCancel() {
115 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 131 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
116 TtsController::GetInstance()->Stop(); 132 TtsController::GetInstance()->Stop();
117 } 133 }
118 134
119 void TtsMessageFilter::OnTtsEvent(Utterance* utterance, 135 void TtsMessageFilter::OnTtsEvent(Utterance* utterance,
120 TtsEventType event_type, 136 TtsEventType event_type,
121 int char_index, 137 int char_index,
122 const std::string& error_message) { 138 const std::string& error_message) {
139 if (!Valid())
140 return;
141
123 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 142 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
124 switch (event_type) { 143 switch (event_type) {
125 case TTS_EVENT_START: 144 case TTS_EVENT_START:
126 Send(new TtsMsg_DidStartSpeaking(utterance->src_id())); 145 Send(new TtsMsg_DidStartSpeaking(utterance->src_id()));
127 break; 146 break;
128 case TTS_EVENT_END: 147 case TTS_EVENT_END:
129 Send(new TtsMsg_DidFinishSpeaking(utterance->src_id())); 148 Send(new TtsMsg_DidFinishSpeaking(utterance->src_id()));
130 break; 149 break;
131 case TTS_EVENT_WORD: 150 case TTS_EVENT_WORD:
132 Send(new TtsMsg_WordBoundary(utterance->src_id(), char_index)); 151 Send(new TtsMsg_WordBoundary(utterance->src_id(), char_index));
(...skipping 17 matching lines...) Expand all
150 case TTS_EVENT_PAUSE: 169 case TTS_EVENT_PAUSE:
151 Send(new TtsMsg_DidPauseSpeaking(utterance->src_id())); 170 Send(new TtsMsg_DidPauseSpeaking(utterance->src_id()));
152 break; 171 break;
153 case TTS_EVENT_RESUME: 172 case TTS_EVENT_RESUME:
154 Send(new TtsMsg_DidResumeSpeaking(utterance->src_id())); 173 Send(new TtsMsg_DidResumeSpeaking(utterance->src_id()));
155 break; 174 break;
156 } 175 }
157 } 176 }
158 177
159 void TtsMessageFilter::OnVoicesChanged() { 178 void TtsMessageFilter::OnVoicesChanged() {
179 if (!Valid())
180 return;
181
160 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 182 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
161 OnInitializeVoiceList(); 183 OnInitializeVoiceList();
162 } 184 }
163 185
164 void TtsMessageFilter::OnChannelClosingInUIThread() { 186 void TtsMessageFilter::OnChannelClosingInUIThread() {
165 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 187 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
166 TtsController::GetInstance()->RemoveVoicesChangedDelegate(this); 188 Cleanup();
167
168 weak_ptr_factory_.InvalidateWeakPtrs();
169 Release(); // Balanced in TtsMessageFilter(). 189 Release(); // Balanced in TtsMessageFilter().
170 } 190 }
171 191
172 TtsMessageFilter::~TtsMessageFilter() { 192 void TtsMessageFilter::Cleanup() {
173 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
174 DCHECK(!weak_ptr_factory_.HasWeakPtrs());
175 TtsController::GetInstance()->RemoveVoicesChangedDelegate(this); 193 TtsController::GetInstance()->RemoveVoicesChangedDelegate(this);
194 TtsController::GetInstance()->RemoveUtteranceEventDelegate(this);
176 } 195 }
OLDNEW
« no previous file with comments | « chrome/browser/speech/tts_message_filter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698