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

Side by Side Diff: chrome/browser/permissions/permission_request_manager.cc

Issue 2853803002: Make PermissionRequestManager::requests_ correspond to the active prompt (Closed)
Patch Set: SetUpUrl Created 3 years, 7 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 unified diff | Download patch
OLDNEW
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"
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 return; 126 return;
127 auto range = duplicate_requests_.equal_range(existing_request); 127 auto range = duplicate_requests_.equal_range(existing_request);
128 for (auto it = range.first; it != range.second; ++it) { 128 for (auto it = range.first; it != range.second; ++it) {
129 if (request == it->second) 129 if (request == it->second)
130 return; 130 return;
131 } 131 }
132 duplicate_requests_.insert(std::make_pair(existing_request, request)); 132 duplicate_requests_.insert(std::make_pair(existing_request, request));
133 return; 133 return;
134 } 134 }
135 135
136 if (IsBubbleVisible()) {
137 if (is_main_frame) {
138 base::RecordAction(
139 base::UserMetricsAction("PermissionBubbleRequestQueued"));
140 queued_requests_.push_back(request);
141 } else {
142 base::RecordAction(
143 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued"));
144 queued_frame_requests_.push_back(request);
145 }
146 return;
147 }
148
149 if (is_main_frame) { 136 if (is_main_frame) {
150 requests_.push_back(request); 137 if (IsBubbleVisible()) {
151 accept_states_.push_back(true); 138 base::RecordAction(
139 base::UserMetricsAction("PermissionBubbleRequestQueued"));
140 }
141 queued_requests_.push_back(request);
152 } else { 142 } else {
153 base::RecordAction( 143 base::RecordAction(
154 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); 144 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued"));
155 queued_frame_requests_.push_back(request); 145 queued_frame_requests_.push_back(request);
156 } 146 }
157 147
158 ScheduleShowBubble(); 148 if (!IsBubbleVisible())
149 ScheduleShowBubble();
159 } 150 }
160 151
161 void PermissionRequestManager::CancelRequest(PermissionRequest* request) { 152 void PermissionRequestManager::CancelRequest(PermissionRequest* request) {
162 // First look in the queued requests, where we can simply finish the request 153 // First look in the queued requests, where we can simply finish the request
163 // and go on. 154 // and go on.
164 std::vector<PermissionRequest*>::iterator requests_iter; 155 std::vector<PermissionRequest*>::iterator requests_iter;
165 for (requests_iter = queued_requests_.begin(); 156 for (requests_iter = queued_requests_.begin();
166 requests_iter != queued_requests_.end(); 157 requests_iter != queued_requests_.end();
167 requests_iter++) { 158 requests_iter++) {
168 if (*requests_iter == request) { 159 if (*requests_iter == request) {
(...skipping 13 matching lines...) Expand all
182 173
183 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); 174 std::vector<bool>::iterator accepts_iter = accept_states_.begin();
184 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); 175 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin();
185 requests_iter != requests_.end(); 176 requests_iter != requests_.end();
186 requests_iter++, accepts_iter++) { 177 requests_iter++, accepts_iter++) {
187 if (*requests_iter != request) 178 if (*requests_iter != request)
188 continue; 179 continue;
189 180
190 // We can simply erase the current entry in the request table if we aren't 181 // We can simply erase the current entry in the request table if we aren't
191 // showing the dialog, or if we are showing it and it can accept the update. 182 // showing the dialog, or if we are showing it and it can accept the update.
192 bool can_erase = !IsBubbleVisible() || view_->CanAcceptRequestUpdate(); 183 bool can_erase = !view_ || view_->CanAcceptRequestUpdate();
193 if (can_erase) { 184 if (can_erase) {
194 RequestFinishedIncludingDuplicates(*requests_iter); 185 RequestFinishedIncludingDuplicates(*requests_iter);
195 requests_.erase(requests_iter); 186 requests_.erase(requests_iter);
196 accept_states_.erase(accepts_iter); 187 accept_states_.erase(accepts_iter);
197 188
198 if (IsBubbleVisible()) { 189 if (view_) {
199 view_->Hide(); 190 view_->Hide();
200 // Will redraw the bubble if it is being shown. 191 // Will redraw the bubble if it is being shown.
201 TriggerShowBubble(); 192 DequeueRequestsAndShowBubble();
202 } 193 }
203 return; 194 return;
204 } 195 }
205 196
206 // Cancel the existing request and replace it with a dummy. 197 // Cancel the existing request and replace it with a dummy.
207 PermissionRequest* cancelled_request = 198 PermissionRequest* cancelled_request =
208 new CancelledRequest(*requests_iter); 199 new CancelledRequest(*requests_iter);
209 RequestFinishedIncludingDuplicates(*requests_iter); 200 RequestFinishedIncludingDuplicates(*requests_iter);
210 *requests_iter = cancelled_request; 201 *requests_iter = cancelled_request;
211 return; 202 return;
(...skipping 27 matching lines...) Expand all
239 view_.reset(); 230 view_.reset();
240 } 231 }
241 232
242 void PermissionRequestManager::DisplayPendingRequests() { 233 void PermissionRequestManager::DisplayPendingRequests() {
243 if (IsBubbleVisible()) 234 if (IsBubbleVisible())
244 return; 235 return;
245 236
246 view_ = view_factory_.Run(web_contents()); 237 view_ = view_factory_.Run(web_contents());
247 view_->SetDelegate(this); 238 view_->SetDelegate(this);
248 239
249 TriggerShowBubble(); 240 if (!main_frame_has_fully_loaded_)
241 return;
242
243 if (requests_.empty()) {
244 DequeueRequestsAndShowBubble();
245 } else {
246 // We switched tabs away and back while a prompt was active.
247 ShowBubble();
248 }
250 } 249 }
251 250
252 void PermissionRequestManager::UpdateAnchorPosition() { 251 void PermissionRequestManager::UpdateAnchorPosition() {
253 if (view_) 252 if (view_)
254 view_->UpdateAnchorPosition(); 253 view_->UpdateAnchorPosition();
255 } 254 }
256 255
257 bool PermissionRequestManager::IsBubbleVisible() { 256 bool PermissionRequestManager::IsBubbleVisible() {
258 return view_ && view_->IsVisible(); 257 return view_ && !requests_.empty();
259 } 258 }
260 259
261 // static 260 // static
262 bool PermissionRequestManager::IsEnabled() { 261 bool PermissionRequestManager::IsEnabled() {
263 #if defined(OS_ANDROID) 262 #if defined(OS_ANDROID)
264 return base::FeatureList::IsEnabled(features::kUseGroupedPermissionInfobars); 263 return base::FeatureList::IsEnabled(features::kUseGroupedPermissionInfobars);
265 #else 264 #else
266 return true; 265 return true;
267 #endif 266 #endif
268 } 267 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 363 }
365 364
366 void PermissionRequestManager::ScheduleShowBubble() { 365 void PermissionRequestManager::ScheduleShowBubble() {
367 // ::ScheduleShowBubble() will be called again when the main frame will be 366 // ::ScheduleShowBubble() will be called again when the main frame will be
368 // loaded. 367 // loaded.
369 if (!main_frame_has_fully_loaded_) 368 if (!main_frame_has_fully_loaded_)
370 return; 369 return;
371 370
372 content::BrowserThread::PostTask( 371 content::BrowserThread::PostTask(
373 content::BrowserThread::UI, FROM_HERE, 372 content::BrowserThread::UI, FROM_HERE,
374 base::BindOnce(&PermissionRequestManager::TriggerShowBubble, 373 base::BindOnce(&PermissionRequestManager::DequeueRequestsAndShowBubble,
375 weak_factory_.GetWeakPtr())); 374 weak_factory_.GetWeakPtr()));
376 } 375 }
377 376
378 void PermissionRequestManager::TriggerShowBubble() { 377 void PermissionRequestManager::DequeueRequestsAndShowBubble() {
379 if (!view_) 378 if (!view_)
380 return; 379 return;
381 if (IsBubbleVisible()) 380 if (!requests_.empty())
382 return; 381 return;
383 if (!main_frame_has_fully_loaded_) 382 if (!main_frame_has_fully_loaded_)
384 return; 383 return;
385 if (requests_.empty() && queued_requests_.empty() && 384 if (queued_requests_.empty() && queued_frame_requests_.empty())
386 queued_frame_requests_.empty()) {
387 return; 385 return;
388 }
389 386
390 if (requests_.empty()) { 387 if (queued_requests_.size())
391 if (queued_requests_.size()) 388 requests_.swap(queued_requests_);
392 requests_.swap(queued_requests_); 389 else
393 else 390 requests_.swap(queued_frame_requests_);
394 requests_.swap(queued_frame_requests_);
395 391
396 // Sets the default value for each request to be 'accept'. 392 // Sets the default value for each request to be 'accept'.
397 accept_states_.resize(requests_.size(), true); 393 accept_states_.resize(requests_.size(), true);
398 } 394
395 ShowBubble();
396 }
397
398 void PermissionRequestManager::ShowBubble() {
399 DCHECK(view_);
400 DCHECK(!requests_.empty());
401 DCHECK(main_frame_has_fully_loaded_);
399 402
400 view_->Show(requests_, accept_states_); 403 view_->Show(requests_, accept_states_);
401 PermissionUmaUtil::PermissionPromptShown(requests_); 404 PermissionUmaUtil::PermissionPromptShown(requests_);
402 NotifyBubbleAdded(); 405 NotifyBubbleAdded();
403 406
404 // If in testing mode, automatically respond to the bubble that was shown. 407 // If in testing mode, automatically respond to the bubble that was shown.
405 if (auto_response_for_test_ != NONE) 408 if (auto_response_for_test_ != NONE)
406 DoAutoResponseForTesting(); 409 DoAutoResponseForTesting();
407 } 410 }
408 411
409 void PermissionRequestManager::FinalizeBubble() { 412 void PermissionRequestManager::FinalizeBubble() {
410 if (view_ && !view_->HidesAutomatically()) 413 if (view_ && !view_->HidesAutomatically())
411 view_->Hide(); 414 view_->Hide();
412 415
413 std::vector<PermissionRequest*>::iterator requests_iter; 416 std::vector<PermissionRequest*>::iterator requests_iter;
414 for (requests_iter = requests_.begin(); 417 for (requests_iter = requests_.begin();
415 requests_iter != requests_.end(); 418 requests_iter != requests_.end();
416 requests_iter++) { 419 requests_iter++) {
417 RequestFinishedIncludingDuplicates(*requests_iter); 420 RequestFinishedIncludingDuplicates(*requests_iter);
418 } 421 }
419 requests_.clear(); 422 requests_.clear();
420 accept_states_.clear(); 423 accept_states_.clear();
421 if (queued_requests_.size() || queued_frame_requests_.size()) 424 if (queued_requests_.size() || queued_frame_requests_.size())
422 TriggerShowBubble(); 425 DequeueRequestsAndShowBubble();
423 } 426 }
424 427
425 void PermissionRequestManager::CancelPendingQueues() { 428 void PermissionRequestManager::CancelPendingQueues() {
426 std::vector<PermissionRequest*>::iterator requests_iter; 429 std::vector<PermissionRequest*>::iterator requests_iter;
427 for (requests_iter = queued_requests_.begin(); 430 for (requests_iter = queued_requests_.begin();
428 requests_iter != queued_requests_.end(); 431 requests_iter != queued_requests_.end();
429 requests_iter++) { 432 requests_iter++) {
430 RequestFinishedIncludingDuplicates(*requests_iter); 433 RequestFinishedIncludingDuplicates(*requests_iter);
431 } 434 }
432 for (requests_iter = queued_frame_requests_.begin(); 435 for (requests_iter = queued_frame_requests_.begin();
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 Accept(); 535 Accept();
533 } 536 }
534 break; 537 break;
535 case DISMISS: 538 case DISMISS:
536 Closing(); 539 Closing();
537 break; 540 break;
538 case NONE: 541 case NONE:
539 NOTREACHED(); 542 NOTREACHED();
540 } 543 }
541 } 544 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698