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 |