Index: chrome/browser/ui/website_settings/permission_bubble_manager.h |
diff --git a/chrome/browser/ui/website_settings/permission_bubble_manager.h b/chrome/browser/ui/website_settings/permission_bubble_manager.h |
index fbde1dac3f99513b67e53784c2db6d82c64f562a..f49afaf8d73f88660f0030b0b970bdc32e2331fe 100644 |
--- a/chrome/browser/ui/website_settings/permission_bubble_manager.h |
+++ b/chrome/browser/ui/website_settings/permission_bubble_manager.h |
@@ -5,6 +5,7 @@ |
#ifndef CHROME_BROWSER_UI_WEBSITE_SETTINGS_PERMISSION_BUBBLE_MANAGER_H_ |
#define CHROME_BROWSER_UI_WEBSITE_SETTINGS_PERMISSION_BUBBLE_MANAGER_H_ |
+#include <unordered_map> |
#include <vector> |
#include "base/gtest_prod_util.h" |
@@ -52,8 +53,9 @@ class PermissionBubbleManager |
// 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. 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); |
+ // request will be merged with the outstanding request, and will have the same |
+ // callbacks called as the outstanding request. |
+ void AddRequest(PermissionBubbleRequest* request); |
// 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 |
@@ -62,7 +64,7 @@ class PermissionBubbleManager |
// In some circumstances, we can remove the request from the bubble, and may |
// do so. The request will have RequestFinished executed on it if it is found, |
// at which time the caller is free to delete the request. |
- virtual void CancelRequest(PermissionBubbleRequest* request); |
+ void CancelRequest(PermissionBubbleRequest* request); |
// Hides the bubble. |
void HideBubble(); |
@@ -137,18 +139,26 @@ class PermissionBubbleManager |
// from the requesting page. |
void CancelPendingQueues(); |
- // Returns whether or not |request| has already been added to |queue|. |
- // |same_object| must be non-null. It will be set to true if |request| |
- // is the same object as an existing request in |queue|, false otherwise. |
- bool ExistingRequest(PermissionBubbleRequest* request, |
- const std::vector<PermissionBubbleRequest*>& queue, |
- bool* same_object); |
+ // Searches |requests_|, |queued_requests_| and |queued_frame_requests_| - but |
+ // *not* |duplicate_requests_| - for a request matching |request|, and returns |
+ // the matching request, or |nullptr| if no match. Note that the matching |
+ // request may or may not be the same object as |request|. |
+ PermissionBubbleRequest* GetExistingRequest(PermissionBubbleRequest* request); |
// Returns true if |queue| contains a request which was generated by a user |
// gesture. Returns false otherwise. |
bool HasUserGestureRequest( |
const std::vector<PermissionBubbleRequest*>& queue); |
+ // Calls PermissionGranted on a request and all its duplicates. |
+ void PermissionGrantedIncludingDuplicates(PermissionBubbleRequest* request); |
+ // Calls PermissionDenied on a request and all its duplicates. |
+ void PermissionDeniedIncludingDuplicates(PermissionBubbleRequest* request); |
+ // Calls Cancelled on a request and all its duplicates. |
+ void CancelledIncludingDuplicates(PermissionBubbleRequest* request); |
+ // Calls RequestFinished on a request and all its duplicates. |
+ void RequestFinishedIncludingDuplicates(PermissionBubbleRequest* request); |
+ |
void NotifyBubbleAdded(); |
void DoAutoResponseForTesting(); |
@@ -162,12 +172,17 @@ class PermissionBubbleManager |
std::vector<PermissionBubbleRequest*> requests_; |
std::vector<PermissionBubbleRequest*> queued_requests_; |
std::vector<PermissionBubbleRequest*> queued_frame_requests_; |
+ // Maps from the first request of a kind to subsequent requests that were |
+ // duped against it. |
+ std::unordered_multimap<PermissionBubbleRequest*, PermissionBubbleRequest*> |
+ duplicate_requests_; |
// URL of the main frame in the WebContents to which this manager is attached. |
// TODO(gbillock): if there are iframes in the page, we need to deal with it. |
GURL request_url_; |
bool main_frame_has_fully_loaded_; |
+ // Whether each of the requests in |requests_| is accepted by the user. |
std::vector<bool> accept_states_; |
base::ObserverList<Observer> observer_list_; |