| 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/ui/website_settings/permission_bubble_manager.h" | 5 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/metrics/user_metrics_action.h" | 8 #include "base/metrics/user_metrics_action.h" |
| 9 #include "chrome/browser/profiles/profile.h" |
| 9 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" | 10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" |
| 10 #include "chrome/common/chrome_switches.h" | 11 #include "chrome/common/chrome_switches.h" |
| 11 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
| 12 #include "content/public/browser/navigation_details.h" | 13 #include "content/public/browser/navigation_details.h" |
| 13 #include "content/public/browser/user_metrics.h" | 14 #include "content/public/browser/user_metrics.h" |
| 14 | 15 |
| 15 namespace { | 16 namespace { |
| 16 | 17 |
| 17 class CancelledRequest : public PermissionBubbleRequest { | 18 class CancelledRequest : public PermissionBubbleRequest { |
| 18 public: | 19 public: |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 // static | 65 // static |
| 65 bool PermissionBubbleManager::Enabled() { | 66 bool PermissionBubbleManager::Enabled() { |
| 66 if (CommandLine::ForCurrentProcess()->HasSwitch( | 67 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 67 switches::kEnablePermissionsBubbles)) | 68 switches::kEnablePermissionsBubbles)) |
| 68 return true; | 69 return true; |
| 69 | 70 |
| 70 if (CommandLine::ForCurrentProcess()->HasSwitch( | 71 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 71 switches::kDisablePermissionsBubbles)) | 72 switches::kDisablePermissionsBubbles)) |
| 72 return false; | 73 return false; |
| 73 | 74 |
| 74 return false; | 75 return true; |
| 75 } | 76 } |
| 76 | 77 |
| 77 PermissionBubbleManager::PermissionBubbleManager( | 78 PermissionBubbleManager::PermissionBubbleManager( |
| 78 content::WebContents* web_contents) | 79 content::WebContents* web_contents) |
| 79 : content::WebContentsObserver(web_contents), | 80 : content::WebContentsObserver(web_contents), |
| 80 bubble_showing_(false), | 81 bubble_showing_(false), |
| 81 view_(NULL), | 82 view_(NULL), |
| 82 request_url_has_loaded_(false), | 83 request_url_has_loaded_(false), |
| 83 customization_mode_(false), | 84 customization_mode_(false), |
| 84 weak_factory_(this) {} | 85 weak_factory_(this) {} |
| 85 | 86 |
| 86 PermissionBubbleManager::~PermissionBubbleManager() { | 87 PermissionBubbleManager::~PermissionBubbleManager() { |
| 87 if (view_ != NULL) | 88 if (view_ != NULL) |
| 88 view_->SetDelegate(NULL); | 89 view_->SetDelegate(NULL); |
| 89 | 90 |
| 90 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 91 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 91 for (requests_iter = requests_.begin(); | 92 for (requests_iter = requests_.begin(); |
| 92 requests_iter != requests_.end(); | 93 requests_iter != requests_.end(); |
| 93 requests_iter++) { | 94 requests_iter++) { |
| 94 (*requests_iter)->RequestFinished(); | 95 (*requests_iter)->RequestFinished(); |
| 95 } | 96 } |
| 96 for (requests_iter = queued_requests_.begin(); | 97 for (requests_iter = queued_requests_.begin(); |
| 97 requests_iter != queued_requests_.end(); | 98 requests_iter != queued_requests_.end(); |
| 98 requests_iter++) { | 99 requests_iter++) { |
| 99 (*requests_iter)->RequestFinished(); | 100 (*requests_iter)->RequestFinished(); |
| 100 } | 101 } |
| 101 } | 102 } |
| 102 | 103 |
| 103 void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) { | 104 void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) { |
| 105 LOG(INFO) << "!!! AddRequest " << request->GetMessageText(); |
| 104 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); | 106 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); |
| 105 // TODO(gbillock): is there a race between an early request on a | 107 // 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 | 108 // newly-navigated page and the to-be-cleaned-up requests on the previous |
| 107 // page? We should maybe listen to DidStartNavigationToPendingEntry (and | 109 // page? We should maybe listen to DidStartNavigationToPendingEntry (and |
| 108 // any other renderer-side nav initiations?). Double-check this for | 110 // any other renderer-side nav initiations?). Double-check this for |
| 109 // correct behavior on interstitials -- we probably want to basically queue | 111 // correct behavior on interstitials -- we probably want to basically queue |
| 110 // any request for which GetVisibleURL != GetLastCommittedURL. | 112 // any request for which GetVisibleURL != GetLastCommittedURL. |
| 111 request_url_ = web_contents()->GetLastCommittedURL(); | 113 request_url_ = web_contents()->GetLastCommittedURL(); |
| 112 bool is_main_frame = | 114 bool is_main_frame = |
| 113 request->GetRequestingHostname().GetOrigin() == request_url_.GetOrigin(); | 115 request->GetRequestingHostname().GetOrigin() == request_url_.GetOrigin(); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 accept_states_[request_index] = new_value; | 266 accept_states_[request_index] = new_value; |
| 265 } | 267 } |
| 266 | 268 |
| 267 void PermissionBubbleManager::SetCustomizationMode() { | 269 void PermissionBubbleManager::SetCustomizationMode() { |
| 268 customization_mode_ = true; | 270 customization_mode_ = true; |
| 269 if (view_) | 271 if (view_) |
| 270 view_->Show(requests_, accept_states_, customization_mode_); | 272 view_->Show(requests_, accept_states_, customization_mode_); |
| 271 } | 273 } |
| 272 | 274 |
| 273 void PermissionBubbleManager::Accept() { | 275 void PermissionBubbleManager::Accept() { |
| 276 LOG(INFO) << "Accept bubble in MGR"; |
| 274 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 277 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 275 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); | 278 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); |
| 276 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); | 279 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); |
| 277 requests_iter != requests_.end(); | 280 requests_iter != requests_.end(); |
| 278 requests_iter++, accepts_iter++) { | 281 requests_iter++, accepts_iter++) { |
| 279 if (*accepts_iter) | 282 if (*accepts_iter) |
| 280 (*requests_iter)->PermissionGranted(); | 283 (*requests_iter)->PermissionGranted(); |
| 281 else | 284 else |
| 282 (*requests_iter)->PermissionDenied(); | 285 (*requests_iter)->PermissionDenied(); |
| 283 } | 286 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 306 | 309 |
| 307 void PermissionBubbleManager::ScheduleShowBubble() { | 310 void PermissionBubbleManager::ScheduleShowBubble() { |
| 308 content::BrowserThread::PostTask( | 311 content::BrowserThread::PostTask( |
| 309 content::BrowserThread::UI, | 312 content::BrowserThread::UI, |
| 310 FROM_HERE, | 313 FROM_HERE, |
| 311 base::Bind(&PermissionBubbleManager::TriggerShowBubble, | 314 base::Bind(&PermissionBubbleManager::TriggerShowBubble, |
| 312 weak_factory_.GetWeakPtr())); | 315 weak_factory_.GetWeakPtr())); |
| 313 } | 316 } |
| 314 | 317 |
| 315 void PermissionBubbleManager::TriggerShowBubble() { | 318 void PermissionBubbleManager::TriggerShowBubble() { |
| 316 if (!view_) | 319 LOG(INFO) << "TriggerShowBubble"; |
| 320 if (!view_) { |
| 321 LOG(INFO) << "no view"; |
| 317 return; | 322 return; |
| 323 } |
| 318 if (bubble_showing_) | 324 if (bubble_showing_) |
| 319 return; | 325 return; |
| 320 if (!request_url_has_loaded_) | 326 if (!request_url_has_loaded_) { |
| 327 LOG(INFO) << "not loaded"; |
| 321 return; | 328 return; |
| 329 } |
| 322 if (requests_.empty() && queued_requests_.empty() && | 330 if (requests_.empty() && queued_requests_.empty() && |
| 323 queued_frame_requests_.empty()) { | 331 queued_frame_requests_.empty()) { |
| 324 return; | 332 return; |
| 325 } | 333 } |
| 326 | 334 |
| 327 if (requests_.empty()) { | 335 if (requests_.empty()) { |
| 328 // Queues containing a user-gesture-generated request have priority. | 336 // Queues containing a user-gesture-generated request have priority. |
| 329 if (HasUserGestureRequest(queued_requests_)) | 337 if (HasUserGestureRequest(queued_requests_)) |
| 330 requests_.swap(queued_requests_); | 338 requests_.swap(queued_requests_); |
| 331 else if (HasUserGestureRequest(queued_frame_requests_)) | 339 else if (HasUserGestureRequest(queued_frame_requests_)) |
| 332 requests_.swap(queued_frame_requests_); | 340 requests_.swap(queued_frame_requests_); |
| 333 else if (queued_requests_.size()) | 341 else if (queued_requests_.size()) |
| 334 requests_.swap(queued_requests_); | 342 requests_.swap(queued_requests_); |
| 335 else | 343 else |
| 336 requests_.swap(queued_frame_requests_); | 344 requests_.swap(queued_frame_requests_); |
| 337 | 345 |
| 338 // Sets the default value for each request to be 'accept'. | 346 // Sets the default value for each request to be 'accept'. |
| 339 // TODO(leng): Currently all requests default to true. If that changes: | 347 // TODO(leng): Currently all requests default to true. If that changes: |
| 340 // a) Add additional accept_state queues to store default values. | 348 // a) Add additional accept_state queues to store default values. |
| 341 // b) Change the request API to provide the default value. | 349 // b) Change the request API to provide the default value. |
| 342 accept_states_.resize(requests_.size(), true); | 350 accept_states_.resize(requests_.size(), true); |
| 343 } | 351 } |
| 344 | 352 |
| 353 LOG(INFO) << "showing bubble view"; |
| 345 // Note: this should appear above Show() for testing, since in that | 354 // Note: this should appear above Show() for testing, since in that |
| 346 // case we may do in-line calling of finalization. | 355 // case we may do in-line calling of finalization. |
| 347 bubble_showing_ = true; | 356 bubble_showing_ = true; |
| 348 view_->Show(requests_, accept_states_, customization_mode_); | 357 view_->Show(requests_, accept_states_, customization_mode_); |
| 349 } | 358 } |
| 350 | 359 |
| 351 void PermissionBubbleManager::FinalizeBubble() { | 360 void PermissionBubbleManager::FinalizeBubble() { |
| 352 if (view_) | 361 if (view_) |
| 353 view_->Hide(); | 362 view_->Hide(); |
| 354 bubble_showing_ = false; | 363 bubble_showing_ = false; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 bool PermissionBubbleManager::HasUserGestureRequest( | 416 bool PermissionBubbleManager::HasUserGestureRequest( |
| 408 const std::vector<PermissionBubbleRequest*>& queue) { | 417 const std::vector<PermissionBubbleRequest*>& queue) { |
| 409 std::vector<PermissionBubbleRequest*>::const_iterator iter; | 418 std::vector<PermissionBubbleRequest*>::const_iterator iter; |
| 410 for (iter = queue.begin(); iter != queue.end(); iter++) { | 419 for (iter = queue.begin(); iter != queue.end(); iter++) { |
| 411 if ((*iter)->HasUserGesture()) | 420 if ((*iter)->HasUserGesture()) |
| 412 return true; | 421 return true; |
| 413 } | 422 } |
| 414 return false; | 423 return false; |
| 415 } | 424 } |
| 416 | 425 |
| OLD | NEW |