Index: chrome/browser/permissions/permission_request_manager.cc |
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc |
index 678c50aaa8e7b08794bf46c73d80abd639cf6379..782fdc2e4bc6a94d53fe2de62dbb5012ed2008a9 100644 |
--- a/chrome/browser/permissions/permission_request_manager.cc |
+++ b/chrome/browser/permissions/permission_request_manager.cc |
@@ -31,7 +31,8 @@ class CancelledRequest : public PermissionRequest { |
message_(cancelled->GetMessageText()), |
#endif |
message_fragment_(cancelled->GetMessageTextFragment()), |
- origin_(cancelled->GetOrigin()) { |
+ origin_(cancelled->GetOrigin()), |
+ request_type_(cancelled->GetPermissionRequestType()) { |
} |
~CancelledRequest() override {} |
@@ -51,6 +52,10 @@ class CancelledRequest : public PermissionRequest { |
void RequestFinished() override { delete this; } |
+ PermissionRequestType GetPermissionRequestType() const override { |
+ return request_type_; |
+ } |
+ |
private: |
IconId icon_; |
#if defined(OS_ANDROID) |
@@ -58,6 +63,7 @@ class CancelledRequest : public PermissionRequest { |
#endif |
base::string16 message_fragment_; |
GURL origin_; |
+ PermissionRequestType request_type_; |
}; |
bool IsMessageTextEqual(PermissionRequest* a, |
@@ -187,35 +193,23 @@ void PermissionRequestManager::CancelRequest(PermissionRequest* request) { |
} |
} |
- std::vector<PermissionRequest*>::iterator requests_iter; |
- for (requests_iter = requests_.begin(); requests_iter != requests_.end(); |
- requests_iter++) { |
- if (*requests_iter != request) |
- continue; |
+ if (!requests_.empty() && requests_[0] == request) { |
+ // Grouped (mic+camera) requests are currently never cancelled. |
+ // TODO(timloh): We should fix this at some point. |
+ DCHECK_EQ(static_cast<size_t>(1), requests_.size()); |
- // We can simply erase the current entry in the request table if we aren't |
- // showing the dialog (because we switched tabs with an active prompt), or |
- // if we are showing it and it can accept the update. |
+ // We can finalize the prompt if we aren't showing the dialog (because we |
+ // switched tabs with an active prompt), or if we are showing it and it |
+ // can accept the update. |
if (!view_ || view_->CanAcceptRequestUpdate()) { |
- // TODO(timloh): We should fix this at some point. |
- // Grouped (mic+camera) requests are currently never cancelled. |
- DCHECK_EQ(static_cast<size_t>(1), requests_.size()); |
- |
- if (view_) |
- DeleteBubble(); |
- |
- RequestFinishedIncludingDuplicates(*requests_iter); |
- requests_.erase(requests_iter); |
- |
- DequeueRequestsAndShowBubble(); |
+ FinalizeBubble(PermissionAction::IGNORED); |
return; |
} |
// Cancel the existing request and replace it with a dummy. |
- PermissionRequest* cancelled_request = |
- new CancelledRequest(*requests_iter); |
- RequestFinishedIncludingDuplicates(*requests_iter); |
- *requests_iter = cancelled_request; |
+ PermissionRequest* cancelled_request = new CancelledRequest(request); |
+ RequestFinishedIncludingDuplicates(request); |
+ requests_[0] = cancelled_request; |
return; |
} |
@@ -329,26 +323,24 @@ void PermissionRequestManager::TogglePersist(bool new_value) { |
} |
void PermissionRequestManager::Accept() { |
- PermissionUmaUtil::PermissionPromptAccepted(requests_); |
- |
+ DCHECK(view_); |
std::vector<PermissionRequest*>::iterator requests_iter; |
for (requests_iter = requests_.begin(); requests_iter != requests_.end(); |
requests_iter++) { |
PermissionGrantedIncludingDuplicates(*requests_iter); |
} |
- FinalizeBubble(); |
+ FinalizeBubble(PermissionAction::GRANTED); |
} |
void PermissionRequestManager::Deny() { |
- PermissionUmaUtil::PermissionPromptDenied(requests_); |
- |
+ DCHECK(view_); |
std::vector<PermissionRequest*>::iterator requests_iter; |
for (requests_iter = requests_.begin(); |
requests_iter != requests_.end(); |
requests_iter++) { |
PermissionDeniedIncludingDuplicates(*requests_iter); |
} |
- FinalizeBubble(); |
+ FinalizeBubble(PermissionAction::DENIED); |
} |
void PermissionRequestManager::Closing() { |
@@ -357,13 +349,15 @@ void PermissionRequestManager::Closing() { |
if (!view_) |
return; |
#endif |
+ |
+ DCHECK(view_); |
std::vector<PermissionRequest*>::iterator requests_iter; |
for (requests_iter = requests_.begin(); |
requests_iter != requests_.end(); |
requests_iter++) { |
CancelledIncludingDuplicates(*requests_iter); |
} |
- FinalizeBubble(); |
+ FinalizeBubble(PermissionAction::DISMISSED); |
} |
void PermissionRequestManager::ScheduleShowBubble() { |
@@ -419,11 +413,15 @@ void PermissionRequestManager::DeleteBubble() { |
view_.reset(); |
} |
-void PermissionRequestManager::FinalizeBubble() { |
- DCHECK(view_); |
+void PermissionRequestManager::FinalizeBubble( |
+ PermissionAction permission_action) { |
DCHECK(!requests_.empty()); |
- DeleteBubble(); |
+ if (view_) |
+ DeleteBubble(); |
+ |
+ PermissionUmaUtil::PermissionPromptResolved(requests_, web_contents(), |
+ permission_action); |
std::vector<PermissionRequest*>::iterator requests_iter; |
for (requests_iter = requests_.begin(); |
@@ -446,7 +444,7 @@ void PermissionRequestManager::CleanUpRequests() { |
queued_requests_.clear(); |
if (view_) |
- FinalizeBubble(); |
+ FinalizeBubble(PermissionAction::IGNORED); |
} |
PermissionRequest* PermissionRequestManager::GetExistingRequest( |