OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/content_settings/permission_queue_controller.h" | 5 #include "chrome/browser/content_settings/permission_queue_controller.h" |
6 | 6 |
7 #include "base/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
8 #include "chrome/browser/chrome_notification_types.h" | 8 #include "chrome/browser/chrome_notification_types.h" |
9 #include "chrome/browser/content_settings/permission_context_uma_util.h" | 9 #include "chrome/browser/content_settings/permission_context_uma_util.h" |
10 #include "chrome/browser/geolocation/geolocation_infobar_delegate.h" | 10 #include "chrome/browser/geolocation/geolocation_infobar_delegate.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "content/public/browser/web_contents.h" | 24 #include "content/public/browser/web_contents.h" |
25 #include "content/public/common/url_constants.h" | 25 #include "content/public/common/url_constants.h" |
26 | 26 |
27 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) | 27 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
28 #include "chrome/browser/media/protected_media_identifier_infobar_delegate.h" | 28 #include "chrome/browser/media/protected_media_identifier_infobar_delegate.h" |
29 #endif | 29 #endif |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 InfoBarService* GetInfoBarService(const PermissionRequestID& id) { | 33 InfoBarService* GetInfoBarService(const PermissionRequestID& id) { |
34 content::WebContents* web_contents = | 34 content::WebContents* web_contents = tab_util::GetWebContentsByFrameID( |
35 tab_util::GetWebContentsByID(id.render_process_id(), id.render_view_id()); | 35 id.render_process_id(), id.render_frame_id()); |
36 return web_contents ? InfoBarService::FromWebContents(web_contents) : NULL; | 36 return web_contents ? InfoBarService::FromWebContents(web_contents) : NULL; |
37 } | 37 } |
38 | 38 |
| 39 bool ArePermissionRequestsForSameTab( |
| 40 const PermissionRequestID& request, |
| 41 const PermissionRequestID& other_request) { |
| 42 content::WebContents* web_contents = tab_util::GetWebContentsByFrameID( |
| 43 request.render_process_id(), request.render_frame_id()); |
| 44 content::WebContents* other_web_contents = tab_util::GetWebContentsByFrameID( |
| 45 other_request.render_process_id(), other_request.render_frame_id()); |
| 46 |
| 47 return web_contents == other_web_contents; |
39 } | 48 } |
40 | 49 |
| 50 } // anonymous namespace |
41 | 51 |
42 class PermissionQueueController::PendingInfobarRequest { | 52 class PermissionQueueController::PendingInfobarRequest { |
43 public: | 53 public: |
44 PendingInfobarRequest(ContentSettingsType type, | 54 PendingInfobarRequest(ContentSettingsType type, |
45 const PermissionRequestID& id, | 55 const PermissionRequestID& id, |
46 const GURL& requesting_frame, | 56 const GURL& requesting_frame, |
47 const GURL& embedder, | 57 const GURL& embedder, |
48 const PermissionDecidedCallback& callback); | 58 const PermissionDecidedCallback& callback); |
49 ~PendingInfobarRequest(); | 59 ~PendingInfobarRequest(); |
50 | 60 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 if (!AlreadyShowingInfoBarForTab(id)) | 174 if (!AlreadyShowingInfoBarForTab(id)) |
165 ShowQueuedInfoBarForTab(id); | 175 ShowQueuedInfoBarForTab(id); |
166 } | 176 } |
167 | 177 |
168 void PermissionQueueController::CancelInfoBarRequest( | 178 void PermissionQueueController::CancelInfoBarRequest( |
169 const PermissionRequestID& id) { | 179 const PermissionRequestID& id) { |
170 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 180 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
171 | 181 |
172 for (PendingInfobarRequests::iterator i(pending_infobar_requests_.begin()); | 182 for (PendingInfobarRequests::iterator i(pending_infobar_requests_.begin()); |
173 i != pending_infobar_requests_.end(); ++i) { | 183 i != pending_infobar_requests_.end(); ++i) { |
174 if (i->id().Equals(id)) { | 184 if (!i->id().Equals(id)) |
175 if (i->has_infobar()) | 185 continue; |
176 GetInfoBarService(id)->RemoveInfoBar(i->infobar()); | 186 |
177 else | 187 InfoBarService* infobar_service = GetInfoBarService(id); |
178 pending_infobar_requests_.erase(i); | 188 if (infobar_service && i->has_infobar()) |
179 return; | 189 infobar_service->RemoveInfoBar(i->infobar()); |
180 } | 190 else |
| 191 pending_infobar_requests_.erase(i); |
| 192 return; |
181 } | 193 } |
182 } | 194 } |
183 | 195 |
184 void PermissionQueueController::OnPermissionSet( | 196 void PermissionQueueController::OnPermissionSet( |
185 const PermissionRequestID& id, | 197 const PermissionRequestID& id, |
186 const GURL& requesting_frame, | 198 const GURL& requesting_frame, |
187 const GURL& embedder, | 199 const GURL& embedder, |
188 bool update_content_setting, | 200 bool update_content_setting, |
189 bool allowed) { | 201 bool allowed) { |
190 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 202 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 return; | 292 return; |
281 } | 293 } |
282 } | 294 } |
283 } | 295 } |
284 | 296 |
285 bool PermissionQueueController::AlreadyShowingInfoBarForTab( | 297 bool PermissionQueueController::AlreadyShowingInfoBarForTab( |
286 const PermissionRequestID& id) const { | 298 const PermissionRequestID& id) const { |
287 for (PendingInfobarRequests::const_iterator i( | 299 for (PendingInfobarRequests::const_iterator i( |
288 pending_infobar_requests_.begin()); | 300 pending_infobar_requests_.begin()); |
289 i != pending_infobar_requests_.end(); ++i) { | 301 i != pending_infobar_requests_.end(); ++i) { |
290 if (i->id().IsForSameTabAs(id) && i->has_infobar()) | 302 if (ArePermissionRequestsForSameTab(i->id(), id) && i->has_infobar()) |
291 return true; | 303 return true; |
292 } | 304 } |
293 return false; | 305 return false; |
294 } | 306 } |
295 | 307 |
296 void PermissionQueueController::ShowQueuedInfoBarForTab( | 308 void PermissionQueueController::ShowQueuedInfoBarForTab( |
297 const PermissionRequestID& id) { | 309 const PermissionRequestID& id) { |
298 DCHECK(!AlreadyShowingInfoBarForTab(id)); | 310 DCHECK(!AlreadyShowingInfoBarForTab(id)); |
299 | 311 |
300 // We can get here for example during tab shutdown, when the InfoBarService is | 312 // We can get here for example during tab shutdown, when the InfoBarService is |
301 // removing all existing infobars, thus calling back to Observe(). In this | 313 // removing all existing infobars, thus calling back to Observe(). In this |
302 // case the service still exists, and is supplied as the source of the | 314 // case the service still exists, and is supplied as the source of the |
303 // notification we observed, but is no longer accessible from its WebContents. | 315 // notification we observed, but is no longer accessible from its WebContents. |
304 // In this case we should just go ahead and cancel further infobars for this | 316 // In this case we should just go ahead and cancel further infobars for this |
305 // tab instead of trying to access the service. | 317 // tab instead of trying to access the service. |
306 // | 318 // |
307 // Similarly, if we're being destroyed, we should also avoid showing further | 319 // Similarly, if we're being destroyed, we should also avoid showing further |
308 // infobars. | 320 // infobars. |
309 InfoBarService* infobar_service = GetInfoBarService(id); | 321 InfoBarService* infobar_service = GetInfoBarService(id); |
310 if (!infobar_service || in_shutdown_) { | 322 if (!infobar_service || in_shutdown_) { |
311 ClearPendingInfobarRequestsForTab(id); | 323 ClearPendingInfobarRequestsForTab(id); |
312 return; | 324 return; |
313 } | 325 } |
314 | 326 |
315 for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin(); | 327 for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin(); |
316 i != pending_infobar_requests_.end(); ++i) { | 328 i != pending_infobar_requests_.end(); ++i) { |
317 if (i->id().IsForSameTabAs(id) && !i->has_infobar()) { | 329 if (ArePermissionRequestsForSameTab(i->id(), id) && !i->has_infobar()) { |
318 RegisterForInfoBarNotifications(infobar_service); | 330 RegisterForInfoBarNotifications(infobar_service); |
319 i->CreateInfoBar( | 331 i->CreateInfoBar( |
320 this, profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); | 332 this, profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
321 return; | 333 return; |
322 } | 334 } |
323 } | 335 } |
324 | 336 |
325 UnregisterForInfoBarNotifications(infobar_service); | 337 UnregisterForInfoBarNotifications(infobar_service); |
326 } | 338 } |
327 | 339 |
328 void PermissionQueueController::ClearPendingInfobarRequestsForTab( | 340 void PermissionQueueController::ClearPendingInfobarRequestsForTab( |
329 const PermissionRequestID& id) { | 341 const PermissionRequestID& id) { |
330 for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin(); | 342 for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin(); |
331 i != pending_infobar_requests_.end(); ) { | 343 i != pending_infobar_requests_.end(); ) { |
332 if (i->id().IsForSameTabAs(id)) { | 344 if (ArePermissionRequestsForSameTab(i->id(), id)) { |
333 DCHECK(!i->has_infobar()); | 345 DCHECK(!i->has_infobar()); |
334 i = pending_infobar_requests_.erase(i); | 346 i = pending_infobar_requests_.erase(i); |
335 } else { | 347 } else { |
336 ++i; | 348 ++i; |
337 } | 349 } |
338 } | 350 } |
339 } | 351 } |
340 | 352 |
341 void PermissionQueueController::RegisterForInfoBarNotifications( | 353 void PermissionQueueController::RegisterForInfoBarNotifications( |
342 InfoBarService* infobar_service) { | 354 InfoBarService* infobar_service) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 ContentSettingsPattern::Wildcard() : | 391 ContentSettingsPattern::Wildcard() : |
380 ContentSettingsPattern::FromURLNoWildcard(embedder.GetOrigin()); | 392 ContentSettingsPattern::FromURLNoWildcard(embedder.GetOrigin()); |
381 | 393 |
382 profile_->GetHostContentSettingsMap()->SetContentSetting( | 394 profile_->GetHostContentSettingsMap()->SetContentSetting( |
383 ContentSettingsPattern::FromURLNoWildcard(requesting_frame.GetOrigin()), | 395 ContentSettingsPattern::FromURLNoWildcard(requesting_frame.GetOrigin()), |
384 embedder_pattern, | 396 embedder_pattern, |
385 type_, | 397 type_, |
386 std::string(), | 398 std::string(), |
387 content_setting); | 399 content_setting); |
388 } | 400 } |
OLD | NEW |