| 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/media/media_stream_capture_indicator.h" | 5 #include "chrome/browser/media/media_stream_capture_indicator.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/i18n/rtl.h" | 8 #include "base/i18n/rtl.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/app/chrome_command_ids.h" | 10 #include "chrome/app/chrome_command_ids.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 } | 126 } |
| 127 | 127 |
| 128 void MediaStreamCaptureIndicator::DoDevicesClosedOnUIThread( | 128 void MediaStreamCaptureIndicator::DoDevicesClosedOnUIThread( |
| 129 int render_process_id, | 129 int render_process_id, |
| 130 int render_view_id, | 130 int render_view_id, |
| 131 const content::MediaStreamDevices& devices) { | 131 const content::MediaStreamDevices& devices) { |
| 132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 133 if (!status_icon_) | 133 if (!status_icon_) |
| 134 return; | 134 return; |
| 135 | 135 |
| 136 DCHECK(!tabs_.empty()); | |
| 137 RemoveCaptureDeviceTab(render_process_id, render_view_id, devices); | 136 RemoveCaptureDeviceTab(render_process_id, render_view_id, devices); |
| 138 } | 137 } |
| 139 | 138 |
| 140 void MediaStreamCaptureIndicator::CreateStatusTray() { | 139 void MediaStreamCaptureIndicator::CreateStatusTray() { |
| 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 142 if (status_icon_) | 141 if (status_icon_) |
| 143 return; | 142 return; |
| 144 | 143 |
| 145 // If there is no browser process, we should not create the status tray. | 144 // If there is no browser process, we should not create the status tray. |
| 146 if (!g_browser_process) | 145 if (!g_browser_process) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 message_id = IDS_MEDIA_STREAM_STATUS_TRAY_BALLOON_BODY_VIDEO_ONLY; | 189 message_id = IDS_MEDIA_STREAM_STATUS_TRAY_BALLOON_BODY_VIDEO_ONLY; |
| 191 | 190 |
| 192 string16 body = l10n_util::GetStringFUTF16( | 191 string16 body = l10n_util::GetStringFUTF16( |
| 193 message_id, GetSecurityOrigin(render_process_id, render_view_id)); | 192 message_id, GetSecurityOrigin(render_process_id, render_view_id)); |
| 194 | 193 |
| 195 status_icon_->DisplayBalloon(*balloon_image_, title, body); | 194 status_icon_->DisplayBalloon(*balloon_image_, title, body); |
| 196 } | 195 } |
| 197 | 196 |
| 198 void MediaStreamCaptureIndicator::Hide() { | 197 void MediaStreamCaptureIndicator::Hide() { |
| 199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 199 DCHECK(tabs_.empty()); |
| 200 if (!status_icon_) | 200 if (!status_icon_) |
| 201 return; | 201 return; |
| 202 | 202 |
| 203 // If there is no browser process, we should not do anything. | 203 // If there is no browser process, we should not do anything. |
| 204 if (!g_browser_process) | 204 if (!g_browser_process) |
| 205 return; | 205 return; |
| 206 | 206 |
| 207 StatusTray* status_tray = g_browser_process->status_tray(); | 207 StatusTray* status_tray = g_browser_process->status_tray(); |
| 208 if (status_tray != NULL) { | 208 if (status_tray != NULL) { |
| 209 status_tray->RemoveStatusIcon(status_icon_); | 209 status_tray->RemoveStatusIcon(status_icon_); |
| 210 status_icon_ = NULL; | 210 status_icon_ = NULL; |
| 211 } | 211 } |
| 212 } | 212 } |
| 213 | 213 |
| 214 void MediaStreamCaptureIndicator::UpdateStatusTrayIconContextMenu() { | 214 void MediaStreamCaptureIndicator::UpdateStatusTrayIconContextMenu() { |
| 215 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 215 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 216 scoped_ptr<ui::SimpleMenuModel> menu(new ui::SimpleMenuModel(this)); | 216 scoped_ptr<ui::SimpleMenuModel> menu(new ui::SimpleMenuModel(this)); |
| 217 | 217 |
| 218 bool audio = false; | 218 bool audio = false; |
| 219 bool video = false; | 219 bool video = false; |
| 220 int command_id = IDC_MEDIA_CONTEXT_MEDIA_STREAM_CAPTURE_LIST_FIRST; | 220 int command_id = IDC_MEDIA_CONTEXT_MEDIA_STREAM_CAPTURE_LIST_FIRST; |
| 221 for (CaptureDeviceTabs::iterator iter = tabs_.begin(); | 221 for (CaptureDeviceTabs::iterator iter = tabs_.begin(); |
| 222 iter != tabs_.end(); ++iter) { | 222 iter != tabs_.end(); ++iter) { |
| 223 string16 tab_title = GetTitle(iter->render_process_id, | 223 string16 tab_title = GetTitle(iter->render_process_id, |
| 224 iter->render_view_id); | 224 iter->render_view_id); |
| 225 // The tab has gone away. | 225 // The tab has gone away. |
| 226 if (tab_title.empty()) | 226 if (tab_title.empty()) { |
| 227 // Delete the entry since the tab has gone away. |
| 228 tabs_.erase(iter); |
| 227 continue; | 229 continue; |
| 230 } |
| 228 | 231 |
| 229 // Check if any audio and video devices have been used. | 232 // Check if any audio and video devices have been used. |
| 230 audio = audio || iter->audio_ref_count > 0; | 233 audio = audio || iter->audio_ref_count > 0; |
| 231 video = video || iter->video_ref_count > 0; | 234 video = video || iter->video_ref_count > 0; |
| 232 | 235 |
| 233 string16 message = l10n_util::GetStringFUTF16( | 236 string16 message = l10n_util::GetStringFUTF16( |
| 234 IDS_MEDIA_STREAM_STATUS_TRAY_MENU_ITEM, tab_title); | 237 IDS_MEDIA_STREAM_STATUS_TRAY_MENU_ITEM, tab_title); |
| 235 menu->AddItem(command_id, message); | 238 menu->AddItem(command_id, message); |
| 236 | 239 |
| 237 // If reaching the maximum number, no more item will be added to the menu. | 240 // If reaching the maximum number, no more item will be added to the menu. |
| 238 if (command_id == IDC_MEDIA_CONTEXT_MEDIA_STREAM_CAPTURE_LIST_LAST) | 241 if (command_id == IDC_MEDIA_CONTEXT_MEDIA_STREAM_CAPTURE_LIST_LAST) |
| 239 break; | 242 break; |
| 240 | 243 |
| 241 ++command_id; | 244 ++command_id; |
| 242 } | 245 } |
| 243 | 246 |
| 244 // All the tabs have gone away. | 247 if (!audio && !video) { |
| 245 if (!audio && !video) | 248 Hide(); |
| 246 return; | 249 return; |
| 250 } |
| 247 | 251 |
| 248 // The icon will take the ownership of the passed context menu. | 252 // The icon will take the ownership of the passed context menu. |
| 249 status_icon_->SetContextMenu(menu.release()); | 253 status_icon_->SetContextMenu(menu.release()); |
| 250 UpdateStatusTrayIconDisplay(audio, video); | 254 UpdateStatusTrayIconDisplay(audio, video); |
| 251 } | 255 } |
| 252 | 256 |
| 253 void MediaStreamCaptureIndicator::UpdateStatusTrayIconDisplay( | 257 void MediaStreamCaptureIndicator::UpdateStatusTrayIconDisplay( |
| 254 bool audio, bool video) { | 258 bool audio, bool video) { |
| 255 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 256 DCHECK(audio || video); | 260 DCHECK(audio || video); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 --iter->video_ref_count; | 326 --iter->video_ref_count; |
| 323 | 327 |
| 324 DCHECK_GE(iter->audio_ref_count, 0); | 328 DCHECK_GE(iter->audio_ref_count, 0); |
| 325 DCHECK_GE(iter->video_ref_count, 0); | 329 DCHECK_GE(iter->video_ref_count, 0); |
| 326 } | 330 } |
| 327 | 331 |
| 328 // Remove the tab if all the devices have been closed. | 332 // Remove the tab if all the devices have been closed. |
| 329 if (iter->audio_ref_count == 0 && iter->video_ref_count == 0) | 333 if (iter->audio_ref_count == 0 && iter->video_ref_count == 0) |
| 330 tabs_.erase(iter); | 334 tabs_.erase(iter); |
| 331 | 335 |
| 332 if (tabs_.empty()) | 336 UpdateStatusTrayIconContextMenu(); |
| 333 Hide(); | |
| 334 else | |
| 335 UpdateStatusTrayIconContextMenu(); | |
| 336 } | 337 } |
| 337 | 338 |
| 338 string16 MediaStreamCaptureIndicator::GetTitle(int render_process_id, | 339 string16 MediaStreamCaptureIndicator::GetTitle(int render_process_id, |
| 339 int render_view_id) const { | 340 int render_view_id) const { |
| 340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 341 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 341 WebContents* tab_content = tab_util::GetWebContentsByID( | 342 WebContents* tab_content = tab_util::GetWebContentsByID( |
| 342 render_process_id, render_view_id); | 343 render_process_id, render_view_id); |
| 343 if (!tab_content) | 344 if (!tab_content) |
| 344 return string16(); | 345 return string16(); |
| 345 | 346 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 372 | 373 |
| 373 // Remove the last character if it is a '/'. | 374 // Remove the last character if it is a '/'. |
| 374 if (!security_origin.empty()) { | 375 if (!security_origin.empty()) { |
| 375 std::string::iterator it = security_origin.end() - 1; | 376 std::string::iterator it = security_origin.end() - 1; |
| 376 if (*it == '/') | 377 if (*it == '/') |
| 377 security_origin.erase(it); | 378 security_origin.erase(it); |
| 378 } | 379 } |
| 379 | 380 |
| 380 return UTF8ToUTF16(security_origin); | 381 return UTF8ToUTF16(security_origin); |
| 381 } | 382 } |
| OLD | NEW |