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

Unified Diff: chrome/browser/ui/website_settings/permission_bubble_manager.cc

Issue 1251633002: Add BubbleManager to manage bubbles and ChromeBubbleManager for events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Partial Feedback Created 5 years, 4 months 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
Index: chrome/browser/ui/website_settings/permission_bubble_manager.cc
diff --git a/chrome/browser/ui/website_settings/permission_bubble_manager.cc b/chrome/browser/ui/website_settings/permission_bubble_manager.cc
index a2ace674da4eeb7e68fd9d0f0648eea5cbe140ae..1a615313a0747758c601768f15216fb9f25d6b13 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_manager.cc
+++ b/chrome/browser/ui/website_settings/permission_bubble_manager.cc
@@ -6,6 +6,11 @@
#include "base/command_line.h"
#include "base/metrics/user_metrics_action.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/chrome_bubble_manager.h"
+#include "chrome/browser/ui/chrome_bubble_manager_factory.h"
+#include "chrome/browser/ui/website_settings/permission_bubble_delegate.h"
#include "chrome/browser/ui/website_settings/permission_bubble_request.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/browser_thread.h"
@@ -79,27 +84,14 @@ PermissionBubbleManager::PermissionBubbleManager(
#if !defined(OS_ANDROID) // No bubbles in android tests.
view_factory_(base::Bind(&PermissionBubbleView::Create)),
#endif
- view_(nullptr),
main_frame_has_fully_loaded_(false),
auto_response_for_test_(NONE),
weak_factory_(this) {
}
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();
- }
+ CancelPendingQueues();
+ CloseBubble();
}
void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) {
@@ -148,7 +140,7 @@ void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) {
}
if (!require_user_gesture_ || request->HasUserGesture())
- ScheduleShowBubble();
+ TriggerShowBubble();
}
void PermissionBubbleManager::CancelRequest(PermissionBubbleRequest* request) {
@@ -174,17 +166,24 @@ void PermissionBubbleManager::CancelRequest(PermissionBubbleRequest* request) {
// We can simply erase the current entry in the request table if we aren't
// showing the dialog, or if we are showing it and it can accept the update.
- bool can_erase = !IsBubbleVisible() || view_->CanAcceptRequestUpdate();
+ bool can_erase = !IsBubbleVisible();
+
+ // TODO(hcarmona): Don't forget this logic.
+ // Maybe move it into the BubbleManager?
+ // bool can_erase = !IsBubbleVisible() || view_->CanAcceptRequestUpdate();
please use gerrit instead 2015/08/07 23:02:27 Move more on the delegate. Including CanAcceptRequ
hcarmona 2015/08/11 02:35:46 Done.
+
if (can_erase) {
(*requests_iter)->RequestFinished();
requests_.erase(requests_iter);
accept_states_.erase(accepts_iter);
+ /*
if (IsBubbleVisible()) {
- view_->Hide();
+ UpdateBubble(); // TODO(hcarmona): HOW?
// Will redraw the bubble if it is being shown.
TriggerShowBubble();
}
+ */
return;
}
@@ -199,39 +198,15 @@ void PermissionBubbleManager::CancelRequest(PermissionBubbleRequest* request) {
NOTREACHED(); // Callers should not cancel requests that are not pending.
}
-void PermissionBubbleManager::HideBubble() {
- // Disengage from the existing view if there is one.
- if (!view_)
- return;
-
- view_->SetDelegate(nullptr);
- view_->Hide();
- view_.reset();
-}
-
-void PermissionBubbleManager::DisplayPendingRequests(Browser* browser) {
- if (IsBubbleVisible())
+void PermissionBubbleManager::CloseBubble() {
+ if (!active_bubble_)
return;
-
- view_ = view_factory_.Run(browser);
- view_->SetDelegate(this);
-
- TriggerShowBubble();
-}
-
-void PermissionBubbleManager::UpdateAnchorPosition() {
- if (view_)
- view_->UpdateAnchorPosition();
+ ChromeBubbleManagerFactory::GetForBrowserContext(browser_->profile())
+ ->CloseBubble(active_bubble_);
}
bool PermissionBubbleManager::IsBubbleVisible() {
- return view_ && view_->IsVisible();
-}
-
-gfx::NativeWindow PermissionBubbleManager::GetBubbleWindow() {
- if (view_)
- return view_->GetNativeWindow();
- return nullptr;
+ return active_bubble_;
}
void PermissionBubbleManager::RequireUserGesture(bool required) {
@@ -254,12 +229,12 @@ void PermissionBubbleManager::DocumentOnLoadCompletedInMainFrame() {
// callbacks finding the UI thread still. This makes sure we allow those
// scheduled calls to AddRequest to complete before we show the page-load
// permissions bubble.
- ScheduleShowBubble();
+ TriggerShowBubble();
}
void PermissionBubbleManager::DocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) {
- ScheduleShowBubble();
+ TriggerShowBubble();
}
void PermissionBubbleManager::NavigationEntryCommitted(
@@ -277,14 +252,14 @@ void PermissionBubbleManager::NavigationEntryCommitted(
!details.is_in_page)) {
// Kill off existing bubble and cancel any pending requests.
CancelPendingQueues();
- FinalizeBubble();
+ CloseBubble();
}
}
void PermissionBubbleManager::WebContentsDestroyed() {
// If the web contents has been destroyed, treat the bubble as cancelled.
CancelPendingQueues();
- FinalizeBubble();
+ CloseBubble();
// The WebContents is going away; be aggressively paranoid and delete
// ourselves lest other parts of the system attempt to add permission bubbles
@@ -310,45 +285,34 @@ void PermissionBubbleManager::Accept() {
else
(*requests_iter)->PermissionDenied();
}
- FinalizeBubble();
+ CloseBubble();
}
void PermissionBubbleManager::Deny() {
- std::vector<PermissionBubbleRequest*>::iterator requests_iter;
- for (requests_iter = requests_.begin();
- requests_iter != requests_.end();
- requests_iter++) {
- (*requests_iter)->PermissionDenied();
- }
- FinalizeBubble();
+ for (PermissionBubbleRequest* request : requests_)
+ request->PermissionDenied();
+ CloseBubble();
}
void PermissionBubbleManager::Closing() {
- std::vector<PermissionBubbleRequest*>::iterator requests_iter;
- for (requests_iter = requests_.begin();
- requests_iter != requests_.end();
- requests_iter++) {
- (*requests_iter)->Cancelled();
- }
- FinalizeBubble();
+ for (PermissionBubbleRequest* request : requests_)
+ request->Cancelled();
+ CloseBubble();
}
-void PermissionBubbleManager::ScheduleShowBubble() {
- // ::ScheduleShowBubble() will be called again when the main frame will be
- // loaded.
- if (!main_frame_has_fully_loaded_)
- return;
+void PermissionBubbleManager::Finalize() {
+ for (PermissionBubbleRequest* request : requests_)
+ request->RequestFinished();
- content::BrowserThread::PostTask(
- content::BrowserThread::UI,
- FROM_HERE,
- base::Bind(&PermissionBubbleManager::TriggerShowBubble,
- weak_factory_.GetWeakPtr()));
+ requests_.clear();
+ accept_states_.clear();
+ if (queued_requests_.size() || queued_frame_requests_.size())
+ TriggerShowBubble();
+ else
+ request_url_ = GURL();
}
void PermissionBubbleManager::TriggerShowBubble() {
- if (!view_)
- return;
if (IsBubbleVisible())
return;
if (!main_frame_has_fully_loaded_)
@@ -376,7 +340,11 @@ void PermissionBubbleManager::TriggerShowBubble() {
accept_states_.resize(requests_.size(), true);
}
- view_->Show(requests_, accept_states_);
+ active_bubble_ =
+ ChromeBubbleManagerFactory::GetForBrowserContext(browser_->profile())
+ ->ShowBubble(
+ make_scoped_ptr(new PermissionBubbleDelegate(this, view_factory_)));
+
NotifyBubbleAdded();
// If in testing mode, automatically respond to the bubble that was shown.
@@ -384,36 +352,12 @@ void PermissionBubbleManager::TriggerShowBubble() {
DoAutoResponseForTesting();
}
-void PermissionBubbleManager::FinalizeBubble() {
- if (view_)
- view_->Hide();
-
- std::vector<PermissionBubbleRequest*>::iterator requests_iter;
- for (requests_iter = requests_.begin();
- requests_iter != requests_.end();
- requests_iter++) {
- (*requests_iter)->RequestFinished();
- }
- requests_.clear();
- accept_states_.clear();
- if (queued_requests_.size() || queued_frame_requests_.size())
- TriggerShowBubble();
- else
- request_url_ = GURL();
-}
-
void PermissionBubbleManager::CancelPendingQueues() {
- std::vector<PermissionBubbleRequest*>::iterator requests_iter;
- for (requests_iter = queued_requests_.begin();
- requests_iter != queued_requests_.end();
- requests_iter++) {
- (*requests_iter)->RequestFinished();
- }
- for (requests_iter = queued_frame_requests_.begin();
- requests_iter != queued_frame_requests_.end();
- requests_iter++) {
- (*requests_iter)->RequestFinished();
- }
+ for (PermissionBubbleRequest* request : requests_)
+ request->RequestFinished();
+ for (PermissionBubbleRequest* queued_request : queued_frame_requests_)
+ queued_request->RequestFinished();
+
queued_requests_.clear();
queued_frame_requests_.clear();
}

Powered by Google App Engine
This is Rietveld 408576698