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

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

Issue 121113007: [WebsiteSettings] API for permissions bubbles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 11 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
new file mode 100644
index 0000000000000000000000000000000000000000..961635c20d8933897bd5fb0e60fe0f50f24ca853
--- /dev/null
+++ b/chrome/browser/ui/website_settings/permission_bubble_manager.cc
@@ -0,0 +1,114 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
+
+#include "chrome/browser/ui/website_settings/permission_bubble_delegate.h"
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(PermissionBubbleManager);
+
+void PermissionBubbleManager::AddPermissionBubbleDelegate(
+ PermissionBubbleDelegate* delegate) {
+ // Don't re-add existing delegate.
+ std::vector<PermissionBubbleDelegate*>::iterator di;
+ for (di = delegates_.begin(); di != delegates_.end(); di++) {
+ if (*di == delegate)
+ return;
+ }
+
+ delegates_.push_back(delegate);
+ accept_state_.push_back(false); // make default state a delegate property?
markusheintz_ 2014/01/15 23:25:30 Nit: Is this comment a TODO? If so please mark it
Greg Billock 2014/01/16 19:32:50 The current plan is for these bubbles to be modal-
+ if (bubble_showing_ && view_)
+ view_->AddPermissionBubbleDelegate(delegate);
+}
+
+void PermissionBubbleManager::RemovePermissionBubbleDelegate(
+ PermissionBubbleDelegate* delegate) {
+ std::vector<PermissionBubbleDelegate*>::iterator di;
+ std::vector<bool>::iterator ai;
+ for (di = delegates_.begin(), ai = accept_state_.begin();
+ di != delegates_.end(); di++, ai++) {
+ if (*di == delegate) {
+ if (bubble_showing_ && view_)
+ view_->RemovePermissionBubbleDelegate(delegate);
+ delegates_.erase(di);
+ accept_state_.erase(ai);
+ return;
+ }
+ }
+}
+
+void PermissionBubbleManager::SetView(PermissionBubbleView* view) {
+ view_ = view;
+ if (view_ == NULL)
+ return;
+
+ if (bubble_showing_) {
+ view_->Show(delegates_, accept_state_);
+ } else {
+ view_->Hide();
+ return;
+ }
+}
+
+PermissionBubbleManager::PermissionBubbleManager(
+ content::WebContents* web_contents)
+ : content::WebContentsObserver(web_contents),
+ bubble_showing_(false),
+ view_(NULL) {
+}
+
+void PermissionBubbleManager::WebContentsDestroyed(
+ content::WebContents* web_contents) {
+ // Synthetic cancel event if the user closes the WebContents.
+ Closing();
+
+ // The WebContents is going away; be aggressively paranoid and delete
+ // ourselves lest other parts of the system attempt to add permission bubbles
+ // or use us otherwise during the destruction.
+ web_contents->RemoveUserData(UserDataKey());
+ // That was the equivalent of "delete this". This object is now destroyed;
+ // returning from this function is the only safe thing to do.
+}
+
+void PermissionBubbleManager::ToggleAccept(int delegate_index, bool new_value) {
+ DCHECK(delegate_index < static_cast<int>(accept_state_.size()));
+ accept_state_[delegate_index] = new_value;
+}
+
+void PermissionBubbleManager::Accept() {
+ std::vector<PermissionBubbleDelegate*>::iterator di;
+ std::vector<bool>::iterator ai;
+ for (di = delegates_.begin(), ai = accept_state_.begin();
+ di != delegates_.end(); di++, ai++) {
+ if (*ai)
+ (*di)->PermissionGranted();
+ else
+ (*di)->PermissionDenied();
+ }
+ FinalizeBubble();
+}
+
+void PermissionBubbleManager::Deny() {
+ std::vector<PermissionBubbleDelegate*>::iterator di;
+ for (di = delegates_.begin(); di != delegates_.end(); di++)
+ (*di)->PermissionDenied();
+ FinalizeBubble();
+}
+
+void PermissionBubbleManager::Closing() {
+ std::vector<PermissionBubbleDelegate*>::iterator di;
+ for (di = delegates_.begin(); di != delegates_.end(); di++)
+ (*di)->Cancelled();
+ FinalizeBubble();
+}
+
+void PermissionBubbleManager::FinalizeBubble() {
+ std::vector<PermissionBubbleDelegate*>::iterator di;
+ for (di = delegates_.begin(); di != delegates_.end(); di++)
+ (*di)->RequestFinished();
+ delegates_.clear();
+ accept_state_.clear();
+}
+

Powered by Google App Engine
This is Rietveld 408576698