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

Unified Diff: chrome/browser/permissions/permission_queue_controller.cc

Issue 2446063002: Implement a modal permission dialog on Android gated by a feature. (Closed)
Patch Set: Move delegate creation and dispatch into constructor Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/permissions/permission_infobar_delegate.cc ('k') | chrome/common/chrome_features.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/permissions/permission_queue_controller.cc
diff --git a/chrome/browser/permissions/permission_queue_controller.cc b/chrome/browser/permissions/permission_queue_controller.cc
index 2e272bdbee1349d1a024141d7fa6597d5c03264c..13410430ec3ba5835de1ed94017b57d53c5e79ef 100644
--- a/chrome/browser/permissions/permission_queue_controller.cc
+++ b/chrome/browser/permissions/permission_queue_controller.cc
@@ -7,6 +7,7 @@
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/permissions/permission_dialog_delegate.h"
#include "chrome/browser/permissions/permission_infobar_delegate.h"
#include "chrome/browser/permissions/permission_request.h"
#include "chrome/browser/permissions/permission_request_id.h"
@@ -25,10 +26,15 @@
namespace {
-InfoBarService* GetInfoBarService(const PermissionRequestID& id) {
- content::WebContents* web_contents = tab_util::GetWebContentsByFrameID(
+content::WebContents* GetWebContents(const PermissionRequestID& id) {
+ return tab_util::GetWebContentsByFrameID(
id.render_process_id(), id.render_frame_id());
- return web_contents ? InfoBarService::FromWebContents(web_contents) : NULL;
+}
+
+
+InfoBarService* GetInfoBarService(const PermissionRequestID& id) {
+ content::WebContents* web_contents = GetWebContents(id);
+ return web_contents ? InfoBarService::FromWebContents(web_contents) : nullptr;
}
bool ArePermissionRequestsForSameTab(
@@ -60,11 +66,13 @@ class PermissionQueueController::PendingInfobarRequest {
const PermissionRequestID& id() const { return id_; }
const GURL& requesting_frame() const { return requesting_frame_; }
+ bool has_gesture() const { return user_gesture_; }
bool has_infobar() const { return !!infobar_; }
+ bool has_dialog() const { return has_dialog_; }
infobars::InfoBar* infobar() { return infobar_; }
void RunCallback(ContentSetting content_setting);
- void CreateInfoBar(PermissionQueueController* controller);
+ void CreatePrompt(PermissionQueueController* controller, bool show_dialog);
private:
content::PermissionType type_;
@@ -75,6 +83,7 @@ class PermissionQueueController::PendingInfobarRequest {
Profile* profile_;
PermissionDecidedCallback callback_;
infobars::InfoBar* infobar_;
+ bool has_dialog_;
// Purposefully do not disable copying, as this is stored in STL containers.
};
@@ -94,7 +103,8 @@ PermissionQueueController::PendingInfobarRequest::PendingInfobarRequest(
user_gesture_(user_gesture),
profile_(profile),
callback_(callback),
- infobar_(NULL) {}
+ infobar_(nullptr),
+ has_dialog_(false) {}
PermissionQueueController::PendingInfobarRequest::~PendingInfobarRequest() {
}
@@ -110,8 +120,9 @@ void PermissionQueueController::PendingInfobarRequest::RunCallback(
callback_.Run(content_setting);
}
-void PermissionQueueController::PendingInfobarRequest::CreateInfoBar(
- PermissionQueueController* controller) {
+void PermissionQueueController::PendingInfobarRequest::CreatePrompt(
+ PermissionQueueController* controller,
+ bool show_dialog) {
// Controller can be Unretained because the lifetime of the infobar
// is tied to that of the queue controller. Before QueueController
// is destroyed, all requests will be cancelled and so all delegates
@@ -120,9 +131,21 @@ void PermissionQueueController::PendingInfobarRequest::CreateInfoBar(
&PermissionQueueController::OnPermissionSet, base::Unretained(controller),
id_, requesting_frame_, embedder_, user_gesture_);
- infobar_ = PermissionInfoBarDelegate::Create(type_, GetInfoBarService(id_),
- requesting_frame_, user_gesture_,
- profile_, callback);
+ if (show_dialog) {
+ // We should show a dialog prompt instead of an infobar. Since only one
+ // dialog can be shown at a time, the Java-side owns and manages the queue
+ // of prompts; the bookkeeping in this class will work as expected:
+ // i. no pending request will ever have an infobar created for it.
+ // ii. OnPermissionSet is still called when the user makes a decision.
+ has_dialog_ = true;
+ PermissionDialogDelegate::Create(GetWebContents(id_), type_,
+ requesting_frame_, user_gesture_, profile_,
+ callback);
+ } else {
+ infobar_ = PermissionInfoBarDelegate::Create(
+ GetInfoBarService(id_), type_, requesting_frame_, user_gesture_,
+ profile_, callback);
+ }
}
PermissionQueueController::PermissionQueueController(
@@ -260,8 +283,9 @@ void PermissionQueueController::OnPermissionSet(const PermissionRequestID& id,
// Send out the permission notifications.
for (PendingInfobarRequests::iterator i = requests_to_notify.begin();
- i != requests_to_notify.end(); ++i)
+ i != requests_to_notify.end(); ++i) {
i->RunCallback(content_setting);
+ }
// Remove the pending requests in reverse order.
for (int i = pending_requests_to_remove.size() - 1; i >= 0; --i)
@@ -300,8 +324,10 @@ bool PermissionQueueController::AlreadyShowingInfoBarForTab(
for (PendingInfobarRequests::const_iterator i(
pending_infobar_requests_.begin());
i != pending_infobar_requests_.end(); ++i) {
- if (ArePermissionRequestsForSameTab(i->id(), id) && i->has_infobar())
+ if (ArePermissionRequestsForSameTab(i->id(), id) &&
+ (i->has_infobar() || i->has_dialog())) {
return true;
+ }
}
return false;
}
@@ -328,8 +354,14 @@ void PermissionQueueController::ShowQueuedInfoBarForTab(
for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin();
i != pending_infobar_requests_.end(); ++i) {
if (ArePermissionRequestsForSameTab(i->id(), id) && !i->has_infobar()) {
- RegisterForInfoBarNotifications(infobar_service);
- i->CreateInfoBar(this);
+ // When using modal permission prompts, Java controls the display queue,
+ // so infobar notifications are not relevant.
+ bool show_dialog =
+ PermissionDialogDelegate::ShouldShowDialog(i->has_gesture());
+ if (!show_dialog)
+ RegisterForInfoBarNotifications(infobar_service);
+
+ i->CreatePrompt(this, show_dialog);
return;
}
}
« no previous file with comments | « chrome/browser/permissions/permission_infobar_delegate.cc ('k') | chrome/common/chrome_features.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698