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.h" |
12 #include "base/metrics/user_metrics_action.h" | 12 #include "base/metrics/user_metrics_action.h" |
13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
14 #include "chrome/browser/permissions/permission_request.h" | 14 #include "chrome/browser/permissions/permission_request.h" |
15 #include "chrome/browser/permissions/permission_uma_util.h" | 15 #include "chrome/browser/permissions/permission_uma_util.h" |
| 16 #include "chrome/browser/ui/browser_window.h" |
16 #include "chrome/browser/ui/permission_bubble/permission_prompt.h" | 17 #include "chrome/browser/ui/permission_bubble/permission_prompt.h" |
17 #include "chrome/common/chrome_features.h" | 18 #include "chrome/common/chrome_features.h" |
18 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
19 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
20 #include "content/public/browser/navigation_handle.h" | 21 #include "content/public/browser/navigation_handle.h" |
21 #include "url/origin.h" | 22 #include "url/origin.h" |
22 | 23 |
| 24 #if !defined(OS_ANDROID) |
| 25 #include "chrome/browser/ui/browser_finder.h" |
| 26 #include "chrome/browser/ui/browser_list.h" |
| 27 #endif |
| 28 |
23 namespace { | 29 namespace { |
24 | 30 |
25 class CancelledRequest : public PermissionRequest { | 31 class CancelledRequest : public PermissionRequest { |
26 public: | 32 public: |
27 explicit CancelledRequest(PermissionRequest* cancelled) | 33 explicit CancelledRequest(PermissionRequest* cancelled) |
28 : icon_(cancelled->GetIconId()), | 34 : icon_(cancelled->GetIconId()), |
29 message_fragment_(cancelled->GetMessageTextFragment()), | 35 message_fragment_(cancelled->GetMessageTextFragment()), |
30 origin_(cancelled->GetOrigin()) {} | 36 origin_(cancelled->GetOrigin()) {} |
31 ~CancelledRequest() override {} | 37 ~CancelledRequest() override {} |
32 | 38 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 : content::WebContentsObserver(web_contents), | 85 : content::WebContentsObserver(web_contents), |
80 view_factory_(base::Bind(&PermissionPrompt::Create)), | 86 view_factory_(base::Bind(&PermissionPrompt::Create)), |
81 view_(nullptr), | 87 view_(nullptr), |
82 main_frame_has_fully_loaded_(false), | 88 main_frame_has_fully_loaded_(false), |
83 persist_(true), | 89 persist_(true), |
84 auto_response_for_test_(NONE), | 90 auto_response_for_test_(NONE), |
85 weak_factory_(this) { | 91 weak_factory_(this) { |
86 #if defined(OS_ANDROID) | 92 #if defined(OS_ANDROID) |
87 view_ = view_factory_.Run(web_contents); | 93 view_ = view_factory_.Run(web_contents); |
88 view_->SetDelegate(this); | 94 view_->SetDelegate(this); |
| 95 #else |
| 96 BrowserList::AddObserver(this); |
89 #endif | 97 #endif |
90 } | 98 } |
91 | 99 |
92 PermissionRequestManager::~PermissionRequestManager() { | 100 PermissionRequestManager::~PermissionRequestManager() { |
| 101 #if !defined(OS_ANDROID) |
| 102 BrowserList::RemoveObserver(this); |
| 103 #endif |
93 if (view_ != NULL) | 104 if (view_ != NULL) |
94 view_->SetDelegate(NULL); | 105 view_->SetDelegate(NULL); |
95 | 106 |
96 for (PermissionRequest* request : requests_) | 107 for (PermissionRequest* request : requests_) |
97 request->RequestFinished(); | 108 request->RequestFinished(); |
98 for (PermissionRequest* request : queued_requests_) | 109 for (PermissionRequest* request : queued_requests_) |
99 request->RequestFinished(); | 110 request->RequestFinished(); |
100 for (PermissionRequest* request : queued_frame_requests_) | 111 for (PermissionRequest* request : queued_frame_requests_) |
101 request->RequestFinished(); | 112 request->RequestFinished(); |
102 for (const auto& entry : duplicate_requests_) | 113 for (const auto& entry : duplicate_requests_) |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 void PermissionRequestManager::Closing() { | 371 void PermissionRequestManager::Closing() { |
361 std::vector<PermissionRequest*>::iterator requests_iter; | 372 std::vector<PermissionRequest*>::iterator requests_iter; |
362 for (requests_iter = requests_.begin(); | 373 for (requests_iter = requests_.begin(); |
363 requests_iter != requests_.end(); | 374 requests_iter != requests_.end(); |
364 requests_iter++) { | 375 requests_iter++) { |
365 CancelledIncludingDuplicates(*requests_iter); | 376 CancelledIncludingDuplicates(*requests_iter); |
366 } | 377 } |
367 FinalizeBubble(); | 378 FinalizeBubble(); |
368 } | 379 } |
369 | 380 |
| 381 void PermissionRequestManager::OnBrowserSetLastActive(Browser* browser) { |
| 382 #if !defined(OS_ANDROID) |
| 383 Browser* found = chrome::FindBrowserWithWebContents(web_contents()); |
| 384 if (found != browser) |
| 385 return; |
| 386 |
| 387 ScheduleShowBubble(); |
| 388 #endif |
| 389 } |
| 390 |
370 void PermissionRequestManager::ScheduleShowBubble() { | 391 void PermissionRequestManager::ScheduleShowBubble() { |
371 // ::ScheduleShowBubble() will be called again when the main frame will be | 392 // ::ScheduleShowBubble() will be called again when the main frame will be |
372 // loaded. | 393 // loaded. |
373 if (!main_frame_has_fully_loaded_) | 394 if (!main_frame_has_fully_loaded_) |
374 return; | 395 return; |
375 | 396 |
376 content::BrowserThread::PostTask( | 397 content::BrowserThread::PostTask( |
377 content::BrowserThread::UI, | 398 content::BrowserThread::UI, |
378 FROM_HERE, | 399 FROM_HERE, |
379 base::Bind(&PermissionRequestManager::TriggerShowBubble, | 400 base::Bind(&PermissionRequestManager::TriggerShowBubble, |
380 weak_factory_.GetWeakPtr())); | 401 weak_factory_.GetWeakPtr())); |
381 } | 402 } |
382 | 403 |
383 void PermissionRequestManager::TriggerShowBubble() { | 404 void PermissionRequestManager::TriggerShowBubble() { |
384 if (!view_) | 405 if (!view_) |
385 return; | 406 return; |
386 if (IsBubbleVisible()) | 407 if (IsBubbleVisible()) |
387 return; | 408 return; |
388 if (!main_frame_has_fully_loaded_) | 409 if (!main_frame_has_fully_loaded_) |
389 return; | 410 return; |
390 if (requests_.empty() && queued_requests_.empty() && | 411 if (requests_.empty() && queued_requests_.empty() && |
391 queued_frame_requests_.empty()) { | 412 queued_frame_requests_.empty()) { |
392 return; | 413 return; |
393 } | 414 } |
| 415 #if !defined(OS_ANDROID) && !defined(OS_MACOSX) |
| 416 // BrowserWindow::IsActive() always return false in tests on MAC. |
| 417 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
| 418 if (browser && !browser->window()->IsActive()) |
| 419 return; |
| 420 #endif |
394 | 421 |
395 if (requests_.empty()) { | 422 if (requests_.empty()) { |
396 if (queued_requests_.size()) | 423 if (queued_requests_.size()) |
397 requests_.swap(queued_requests_); | 424 requests_.swap(queued_requests_); |
398 else | 425 else |
399 requests_.swap(queued_frame_requests_); | 426 requests_.swap(queued_frame_requests_); |
400 | 427 |
401 // Sets the default value for each request to be 'accept'. | 428 // Sets the default value for each request to be 'accept'. |
402 accept_states_.resize(requests_.size(), true); | 429 accept_states_.resize(requests_.size(), true); |
403 } | 430 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 case DENY_ALL: | 559 case DENY_ALL: |
533 Deny(); | 560 Deny(); |
534 break; | 561 break; |
535 case DISMISS: | 562 case DISMISS: |
536 Closing(); | 563 Closing(); |
537 break; | 564 break; |
538 case NONE: | 565 case NONE: |
539 NOTREACHED(); | 566 NOTREACHED(); |
540 } | 567 } |
541 } | 568 } |
OLD | NEW |