media_stream_infobar_delegate.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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 3// found in the LICENSE file. 4 5#include "chrome/browser/media/media_stream_infobar_delegate.h" 6 7#include "base/logging.h" 8#include "base/metrics/histogram.h" 9#include "base/strings/utf_string_conversions.h" 10#include "chrome/browser/google/google_util.h" 11#include "chrome/browser/infobars/infobar.h" 12#include "chrome/browser/infobars/infobar_service.h" 13#include "chrome/common/url_constants.h" 14#include "content/public/browser/web_contents.h" 15#include "grit/generated_resources.h" 16#include "grit/theme_resources.h" 17#include "ui/base/l10n/l10n_util.h" 18#include "url/gurl.h" 19 20namespace { 21 22enum DevicePermissionActions { 23 kAllowHttps = 0, 24 kAllowHttp, 25 kDeny, 26 kCancel, 27 kPermissionActionsMax // Must always be last! 28}; 29 30} // namespace 31 32MediaStreamInfoBarDelegate::~MediaStreamInfoBarDelegate() { 33} 34 35// static 36bool MediaStreamInfoBarDelegate::Create( 37 content::WebContents* web_contents, 38 const content::MediaStreamRequest& request, 39 const content::MediaResponseCallback& callback) { 40 scoped_ptr<MediaStreamDevicesController> controller( 41 new MediaStreamDevicesController(web_contents, request, callback)); 42 if (controller->DismissInfoBarAndTakeActionOnSettings()) 43 return false; 44 45 InfoBarService* infobar_service = 46 InfoBarService::FromWebContents(web_contents); 47 if (!infobar_service) { 48 // Deny the request if there is no place to show the infobar, e.g. when 49 // the request comes from a background extension page. 50 controller->Deny(false); 51 return false; 52 } 53 54 scoped_ptr<InfoBar> infobar(ConfirmInfoBarDelegate::CreateInfoBar( 55 scoped_ptr<ConfirmInfoBarDelegate>( 56 new MediaStreamInfoBarDelegate(controller.Pass())))); 57 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { 58 InfoBar* old_infobar = infobar_service->infobar_at(i); 59 if (old_infobar->delegate()->AsMediaStreamInfoBarDelegate()) { 60 infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass()); 61 return true; 62 } 63 } 64 infobar_service->AddInfoBar(infobar.Pass()); 65 return true; 66} 67 68MediaStreamInfoBarDelegate::MediaStreamInfoBarDelegate( 69 scoped_ptr<MediaStreamDevicesController> controller) 70 : ConfirmInfoBarDelegate(), 71 controller_(controller.Pass()) { 72 DCHECK(controller_.get()); 73 DCHECK(controller_->HasAudio() || controller_->HasVideo()); 74} 75 76void MediaStreamInfoBarDelegate::InfoBarDismissed() { 77 // Deny the request if the infobar was closed with the 'x' button, since 78 // we don't want WebRTC to be waiting for an answer that will never come. 79 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 80 kCancel, kPermissionActionsMax); 81 controller_->Deny(false); 82} 83 84int MediaStreamInfoBarDelegate::GetIconID() const { 85 return controller_->HasVideo() ? 86 IDR_INFOBAR_MEDIA_STREAM_CAMERA : IDR_INFOBAR_MEDIA_STREAM_MIC; 87} 88 89InfoBarDelegate::Type MediaStreamInfoBarDelegate::GetInfoBarType() const { 90 return PAGE_ACTION_TYPE; 91} 92 93MediaStreamInfoBarDelegate* 94 MediaStreamInfoBarDelegate::AsMediaStreamInfoBarDelegate() { 95 return this; 96} 97 98string16 MediaStreamInfoBarDelegate::GetMessageText() const { 99 int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO; 100 if (!controller_->HasAudio()) 101 message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY; 102 else if (!controller_->HasVideo()) 103 message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY; 104 return l10n_util::GetStringFUTF16( 105 message_id, UTF8ToUTF16(controller_->GetSecurityOriginSpec())); 106} 107 108string16 MediaStreamInfoBarDelegate::GetButtonLabel( 109 InfoBarButton button) const { 110 return l10n_util::GetStringUTF16((button == BUTTON_OK) ? 111 IDS_MEDIA_CAPTURE_ALLOW : IDS_MEDIA_CAPTURE_DENY); 112} 113 114bool MediaStreamInfoBarDelegate::Accept() { 115 GURL origin(controller_->GetSecurityOriginSpec()); 116 if (origin.SchemeIsSecure()) { 117 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 118 kAllowHttps, kPermissionActionsMax); 119 } else { 120 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 121 kAllowHttp, kPermissionActionsMax); 122 } 123 controller_->Accept(true); 124 return true; 125} 126 127bool MediaStreamInfoBarDelegate::Cancel() { 128 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 129 kDeny, kPermissionActionsMax); 130 controller_->Deny(true); 131 return true; 132} 133 134string16 MediaStreamInfoBarDelegate::GetLinkText() const { 135 return l10n_util::GetStringUTF16(IDS_LEARN_MORE); 136} 137 138bool MediaStreamInfoBarDelegate::LinkClicked( 139 WindowOpenDisposition disposition) { 140 web_contents()->OpenURL(content::OpenURLParams( 141 google_util::AppendGoogleLocaleParam( 142 GURL(chrome::kMediaAccessLearnMoreUrl)), 143 content::Referrer(), 144 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, 145 content::PAGE_TRANSITION_LINK, 146 false)); 147 148 return false; // Do not dismiss the info bar. 149} 150