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 |