summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgbillock@chromium.org <gbillock@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-10 06:39:53 +0000
committergbillock@chromium.org <gbillock@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-10 06:39:53 +0000
commitd23cdeee7491760098a36fd79e192500d8722570 (patch)
tree0859897b2b19b20059a0f726a151ffe26536d543
parent6b81e34b959bf55750a4960adc7e952a497087c1 (diff)
downloadchromium_src-d23cdeee7491760098a36fd79e192500d8722570.zip
chromium_src-d23cdeee7491760098a36fd79e192500d8722570.tar.gz
chromium_src-d23cdeee7491760098a36fd79e192500d8722570.tar.bz2
[WebsiteSettings] Change permission bubble API to adapt to new mocks.
This adds cancellation ability for the clients that will need it. Adds user gesture awareness to the API. Removes button customization. Adds icons. Some code reorganization as well. R=leng@google.com BUG=332115 Review URL: https://codereview.chromium.org/176053002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255889 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chrome_quota_permission_context.cc20
-rw-r--r--chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc25
-rw-r--r--chrome/browser/custom_handlers/register_protocol_handler_permission_request.h11
-rw-r--r--chrome/browser/download/download_permission_request.cc19
-rw-r--r--chrome/browser/download/download_permission_request.h5
-rw-r--r--chrome/browser/download/download_request_limiter_unittest.cc2
-rw-r--r--chrome/browser/geolocation/chrome_geolocation_permission_context.cc22
-rw-r--r--chrome/browser/media/chrome_midi_permission_context.cc19
-rw-r--r--chrome/browser/media/media_stream_devices_controller.cc18
-rw-r--r--chrome/browser/media/media_stream_devices_controller.h5
-rw-r--r--chrome/browser/notifications/desktop_notification_service.cc21
-rw-r--r--chrome/browser/ui/browser.cc3
-rw-r--r--chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h1
-rw-r--r--chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.mm6
-rw-r--r--chrome/browser/ui/views/website_settings/permissions_bubble_view.cc23
-rw-r--r--chrome/browser/ui/views/website_settings/permissions_bubble_view.h1
-rw-r--r--chrome/browser/ui/website_settings/mock_permission_bubble_request.cc12
-rw-r--r--chrome/browser/ui/website_settings/mock_permission_bubble_request.h6
-rw-r--r--chrome/browser/ui/website_settings/permission_bubble_manager.cc81
-rw-r--r--chrome/browser/ui/website_settings/permission_bubble_manager.h18
-rw-r--r--chrome/browser/ui/website_settings/permission_bubble_manager_unittest.cc77
-rw-r--r--chrome/browser/ui/website_settings/permission_bubble_request.h29
-rw-r--r--chrome/browser/ui/website_settings/permission_bubble_view.h16
23 files changed, 310 insertions, 130 deletions
diff --git a/chrome/browser/chrome_quota_permission_context.cc b/chrome/browser/chrome_quota_permission_context.cc
index fc03747..f2ef8045 100644
--- a/chrome/browser/chrome_quota_permission_context.cc
+++ b/chrome/browser/chrome_quota_permission_context.cc
@@ -22,6 +22,7 @@
#include "content/public/browser/web_contents.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
+#include "grit/theme_resources.h"
#include "net/base/net_util.h"
#include "ui/base/l10n/l10n_util.h"
#include "url/gurl.h"
@@ -47,10 +48,11 @@ class QuotaPermissionRequest : public PermissionBubbleRequest {
virtual ~QuotaPermissionRequest();
// PermissionBubbleRequest:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
@@ -80,6 +82,11 @@ QuotaPermissionRequest::QuotaPermissionRequest(
QuotaPermissionRequest::~QuotaPermissionRequest() {}
+int QuotaPermissionRequest::GetIconID() const {
+ // TODO(gbillock): get the proper image here
+ return IDR_INFOBAR_WARNING;
+}
+
base::string16 QuotaPermissionRequest::GetMessageText() const {
return l10n_util::GetStringFUTF16(
(requested_quota_ > kRequestLargeQuotaThreshold ?
@@ -92,12 +99,13 @@ base::string16 QuotaPermissionRequest::GetMessageTextFragment() const {
return l10n_util::GetStringUTF16(IDS_REQUEST_QUOTA_PERMISSION_FRAGMENT);
}
-base::string16 QuotaPermissionRequest::GetAlternateAcceptButtonText() const {
- return base::string16();
+bool QuotaPermissionRequest::HasUserGesture() const {
+ // TODO(gbillock): plumb this through
+ return false;
}
-base::string16 QuotaPermissionRequest::GetAlternateDenyButtonText() const {
- return base::string16();
+GURL QuotaPermissionRequest::GetRequestingHostname() const {
+ return origin_url_;
}
void QuotaPermissionRequest::PermissionGranted() {
diff --git a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
index 1930539..11c206f 100644
--- a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
+++ b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
#include "content/public/browser/user_metrics.h"
#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
namespace {
@@ -26,13 +27,21 @@ base::string16 GetProtocolName(
RegisterProtocolHandlerPermissionRequest
::RegisterProtocolHandlerPermissionRequest(
ProtocolHandlerRegistry* registry,
- const ProtocolHandler& handler)
+ const ProtocolHandler& handler,
+ GURL url,
+ bool user_gesture)
: registry_(registry),
- handler_(handler) {}
+ handler_(handler),
+ url_(url),
+ user_gesture_(user_gesture) {}
RegisterProtocolHandlerPermissionRequest::
~RegisterProtocolHandlerPermissionRequest() {}
+int RegisterProtocolHandlerPermissionRequest::GetIconID() const {
+ return IDR_REGISTER_PROTOCOL_HANDLER;
+}
+
base::string16
RegisterProtocolHandlerPermissionRequest::GetMessageText() const {
ProtocolHandler old_handler = registry_->GetHandlerFor(handler_.protocol());
@@ -56,16 +65,12 @@ RegisterProtocolHandlerPermissionRequest::GetMessageTextFragment() const {
GetProtocolName(handler_), old_handler.title());
}
-base::string16 RegisterProtocolHandlerPermissionRequest::
-GetAlternateAcceptButtonText() const {
- return l10n_util::GetStringFUTF16(IDS_REGISTER_PROTOCOL_HANDLER_ACCEPT,
- handler_.title());
+bool RegisterProtocolHandlerPermissionRequest::HasUserGesture() const {
+ return user_gesture_;
}
-base::string16 RegisterProtocolHandlerPermissionRequest::
-GetAlternateDenyButtonText() const {
- return l10n_util::GetStringFUTF16(IDS_REGISTER_PROTOCOL_HANDLER_DENY,
- handler_.title());
+GURL RegisterProtocolHandlerPermissionRequest::GetRequestingHostname() const {
+ return url_;
}
void RegisterProtocolHandlerPermissionRequest::PermissionGranted() {
diff --git a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
index 2486d38..151b9d7 100644
--- a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
+++ b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
@@ -18,14 +18,17 @@ class RegisterProtocolHandlerPermissionRequest
public:
RegisterProtocolHandlerPermissionRequest(
ProtocolHandlerRegistry* registry,
- const ProtocolHandler& handler);
+ const ProtocolHandler& handler,
+ GURL url,
+ bool user_gesture);
virtual ~RegisterProtocolHandlerPermissionRequest();
// PermissionBubbleRequest:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
@@ -34,6 +37,8 @@ class RegisterProtocolHandlerPermissionRequest
private:
ProtocolHandlerRegistry* registry_;
ProtocolHandler handler_;
+ GURL url_;
+ bool user_gesture_;
DISALLOW_COPY_AND_ASSIGN(RegisterProtocolHandlerPermissionRequest);
};
diff --git a/chrome/browser/download/download_permission_request.cc b/chrome/browser/download/download_permission_request.cc
index b671114..18e1995 100644
--- a/chrome/browser/download/download_permission_request.cc
+++ b/chrome/browser/download/download_permission_request.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/download/download_permission_request.h"
+#include "content/public/browser/web_contents.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
@@ -14,6 +15,10 @@ DownloadPermissionRequest::DownloadPermissionRequest(
DownloadPermissionRequest::~DownloadPermissionRequest() {}
+int DownloadPermissionRequest::GetIconID() const {
+ return IDR_INFOBAR_MULTIPLE_DOWNLOADS;
+}
+
base::string16 DownloadPermissionRequest::GetMessageText() const {
return l10n_util::GetStringUTF16(IDS_MULTI_DOWNLOAD_WARNING);
}
@@ -22,12 +27,18 @@ base::string16 DownloadPermissionRequest::GetMessageTextFragment() const {
return l10n_util::GetStringUTF16(IDS_MULTI_DOWNLOAD_PERMISSION_FRAGMENT);
}
-base::string16 DownloadPermissionRequest::GetAlternateAcceptButtonText() const {
- return l10n_util::GetStringUTF16(IDS_MULTI_DOWNLOAD_WARNING_ALLOW);
+bool DownloadPermissionRequest::HasUserGesture() const {
+ // TODO(gbillock): user gesture for multiple downloads is difficult to
+ // propagate, and the normal thing is that it is background.
+ return false;
}
-base::string16 DownloadPermissionRequest::GetAlternateDenyButtonText() const {
- return l10n_util::GetStringUTF16(IDS_MULTI_DOWNLOAD_WARNING_DENY);
+GURL DownloadPermissionRequest::GetRequestingHostname() const {
+ const content::WebContents* web_contents = host_->web_contents();
+ if (web_contents) {
+ return web_contents->GetURL();
+ }
+ return GURL();
}
void DownloadPermissionRequest::PermissionGranted() {
diff --git a/chrome/browser/download/download_permission_request.h b/chrome/browser/download/download_permission_request.h
index 4337636..047c375 100644
--- a/chrome/browser/download/download_permission_request.h
+++ b/chrome/browser/download/download_permission_request.h
@@ -21,10 +21,11 @@ class DownloadPermissionRequest : public PermissionBubbleRequest {
virtual ~DownloadPermissionRequest();
// PermisisonBubbleDelegate:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
diff --git a/chrome/browser/download/download_request_limiter_unittest.cc b/chrome/browser/download/download_request_limiter_unittest.cc
index cf236ba..f9b4632 100644
--- a/chrome/browser/download/download_request_limiter_unittest.cc
+++ b/chrome/browser/download/download_request_limiter_unittest.cc
@@ -45,6 +45,8 @@ class FakePermissionBubbleView : public PermissionBubbleView {
const std::vector<bool>& accept_state,
bool customization_mode) OVERRIDE;
+ virtual bool CanAcceptRequestUpdate() OVERRIDE { return false; }
+
virtual void Hide() OVERRIDE {}
private:
diff --git a/chrome/browser/geolocation/chrome_geolocation_permission_context.cc b/chrome/browser/geolocation/chrome_geolocation_permission_context.cc
index 412793c..456b68c 100644
--- a/chrome/browser/geolocation/chrome_geolocation_permission_context.cc
+++ b/chrome/browser/geolocation/chrome_geolocation_permission_context.cc
@@ -28,6 +28,7 @@
#include "extensions/browser/view_type_utils.h"
#include "extensions/common/extension.h"
#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
#include "net/base/net_util.h"
#include "ui/base/l10n/l10n_util.h"
@@ -45,10 +46,11 @@ class GeolocationPermissionRequest : public PermissionBubbleRequest {
virtual ~GeolocationPermissionRequest();
// PermissionBubbleDelegate:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
@@ -76,6 +78,10 @@ GeolocationPermissionRequest::GeolocationPermissionRequest(
GeolocationPermissionRequest::~GeolocationPermissionRequest() {}
+int GeolocationPermissionRequest::GetIconID() const {
+ return IDR_GEOLOCATION_INFOBAR_ICON;
+}
+
base::string16 GeolocationPermissionRequest::GetMessageText() const {
return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION,
net::FormatUrl(requesting_frame_, display_languages_));
@@ -85,14 +91,13 @@ base::string16 GeolocationPermissionRequest::GetMessageTextFragment() const {
return l10n_util::GetStringUTF16(IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT);
}
-base::string16
-GeolocationPermissionRequest::GetAlternateAcceptButtonText() const {
- return l10n_util::GetStringUTF16(IDS_GEOLOCATION_ALLOW_BUTTON);
+bool GeolocationPermissionRequest::HasUserGesture() const {
+ // TODO(gbillock): plumb this through from GeolocationDispatcher.
+ return false;
}
-base::string16
-GeolocationPermissionRequest::GetAlternateDenyButtonText() const {
- return l10n_util::GetStringUTF16(IDS_GEOLOCATION_DENY_BUTTON);
+GURL GeolocationPermissionRequest::GetRequestingHostname() const {
+ return requesting_frame_;
}
void GeolocationPermissionRequest::PermissionGranted() {
@@ -197,6 +202,7 @@ void ChromeGeolocationPermissionContext::CancelGeolocationPermissionRequest(
int render_view_id,
int bridge_id,
const GURL& requesting_frame) {
+ // TODO(gbillock): cancel permission bubble request.
CancelPendingInfobarRequest(PermissionRequestID(
render_process_id, render_view_id, bridge_id, 0));
}
diff --git a/chrome/browser/media/chrome_midi_permission_context.cc b/chrome/browser/media/chrome_midi_permission_context.cc
index 7abcaff..062be1c 100644
--- a/chrome/browser/media/chrome_midi_permission_context.cc
+++ b/chrome/browser/media/chrome_midi_permission_context.cc
@@ -17,6 +17,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
#include "net/base/net_util.h"
#include "ui/base/l10n/l10n_util.h"
@@ -31,10 +32,11 @@ class MidiPermissionRequest : public PermissionBubbleRequest {
virtual ~MidiPermissionRequest();
// PermissionBubbleDelegate:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
@@ -64,6 +66,10 @@ MidiPermissionRequest::MidiPermissionRequest(
MidiPermissionRequest::~MidiPermissionRequest() {}
+int MidiPermissionRequest::GetIconID() const {
+ return IDR_ALLOWED_MIDI_SYSEX;
+}
+
base::string16 MidiPermissionRequest::GetMessageText() const {
return l10n_util::GetStringFUTF16(
IDS_MIDI_SYSEX_INFOBAR_QUESTION,
@@ -74,12 +80,13 @@ base::string16 MidiPermissionRequest::GetMessageTextFragment() const {
return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_PERMISSION_FRAGMENT);
}
-base::string16 MidiPermissionRequest::GetAlternateAcceptButtonText() const {
- return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_ALLOW_BUTTON);
+bool MidiPermissionRequest::HasUserGesture() const {
+ // TODO(gbillock): plumb through.
+ return false;
}
-base::string16 MidiPermissionRequest::GetAlternateDenyButtonText() const {
- return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_DENY_BUTTON);
+GURL MidiPermissionRequest::GetRequestingHostname() const {
+ return requesting_frame_;
}
void MidiPermissionRequest::PermissionGranted() {
diff --git a/chrome/browser/media/media_stream_devices_controller.cc b/chrome/browser/media/media_stream_devices_controller.cc
index 3b4e461..e4296ce 100644
--- a/chrome/browser/media/media_stream_devices_controller.cc
+++ b/chrome/browser/media/media_stream_devices_controller.cc
@@ -349,6 +349,13 @@ void MediaStreamDevicesController::Deny(bool update_content_setting) {
cb.Run(content::MediaStreamDevices(), scoped_ptr<content::MediaStreamUI>());
}
+int MediaStreamDevicesController::GetIconID() const {
+ if (HasVideo())
+ return IDR_INFOBAR_MEDIA_STREAM_CAMERA;
+
+ return IDR_INFOBAR_MEDIA_STREAM_MIC;
+}
+
base::string16 MediaStreamDevicesController::GetMessageText() const {
int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO;
if (!HasAudio())
@@ -368,14 +375,13 @@ base::string16 MediaStreamDevicesController::GetMessageTextFragment() const {
return l10n_util::GetStringUTF16(message_id);
}
-base::string16
-MediaStreamDevicesController::GetAlternateAcceptButtonText() const {
- return l10n_util::GetStringUTF16(IDS_MEDIA_CAPTURE_ALLOW);
+bool MediaStreamDevicesController::HasUserGesture() const {
+ // TODO(gbillock): plumb this through
+ return false;
}
-base::string16
-MediaStreamDevicesController::GetAlternateDenyButtonText() const {
- return l10n_util::GetStringUTF16(IDS_MEDIA_CAPTURE_DENY);
+GURL MediaStreamDevicesController::GetRequestingHostname() const {
+ return request_.security_origin;
}
void MediaStreamDevicesController::PermissionGranted() {
diff --git a/chrome/browser/media/media_stream_devices_controller.h b/chrome/browser/media/media_stream_devices_controller.h
index 2666882..1da55bd 100644
--- a/chrome/browser/media/media_stream_devices_controller.h
+++ b/chrome/browser/media/media_stream_devices_controller.h
@@ -72,10 +72,11 @@ class MediaStreamDevicesController : public PermissionBubbleRequest {
void Deny(bool update_content_setting);
// PermissionBubbleRequest:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
diff --git a/chrome/browser/notifications/desktop_notification_service.cc b/chrome/browser/notifications/desktop_notification_service.cc
index 9dc9d98..2f82841 100644
--- a/chrome/browser/notifications/desktop_notification_service.cc
+++ b/chrome/browser/notifications/desktop_notification_service.cc
@@ -77,10 +77,11 @@ class NotificationPermissionRequest : public PermissionBubbleRequest {
virtual ~NotificationPermissionRequest();
// PermissionBubbleDelegate:
+ virtual int GetIconID() const OVERRIDE;
virtual base::string16 GetMessageText() const OVERRIDE;
virtual base::string16 GetMessageTextFragment() const OVERRIDE;
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
virtual void PermissionGranted() OVERRIDE;
virtual void PermissionDenied() OVERRIDE;
virtual void Cancelled() OVERRIDE;
@@ -126,6 +127,10 @@ NotificationPermissionRequest::NotificationPermissionRequest(
NotificationPermissionRequest::~NotificationPermissionRequest() {}
+int NotificationPermissionRequest::GetIconID() const {
+ return IDR_INFOBAR_DESKTOP_NOTIFICATIONS;
+}
+
base::string16 NotificationPermissionRequest::GetMessageText() const {
return l10n_util::GetStringFUTF16(IDS_NOTIFICATION_PERMISSIONS,
display_name_);
@@ -136,14 +141,14 @@ NotificationPermissionRequest::GetMessageTextFragment() const {
return l10n_util::GetStringUTF16(IDS_NOTIFICATION_PERMISSIONS_FRAGMENT);
}
-base::string16
-NotificationPermissionRequest::GetAlternateAcceptButtonText() const {
- return l10n_util::GetStringUTF16(IDS_NOTIFICATION_PERMISSION_YES);
+bool NotificationPermissionRequest::HasUserGesture() const {
+ // Currently notification permission requests are only issued on
+ // user gesture.
+ return true;
}
-base::string16
-NotificationPermissionRequest::GetAlternateDenyButtonText() const {
- return l10n_util::GetStringUTF16(IDS_NOTIFICATION_PERMISSION_NO);
+GURL NotificationPermissionRequest::GetRequestingHostname() const {
+ return origin_;
}
void NotificationPermissionRequest::PermissionGranted() {
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 71624dc..7eb07ea 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1653,7 +1653,8 @@ void Browser::RegisterProtocolHandler(WebContents* web_contents,
PermissionBubbleManager::FromWebContents(web_contents);
if (PermissionBubbleManager::Enabled() && bubble_manager) {
bubble_manager->AddRequest(
- new RegisterProtocolHandlerPermissionRequest(registry, handler));
+ new RegisterProtocolHandlerPermissionRequest(registry, handler,
+ url, user_gesture));
} else {
RegisterProtocolHandlerInfoBarDelegate::Create(
InfoBarService::FromWebContents(web_contents), registry, handler);
diff --git a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h
index 75df075..e063fc8 100644
--- a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h
+++ b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h
@@ -28,6 +28,7 @@ class PermissionBubbleCocoa : public PermissionBubbleView {
bool customization_mode) OVERRIDE;
virtual void Hide() OVERRIDE;
virtual void SetDelegate(Delegate* delegate) OVERRIDE;
+ virtual bool CanAcceptRequestUpdate() OVERRIDE;
// Called when |bubbleController_| is closing.
void OnBubbleClosing();
diff --git a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.mm b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.mm
index c90c8db..3984236 100644
--- a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.mm
+++ b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.mm
@@ -54,6 +54,12 @@ void PermissionBubbleCocoa::SetDelegate(Delegate* delegate) {
delegate_ = delegate;
}
+bool PermissionBubbleCocoa::CanAcceptRequestUpdate() {
+ // TODO(gbillock): implement. Should return true if the mouse is not over the
+ // dialog.
+ return false;
+}
+
void PermissionBubbleCocoa::OnBubbleClosing() {
bubbleController_ = nil;
}
diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc
index 850544b..fc2852b 100644
--- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc
+++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc
@@ -158,26 +158,15 @@ PermissionsBubbleDelegateView::PermissionsBubbleDelegateView(
button_layout->AddView(new views::View());
}
- // Lay out the Deny/Allow buttons. Use custom text if there is only
- // one permission request.
- base::string16 deny_text;
- base::string16 allow_text;
- if (requests.size() == 1) {
- deny_text = requests[0]->GetAlternateDenyButtonText();
- allow_text = requests[0]->GetAlternateAcceptButtonText();
- }
-
- if (deny_text.empty())
- deny_text = l10n_util::GetStringUTF16(IDS_PERMISSION_DENY);
- if (allow_text.empty())
- allow_text = l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW);
-
+ // Lay out the Deny/Allow buttons.
+ base::string16 deny_text = l10n_util::GetStringUTF16(IDS_PERMISSION_DENY);
views::LabelButton* deny_button = new views::LabelButton(this, deny_text);
deny_button->SetStyle(views::Button::STYLE_BUTTON);
deny_button->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont));
button_layout->AddView(deny_button);
deny_ = deny_button;
+ base::string16 allow_text = l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW);
views::LabelButton* allow_button = new views::LabelButton(this, allow_text);
allow_button->SetStyle(views::Button::STYLE_BUTTON);
allow_button->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont));
@@ -269,6 +258,12 @@ void PermissionBubbleViewViews::Show(
bubble_delegate->SizeToContents();
}
+bool PermissionBubbleViewViews::CanAcceptRequestUpdate() {
+ // TODO(gbillock): support this.
+ // return bubble_delegate_ && bubble_delegate_->IsMouseHovered();
+ return false;
+}
+
void PermissionBubbleViewViews::Hide() {
if (bubble_delegate_) {
bubble_delegate_->Close();
diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view.h b/chrome/browser/ui/views/website_settings/permissions_bubble_view.h
index 991e70e..7a72075 100644
--- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.h
+++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.h
@@ -25,6 +25,7 @@ class PermissionBubbleViewViews : public PermissionBubbleView {
virtual void Show(const std::vector<PermissionBubbleRequest*>& requests,
const std::vector<bool>& accept_state,
bool customization_mode) OVERRIDE;
+ virtual bool CanAcceptRequestUpdate() OVERRIDE;
virtual void Hide() OVERRIDE;
void Closing();
diff --git a/chrome/browser/ui/website_settings/mock_permission_bubble_request.cc b/chrome/browser/ui/website_settings/mock_permission_bubble_request.cc
index 9c8770e..b7555fb 100644
--- a/chrome/browser/ui/website_settings/mock_permission_bubble_request.cc
+++ b/chrome/browser/ui/website_settings/mock_permission_bubble_request.cc
@@ -17,3 +17,15 @@ void MockPermissionBubbleRequest::SetText(const base::string16& text) {
ON_CALL(*this, GetMessageText()).WillByDefault(testing::Return(text));
ON_CALL(*this, GetMessageTextFragment()).WillByDefault(testing::Return(text));
}
+
+int MockPermissionBubbleRequest::GetIconID() const {
+ return 0;
+}
+
+bool MockPermissionBubbleRequest::HasUserGesture() const {
+ return false;
+}
+
+GURL MockPermissionBubbleRequest::GetRequestingHostname() const {
+ return GURL("http://www.google.com");
+}
diff --git a/chrome/browser/ui/website_settings/mock_permission_bubble_request.h b/chrome/browser/ui/website_settings/mock_permission_bubble_request.h
index 0398d5d..fabaa88 100644
--- a/chrome/browser/ui/website_settings/mock_permission_bubble_request.h
+++ b/chrome/browser/ui/website_settings/mock_permission_bubble_request.h
@@ -8,16 +8,18 @@
#include "base/strings/string16.h"
#include "chrome/browser/ui/website_settings/permission_bubble_request.h"
#include "testing/gmock/include/gmock/gmock.h"
+#include "url/gurl.h"
class MockPermissionBubbleRequest : public PermissionBubbleRequest {
public:
explicit MockPermissionBubbleRequest(const std::string& text);
virtual ~MockPermissionBubbleRequest();
+ virtual int GetIconID() const OVERRIDE;
MOCK_CONST_METHOD0(GetMessageText, base::string16());
MOCK_CONST_METHOD0(GetMessageTextFragment, base::string16());
- MOCK_CONST_METHOD0(GetAlternateAcceptButtonText, base::string16());
- MOCK_CONST_METHOD0(GetAlternateDenyButtonText, base::string16());
+ virtual bool HasUserGesture() const OVERRIDE;
+ virtual GURL GetRequestingHostname() const OVERRIDE;
MOCK_METHOD0(PermissionGranted, void());
MOCK_METHOD0(PermissionDenied, void());
MOCK_METHOD0(Cancelled, void());
diff --git a/chrome/browser/ui/website_settings/permission_bubble_manager.cc b/chrome/browser/ui/website_settings/permission_bubble_manager.cc
index 09b2add..60202eb 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_manager.cc
+++ b/chrome/browser/ui/website_settings/permission_bubble_manager.cc
@@ -24,23 +24,65 @@ bool PermissionBubbleManager::Enabled() {
switches::kEnablePermissionsBubbles);
}
+
+
+PermissionBubbleManager::PermissionBubbleManager(
+ content::WebContents* web_contents)
+ : content::WebContentsObserver(web_contents),
+ bubble_showing_(false),
+ view_(NULL),
+ customization_mode_(false) {
+ timer_.reset(new base::Timer(FROM_HERE,
+ base::TimeDelta::FromMilliseconds(kPermissionsCoalesceIntervalMs),
+ base::Bind(&PermissionBubbleManager::ShowBubble, base::Unretained(this)),
+ false));
+}
+
+PermissionBubbleManager::~PermissionBubbleManager() {
+ if (view_ != NULL)
+ view_->SetDelegate(NULL);
+
+ std::vector<PermissionBubbleRequest*>::iterator requests_iter;
+ for (requests_iter = requests_.begin();
+ requests_iter != requests_.end();
+ requests_iter++) {
+ (*requests_iter)->RequestFinished();
+ }
+ for (requests_iter = queued_requests_.begin();
+ requests_iter != queued_requests_.end();
+ requests_iter++) {
+ (*requests_iter)->RequestFinished();
+ }
+}
+
void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) {
- // Don't re-add an existing request.
+ // Don't re-add an existing request or one with a duplicate text request.
std::vector<PermissionBubbleRequest*>::iterator requests_iter;
for (requests_iter = requests_.begin();
requests_iter != requests_.end();
requests_iter++) {
if (*requests_iter == request)
return;
+ // TODO(gbillock): worry about the requesting host name as well.
+ if ((*requests_iter)->GetMessageTextFragment() ==
+ request->GetMessageTextFragment()) {
+ request->RequestFinished();
+ return;
+ }
+ }
+ for (requests_iter = queued_requests_.begin();
+ requests_iter != queued_requests_.end();
+ requests_iter++) {
+ if (*requests_iter == request)
+ return;
+ if ((*requests_iter)->GetMessageTextFragment() ==
+ request->GetMessageTextFragment()) {
+ request->RequestFinished();
+ return;
+ }
}
if (bubble_showing_) {
- for (requests_iter = queued_requests_.begin();
- requests_iter != queued_requests_.end();
- requests_iter++) {
- if (*requests_iter == request)
- return;
- }
queued_requests_.push_back(request);
return;
}
@@ -54,6 +96,11 @@ void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) {
timer_->Reset();
}
+void PermissionBubbleManager::CancelRequest(PermissionBubbleRequest* request) {
+ // TODO(gbillock): implement
+ NOTREACHED();
+}
+
void PermissionBubbleManager::SetView(PermissionBubbleView* view) {
if (view == view_)
return;
@@ -78,26 +125,6 @@ void PermissionBubbleManager::SetView(PermissionBubbleView* view) {
view_->Hide();
}
-PermissionBubbleManager::PermissionBubbleManager(
- content::WebContents* web_contents)
- : content::WebContentsObserver(web_contents),
- bubble_showing_(false),
- view_(NULL),
- customization_mode_(false) {
- timer_.reset(new base::Timer(FROM_HERE,
- base::TimeDelta::FromMilliseconds(kPermissionsCoalesceIntervalMs),
- base::Bind(&PermissionBubbleManager::ShowBubble, base::Unretained(this)),
- false));
-}
-
-PermissionBubbleManager::~PermissionBubbleManager() {
- if (view_ != NULL) {
- view_->SetDelegate(NULL);
- view_->Hide();
- bubble_showing_ = false;
- }
-}
-
void PermissionBubbleManager::DidFinishLoad(
int64 frame_id,
const GURL& validated_url,
diff --git a/chrome/browser/ui/website_settings/permission_bubble_manager.h b/chrome/browser/ui/website_settings/permission_bubble_manager.h
index 0985025..d784541 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_manager.h
+++ b/chrome/browser/ui/website_settings/permission_bubble_manager.h
@@ -35,15 +35,25 @@ class PermissionBubbleManager
virtual ~PermissionBubbleManager();
- // Add a new request to the permission bubble. Ownership of the request
+ // Adds a new request to the permission bubble. Ownership of the request
// remains with the caller. The caller must arrange for the request to
// outlive the PermissionBubbleManager. If a bubble is visible when this
// call is made, the request will be queued up and shown after the current
- // bubble closes.
+ // bubble closes. A request with message text identical to an outstanding
+ // request will receive a RequestFinished call immediately and not be added.
virtual void AddRequest(PermissionBubbleRequest* request);
- // Set the active view for the permission bubble. If this is NULL, it
- // means the permission bubble is no longer showing.
+ // Cancels an outstanding request. This may have different effects depending
+ // on what is going on with the bubble. If the request is pending, it will be
+ // removed and never shown. If the request is showing, it will continue to be
+ // shown, but the user's action won't be reported back to the request object.
+ // In some circumstances, we can remove the request from the bubble, and may
+ // do so. The caller may delete the request after calling this method.
+ virtual void CancelRequest(PermissionBubbleRequest* request);
+
+ // Sets the active view for the permission bubble. If this is NULL, it
+ // means any existing permission bubble can no longer be shown. Does not
+ // take ownership of the view.
virtual void SetView(PermissionBubbleView* view) OVERRIDE;
protected:
diff --git a/chrome/browser/ui/website_settings/permission_bubble_manager_unittest.cc b/chrome/browser/ui/website_settings/permission_bubble_manager_unittest.cc
index 3e5a1c1..2cb4059 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_manager_unittest.cc
+++ b/chrome/browser/ui/website_settings/permission_bubble_manager_unittest.cc
@@ -16,24 +16,33 @@ namespace {
class MockRequest : public PermissionBubbleRequest {
public:
- MockRequest() : granted_(false), cancelled_(false), finished_(false) {}
+ explicit MockRequest(const base::string16& message)
+ : message_(message),
+ granted_(false),
+ cancelled_(false),
+ finished_(false) {}
+
virtual ~MockRequest() {}
// PermissionBubbleRequest:
+ virtual int GetIconID() const OVERRIDE {
+ return 5;
+ }
+
virtual base::string16 GetMessageText() const OVERRIDE {
- return base::ASCIIToUTF16("test");
+ return message_;
}
virtual base::string16 GetMessageTextFragment() const OVERRIDE {
- return base::ASCIIToUTF16("test");
+ return message_;
}
- virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE {
- return base::ASCIIToUTF16("button");
+ virtual bool HasUserGesture() const OVERRIDE {
+ return false;
}
- virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE {
- return base::ASCIIToUTF16("button");
+ virtual GURL GetRequestingHostname() const OVERRIDE {
+ return GURL("http://www.google.com/");
}
virtual void PermissionGranted() OVERRIDE {
@@ -53,6 +62,7 @@ class MockRequest : public PermissionBubbleRequest {
finished_ = true;
}
+ base::string16 message_;
bool granted_;
bool cancelled_;
bool finished_;
@@ -61,7 +71,7 @@ class MockRequest : public PermissionBubbleRequest {
class MockView : public PermissionBubbleView {
public:
MockView() : shown_(false), delegate_(NULL) {}
- ~MockView() {}
+ virtual ~MockView() {}
void Clear() {
shown_ = false;
@@ -88,6 +98,10 @@ class MockView : public PermissionBubbleView {
shown_ = false;
}
+ virtual bool CanAcceptRequestUpdate() OVERRIDE {
+ return true;
+ }
+
bool shown_;
Delegate* delegate_;
std::vector<PermissionBubbleRequest*> permission_requests_;
@@ -99,6 +113,11 @@ class MockView : public PermissionBubbleView {
class PermissionBubbleManagerTest : public testing::Test {
public:
PermissionBubbleManagerTest();
+ virtual ~PermissionBubbleManagerTest() {}
+
+ virtual void TearDown() {
+ manager_.reset();
+ }
void ToggleAccept(int index, bool value) {
manager_->ToggleAccept(index, value);
@@ -123,7 +142,9 @@ class PermissionBubbleManagerTest : public testing::Test {
};
PermissionBubbleManagerTest::PermissionBubbleManagerTest()
- : manager_(new PermissionBubbleManager(NULL)),
+ : request1_(base::ASCIIToUTF16("test1")),
+ request2_(base::ASCIIToUTF16("test2")),
+ manager_(new PermissionBubbleManager(NULL)),
ui_thread_(content::BrowserThread::UI, &message_loop_) {
manager_->SetCoalesceIntervalForTesting(0);
}
@@ -302,3 +323,41 @@ TEST_F(PermissionBubbleManagerTest, SequentialRequests) {
EXPECT_FALSE(view_.shown_);
EXPECT_TRUE(request2_.granted_);
}
+
+TEST_F(PermissionBubbleManagerTest, SameRequestRejected) {
+ manager_->SetView(&view_);
+ manager_->AddRequest(&request1_);
+ manager_->AddRequest(&request1_);
+ EXPECT_FALSE(request1_.finished_);
+
+ WaitForCoalescing();
+ EXPECT_TRUE(view_.shown_);
+ ASSERT_EQ(1u, view_.permission_requests_.size());
+ EXPECT_EQ(&request1_, view_.permission_requests_[0]);
+}
+
+TEST_F(PermissionBubbleManagerTest, DuplicateRequestRejected) {
+ manager_->SetView(&view_);
+ manager_->AddRequest(&request1_);
+ MockRequest dupe_request(base::ASCIIToUTF16("test1"));
+ manager_->AddRequest(&dupe_request);
+ EXPECT_TRUE(dupe_request.finished_);
+ EXPECT_FALSE(request1_.finished_);
+}
+
+TEST_F(PermissionBubbleManagerTest, DuplicateQueuedRequest) {
+ manager_->SetView(&view_);
+ manager_->AddRequest(&request1_);
+ WaitForCoalescing();
+ manager_->AddRequest(&request2_);
+
+ MockRequest dupe_request(base::ASCIIToUTF16("test1"));
+ manager_->AddRequest(&dupe_request);
+ EXPECT_TRUE(dupe_request.finished_);
+ EXPECT_FALSE(request1_.finished_);
+
+ MockRequest dupe_request2(base::ASCIIToUTF16("test2"));
+ manager_->AddRequest(&dupe_request2);
+ EXPECT_TRUE(dupe_request2.finished_);
+ EXPECT_FALSE(request2_.finished_);
+}
diff --git a/chrome/browser/ui/website_settings/permission_bubble_request.h b/chrome/browser/ui/website_settings/permission_bubble_request.h
index 4beec27..8093515 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_request.h
+++ b/chrome/browser/ui/website_settings/permission_bubble_request.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_WEBSITE_SETTINGS_PERMISSION_BUBBLE_REQUEST_H_
#include "base/strings/string16.h"
+#include "url/gurl.h"
// Describes the interface a feature utilizing permission bubbles should
// implement. A class of this type is registered with the permission bubble
@@ -19,31 +20,27 @@ class PermissionBubbleRequest {
public:
virtual ~PermissionBubbleRequest() {}
+ // The icon to use next to the message text fragment in the permission bubble.
+ // Must be a valid icon of size 16x16. (TODO(gbillock): tbd size)
+ virtual int GetIconID() const = 0;
+
// Returns the full prompt text for this permission. This is the only text
// that will be shown in the single-permission case and should be phrased
// positively as a complete sentence.
virtual base::string16 GetMessageText() const = 0;
// Returns the shortened prompt text for this permission. Must be phrased
- // positively -- the permission bubble may coalesce different requests, and
- // if it does, this text will be displayed next to a bullet or checkbox
- // indicating the user grants the permission.
+ // as a heading, e.g. "Location", or "Camera". The permission bubble may
+ // coalesce different requests, and if it does, this text will be displayed
+ // next to an image and indicate the user grants the permission.
virtual base::string16 GetMessageTextFragment() const = 0;
- // May return alternative text for the accept button in the case where this
- // single permission request is triggered in the bubble. If it returns an
- // empty string the default is used.
- // If the permission request is coalesced, the text will revert to the default
- // "Accept"-alike, so the message text must be clear enough for users to
- // understand even if this text is not used.
- virtual base::string16 GetAlternateAcceptButtonText() const = 0;
+ // Get whether this request was accompanied by a user gesture. User gestured
+ // permissions requests will not be suppressed.
+ virtual bool HasUserGesture() const = 0;
- // May return alternative text for the deny button in the case where this
- // single permission request is triggered in the bubble. If it returns an
- // empty string the default is used. This text may not be used at all,
- // so the |GetMessageText()| prompt should be clear enough to convey the
- // permission request with generic button text.
- virtual base::string16 GetAlternateDenyButtonText() const = 0;
+ // Get the hostname on whose behalf this permission request is being made.
+ virtual GURL GetRequestingHostname() const = 0;
// Called when the user has granted the requested permission.
virtual void PermissionGranted() = 0;
diff --git a/chrome/browser/ui/website_settings/permission_bubble_view.h b/chrome/browser/ui/website_settings/permission_bubble_view.h
index b7d0199..5835a47 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_view.h
+++ b/chrome/browser/ui/website_settings/permission_bubble_view.h
@@ -20,6 +20,8 @@ class PermissionBubbleView {
// be persisted in the per-tab UI state.
class Delegate {
public:
+ virtual ~Delegate() {}
+
virtual void ToggleAccept(int index, bool new_value) = 0;
virtual void SetCustomizationMode() = 0;
virtual void Accept() = 0;
@@ -28,14 +30,24 @@ class PermissionBubbleView {
virtual void SetView(PermissionBubbleView* view) = 0;
};
+ virtual ~PermissionBubbleView() {}
+
// Sets the delegate which will receive UI events forwarded from the bubble.
virtual void SetDelegate(Delegate* delegate) = 0;
- // Causes the bubble to show up with the given contents.
+ // Causes the bubble to show up with the given contents. This method may be
+ // called with mostly-identical contents to the existing contents. This can
+ // happen, for instance, if a new permission is requested and
+ // CanAcceptRequestUpdate() is true.
virtual void Show(
const std::vector<PermissionBubbleRequest*>& requests,
const std::vector<bool>& accept_state,
- bool custommization_mode) = 0;
+ bool customization_mode) = 0;
+
+ // Returns true if the view can accept a new Show() command to coalesce
+ // requests. Currently the policy is that this should return true if the view
+ // is being shown and the mouse is not over the view area (!IsMouseHovered).
+ virtual bool CanAcceptRequestUpdate() = 0;
// Hides the permission bubble.
virtual void Hide() = 0;