Chromium Code Reviews| 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_action.h" | 11 #include "base/metrics/user_metrics_action.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "chrome/browser/permissions/permission_request.h" | 13 #include "chrome/browser/permissions/permission_request.h" |
| 14 #include "chrome/browser/permissions/permission_uma_util.h" | 14 #include "chrome/browser/permissions/permission_uma_util.h" |
| 15 #include "chrome/browser/ui/browser_finder.h" | |
| 16 #include "chrome/browser/ui/browser_list.h" | |
| 15 #include "chrome/browser/ui/permission_bubble/permission_prompt.h" | 17 #include "chrome/browser/ui/permission_bubble/permission_prompt.h" |
| 16 #include "chrome/common/chrome_features.h" | 18 #include "chrome/common/chrome_features.h" |
| 17 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
| 18 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
| 19 #include "content/public/browser/navigation_handle.h" | 21 #include "content/public/browser/navigation_handle.h" |
| 20 #include "content/public/browser/user_metrics.h" | 22 #include "content/public/browser/user_metrics.h" |
| 21 #include "url/origin.h" | 23 #include "url/origin.h" |
| 22 | 24 |
| 23 namespace { | 25 namespace { |
| 24 | 26 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 | 74 |
| 73 // PermissionRequestManager ---------------------------------------------------- | 75 // PermissionRequestManager ---------------------------------------------------- |
| 74 | 76 |
| 75 DEFINE_WEB_CONTENTS_USER_DATA_KEY(PermissionRequestManager); | 77 DEFINE_WEB_CONTENTS_USER_DATA_KEY(PermissionRequestManager); |
| 76 | 78 |
| 77 PermissionRequestManager::PermissionRequestManager( | 79 PermissionRequestManager::PermissionRequestManager( |
| 78 content::WebContents* web_contents) | 80 content::WebContents* web_contents) |
| 79 : content::WebContentsObserver(web_contents), | 81 : content::WebContentsObserver(web_contents), |
| 80 view_factory_(base::Bind(&PermissionPrompt::Create)), | 82 view_factory_(base::Bind(&PermissionPrompt::Create)), |
| 81 view_(nullptr), | 83 view_(nullptr), |
| 84 browser_active_(false), | |
|
sky
2017/03/27 22:43:45
Why do you need to cache browser_active_ ? Can't T
Qiang(Joe) Xu
2017/04/06 22:22:51
Yes, we can eliminate the usage of browser_active_
| |
| 82 main_frame_has_fully_loaded_(false), | 85 main_frame_has_fully_loaded_(false), |
| 83 persist_(true), | 86 persist_(true), |
| 84 auto_response_for_test_(NONE), | 87 auto_response_for_test_(NONE), |
| 85 weak_factory_(this) {} | 88 weak_factory_(this) { |
| 89 BrowserList::AddObserver(this); | |
| 90 } | |
| 86 | 91 |
| 87 PermissionRequestManager::~PermissionRequestManager() { | 92 PermissionRequestManager::~PermissionRequestManager() { |
| 93 BrowserList::RemoveObserver(this); | |
| 88 if (view_ != NULL) | 94 if (view_ != NULL) |
| 89 view_->SetDelegate(NULL); | 95 view_->SetDelegate(NULL); |
| 90 | 96 |
| 91 for (PermissionRequest* request : requests_) | 97 for (PermissionRequest* request : requests_) |
| 92 request->RequestFinished(); | 98 request->RequestFinished(); |
| 93 for (PermissionRequest* request : queued_requests_) | 99 for (PermissionRequest* request : queued_requests_) |
| 94 request->RequestFinished(); | 100 request->RequestFinished(); |
| 95 for (PermissionRequest* request : queued_frame_requests_) | 101 for (PermissionRequest* request : queued_frame_requests_) |
| 96 request->RequestFinished(); | 102 request->RequestFinished(); |
| 97 for (const auto& entry : duplicate_requests_) | 103 for (const auto& entry : duplicate_requests_) |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 void PermissionRequestManager::Closing() { | 355 void PermissionRequestManager::Closing() { |
| 350 std::vector<PermissionRequest*>::iterator requests_iter; | 356 std::vector<PermissionRequest*>::iterator requests_iter; |
| 351 for (requests_iter = requests_.begin(); | 357 for (requests_iter = requests_.begin(); |
| 352 requests_iter != requests_.end(); | 358 requests_iter != requests_.end(); |
| 353 requests_iter++) { | 359 requests_iter++) { |
| 354 CancelledIncludingDuplicates(*requests_iter); | 360 CancelledIncludingDuplicates(*requests_iter); |
| 355 } | 361 } |
| 356 FinalizeBubble(); | 362 FinalizeBubble(); |
| 357 } | 363 } |
| 358 | 364 |
| 365 void PermissionRequestManager::OnBrowserSetLastActive(Browser* browser) { | |
| 366 Browser* found = chrome::FindBrowserWithWebContents(web_contents()); | |
| 367 if (found != browser) | |
| 368 return; | |
| 369 | |
| 370 browser_active_ = true; | |
| 371 ScheduleShowBubble(); | |
| 372 } | |
| 373 | |
| 374 void PermissionRequestManager::OnBrowserNoLongerActive(Browser* browser) { | |
| 375 Browser* found = chrome::FindBrowserWithWebContents(web_contents()); | |
| 376 if (found != browser) | |
| 377 return; | |
| 378 | |
| 379 browser_active_ = false; | |
| 380 } | |
| 381 | |
| 359 void PermissionRequestManager::ScheduleShowBubble() { | 382 void PermissionRequestManager::ScheduleShowBubble() { |
| 360 // ::ScheduleShowBubble() will be called again when the main frame will be | 383 // ::ScheduleShowBubble() will be called again when the main frame will be |
| 361 // loaded. | 384 // loaded. |
| 362 if (!main_frame_has_fully_loaded_) | 385 if (!main_frame_has_fully_loaded_) |
| 363 return; | 386 return; |
| 364 | 387 |
| 365 content::BrowserThread::PostTask( | 388 content::BrowserThread::PostTask( |
| 366 content::BrowserThread::UI, | 389 content::BrowserThread::UI, |
| 367 FROM_HERE, | 390 FROM_HERE, |
| 368 base::Bind(&PermissionRequestManager::TriggerShowBubble, | 391 base::Bind(&PermissionRequestManager::TriggerShowBubble, |
| 369 weak_factory_.GetWeakPtr())); | 392 weak_factory_.GetWeakPtr())); |
| 370 } | 393 } |
| 371 | 394 |
| 372 void PermissionRequestManager::TriggerShowBubble() { | 395 void PermissionRequestManager::TriggerShowBubble() { |
| 373 if (!view_) | 396 if (!view_) |
| 374 return; | 397 return; |
| 398 if (!browser_active_) | |
| 399 return; | |
| 375 if (IsBubbleVisible()) | 400 if (IsBubbleVisible()) |
| 376 return; | 401 return; |
| 377 if (!main_frame_has_fully_loaded_) | 402 if (!main_frame_has_fully_loaded_) |
| 378 return; | 403 return; |
| 379 if (requests_.empty() && queued_requests_.empty() && | 404 if (requests_.empty() && queued_requests_.empty() && |
| 380 queued_frame_requests_.empty()) { | 405 queued_frame_requests_.empty()) { |
| 381 return; | 406 return; |
| 382 } | 407 } |
| 383 | 408 |
| 384 if (requests_.empty()) { | 409 if (requests_.empty()) { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 521 case DENY_ALL: | 546 case DENY_ALL: |
| 522 Deny(); | 547 Deny(); |
| 523 break; | 548 break; |
| 524 case DISMISS: | 549 case DISMISS: |
| 525 Closing(); | 550 Closing(); |
| 526 break; | 551 break; |
| 527 case NONE: | 552 case NONE: |
| 528 NOTREACHED(); | 553 NOTREACHED(); |
| 529 } | 554 } |
| 530 } | 555 } |
| OLD | NEW |