| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/permissions/permission_request_manager.h" | 5 #include "chrome/browser/permissions/permission_request_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/feature_list.h" | 10 #include "base/feature_list.h" |
| 11 #include "base/metrics/user_metrics.h" |
| 11 #include "base/metrics/user_metrics_action.h" | 12 #include "base/metrics/user_metrics_action.h" |
| 12 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 13 #include "chrome/browser/permissions/permission_request.h" | 14 #include "chrome/browser/permissions/permission_request.h" |
| 14 #include "chrome/browser/permissions/permission_uma_util.h" | 15 #include "chrome/browser/permissions/permission_uma_util.h" |
| 15 #include "chrome/browser/ui/permission_bubble/permission_prompt.h" | 16 #include "chrome/browser/ui/permission_bubble/permission_prompt.h" |
| 16 #include "chrome/common/chrome_features.h" | 17 #include "chrome/common/chrome_features.h" |
| 17 #include "chrome/common/chrome_switches.h" | 18 #include "chrome/common/chrome_switches.h" |
| 18 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" |
| 19 #include "content/public/browser/navigation_handle.h" | 20 #include "content/public/browser/navigation_handle.h" |
| 20 #include "content/public/browser/user_metrics.h" | |
| 21 #include "url/origin.h" | 21 #include "url/origin.h" |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 class CancelledRequest : public PermissionRequest { | 25 class CancelledRequest : public PermissionRequest { |
| 26 public: | 26 public: |
| 27 explicit CancelledRequest(PermissionRequest* cancelled) | 27 explicit CancelledRequest(PermissionRequest* cancelled) |
| 28 : icon_(cancelled->GetIconId()), | 28 : icon_(cancelled->GetIconId()), |
| 29 message_fragment_(cancelled->GetMessageTextFragment()), | 29 message_fragment_(cancelled->GetMessageTextFragment()), |
| 30 origin_(cancelled->GetOrigin()) {} | 30 origin_(cancelled->GetOrigin()) {} |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 for (PermissionRequest* request : queued_requests_) | 93 for (PermissionRequest* request : queued_requests_) |
| 94 request->RequestFinished(); | 94 request->RequestFinished(); |
| 95 for (PermissionRequest* request : queued_frame_requests_) | 95 for (PermissionRequest* request : queued_frame_requests_) |
| 96 request->RequestFinished(); | 96 request->RequestFinished(); |
| 97 for (const auto& entry : duplicate_requests_) | 97 for (const auto& entry : duplicate_requests_) |
| 98 entry.second->RequestFinished(); | 98 entry.second->RequestFinished(); |
| 99 } | 99 } |
| 100 | 100 |
| 101 void PermissionRequestManager::AddRequest(PermissionRequest* request) { | 101 void PermissionRequestManager::AddRequest(PermissionRequest* request) { |
| 102 // TODO(tsergeant): change the UMA to no longer mention bubbles. | 102 // TODO(tsergeant): change the UMA to no longer mention bubbles. |
| 103 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); | 103 base::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); |
| 104 | 104 |
| 105 // TODO(gbillock): is there a race between an early request on a | 105 // TODO(gbillock): is there a race between an early request on a |
| 106 // newly-navigated page and the to-be-cleaned-up requests on the previous | 106 // newly-navigated page and the to-be-cleaned-up requests on the previous |
| 107 // page? We should maybe listen to DidStartNavigationToPendingEntry (and | 107 // page? We should maybe listen to DidStartNavigationToPendingEntry (and |
| 108 // any other renderer-side nav initiations?). Double-check this for | 108 // any other renderer-side nav initiations?). Double-check this for |
| 109 // correct behavior on interstitials -- we probably want to basically queue | 109 // correct behavior on interstitials -- we probably want to basically queue |
| 110 // any request for which GetVisibleURL != GetLastCommittedURL. | 110 // any request for which GetVisibleURL != GetLastCommittedURL. |
| 111 request_url_ = web_contents()->GetLastCommittedURL(); | 111 request_url_ = web_contents()->GetLastCommittedURL(); |
| 112 bool is_main_frame = url::Origin(request_url_) | 112 bool is_main_frame = url::Origin(request_url_) |
| 113 .IsSameOriginWith(url::Origin(request->GetOrigin())); | 113 .IsSameOriginWith(url::Origin(request->GetOrigin())); |
| 114 | 114 |
| 115 // Don't re-add an existing request or one with a duplicate text request. | 115 // Don't re-add an existing request or one with a duplicate text request. |
| 116 PermissionRequest* existing_request = GetExistingRequest(request); | 116 PermissionRequest* existing_request = GetExistingRequest(request); |
| 117 if (existing_request) { | 117 if (existing_request) { |
| 118 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the | 118 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the |
| 119 // same object as |existing_request| or an existing duplicate. | 119 // same object as |existing_request| or an existing duplicate. |
| 120 if (request == existing_request) | 120 if (request == existing_request) |
| 121 return; | 121 return; |
| 122 auto range = duplicate_requests_.equal_range(existing_request); | 122 auto range = duplicate_requests_.equal_range(existing_request); |
| 123 for (auto it = range.first; it != range.second; ++it) { | 123 for (auto it = range.first; it != range.second; ++it) { |
| 124 if (request == it->second) | 124 if (request == it->second) |
| 125 return; | 125 return; |
| 126 } | 126 } |
| 127 duplicate_requests_.insert(std::make_pair(existing_request, request)); | 127 duplicate_requests_.insert(std::make_pair(existing_request, request)); |
| 128 return; | 128 return; |
| 129 } | 129 } |
| 130 | 130 |
| 131 if (IsBubbleVisible()) { | 131 if (IsBubbleVisible()) { |
| 132 if (is_main_frame) { | 132 if (is_main_frame) { |
| 133 content::RecordAction( | 133 base::RecordAction( |
| 134 base::UserMetricsAction("PermissionBubbleRequestQueued")); | 134 base::UserMetricsAction("PermissionBubbleRequestQueued")); |
| 135 queued_requests_.push_back(request); | 135 queued_requests_.push_back(request); |
| 136 } else { | 136 } else { |
| 137 content::RecordAction( | 137 base::RecordAction( |
| 138 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); | 138 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); |
| 139 queued_frame_requests_.push_back(request); | 139 queued_frame_requests_.push_back(request); |
| 140 } | 140 } |
| 141 return; | 141 return; |
| 142 } | 142 } |
| 143 | 143 |
| 144 if (is_main_frame) { | 144 if (is_main_frame) { |
| 145 requests_.push_back(request); | 145 requests_.push_back(request); |
| 146 accept_states_.push_back(true); | 146 accept_states_.push_back(true); |
| 147 } else { | 147 } else { |
| 148 content::RecordAction( | 148 base::RecordAction( |
| 149 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); | 149 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); |
| 150 queued_frame_requests_.push_back(request); | 150 queued_frame_requests_.push_back(request); |
| 151 } | 151 } |
| 152 | 152 |
| 153 ScheduleShowBubble(); | 153 ScheduleShowBubble(); |
| 154 } | 154 } |
| 155 | 155 |
| 156 void PermissionRequestManager::CancelRequest(PermissionRequest* request) { | 156 void PermissionRequestManager::CancelRequest(PermissionRequest* request) { |
| 157 // First look in the queued requests, where we can simply finish the request | 157 // First look in the queued requests, where we can simply finish the request |
| 158 // and go on. | 158 // and go on. |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 case DENY_ALL: | 521 case DENY_ALL: |
| 522 Deny(); | 522 Deny(); |
| 523 break; | 523 break; |
| 524 case DISMISS: | 524 case DISMISS: |
| 525 Closing(); | 525 Closing(); |
| 526 break; | 526 break; |
| 527 case NONE: | 527 case NONE: |
| 528 NOTREACHED(); | 528 NOTREACHED(); |
| 529 } | 529 } |
| 530 } | 530 } |
| OLD | NEW |