Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/geolocation/chrome_geolocation_permission_context.h" | 5 #include "chrome/browser/geolocation/chrome_geolocation_permission_context.h" |
| 6 | 6 |
| 7 #include <functional> | 7 #include <functional> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
| 13 #include "chrome/browser/content_settings/host_content_settings_map.h" | 13 #include "chrome/browser/content_settings/host_content_settings_map.h" |
| 14 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 14 #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
| 15 #include "chrome/browser/extensions/extension_service.h" | 15 #include "chrome/browser/extensions/extension_service.h" |
| 16 #include "chrome/browser/google/google_util.h" | 16 #include "chrome/browser/google/google_util.h" |
| 17 #include "chrome/browser/infobars/infobar.h" | |
| 17 #include "chrome/browser/infobars/infobar_tab_helper.h" | 18 #include "chrome/browser/infobars/infobar_tab_helper.h" |
| 18 #include "chrome/browser/prefs/pref_service.h" | 19 #include "chrome/browser/prefs/pref_service.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h" | 21 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h" |
| 21 #include "chrome/browser/tab_contents/tab_util.h" | 22 #include "chrome/browser/tab_contents/tab_util.h" |
| 22 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 23 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 23 #include "chrome/common/extensions/extension.h" | 24 #include "chrome/common/extensions/extension.h" |
| 25 #include "chrome/common/chrome_notification_types.h" | |
|
tfarina
2012/02/28 23:20:58
nit: sort, should be before extension.h
John Knottenbelt
2012/03/01 10:10:49
Done.
| |
| 24 #include "chrome/common/pref_names.h" | 26 #include "chrome/common/pref_names.h" |
| 25 #include "content/browser/renderer_host/render_view_host.h" | 27 #include "content/browser/renderer_host/render_view_host.h" |
| 26 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
| 27 #include "content/public/browser/navigation_details.h" | 29 #include "content/public/browser/navigation_details.h" |
| 28 #include "content/public/browser/navigation_entry.h" | 30 #include "content/public/browser/navigation_entry.h" |
| 31 #include "content/public/browser/notification_details.h" | |
| 29 #include "content/public/browser/notification_registrar.h" | 32 #include "content/public/browser/notification_registrar.h" |
| 30 #include "content/public/browser/notification_source.h" | 33 #include "content/public/browser/notification_source.h" |
| 31 #include "content/public/browser/notification_types.h" | 34 #include "content/public/browser/notification_types.h" |
| 32 #include "content/public/browser/web_contents.h" | 35 #include "content/public/browser/web_contents.h" |
| 33 #include "grit/generated_resources.h" | 36 #include "grit/generated_resources.h" |
| 34 #include "grit/locale_settings.h" | 37 #include "grit/locale_settings.h" |
| 35 #include "grit/theme_resources.h" | 38 #include "grit/theme_resources.h" |
| 36 #include "grit/theme_resources_standard.h" | 39 #include "grit/theme_resources_standard.h" |
| 37 #include "net/base/net_util.h" | 40 #include "net/base/net_util.h" |
| 38 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" | 41 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 int bridge_id, | 73 int bridge_id, |
| 71 const GURL& requesting_frame, | 74 const GURL& requesting_frame, |
| 72 const GURL& emebedder, | 75 const GURL& emebedder, |
| 73 base::Callback<void(bool)> callback); | 76 base::Callback<void(bool)> callback); |
| 74 | 77 |
| 75 // Cancels a specific infobar request. | 78 // Cancels a specific infobar request. |
| 76 void CancelInfoBarRequest(int render_process_id, | 79 void CancelInfoBarRequest(int render_process_id, |
| 77 int render_view_id, | 80 int render_view_id, |
| 78 int bridge_id); | 81 int bridge_id); |
| 79 | 82 |
| 80 // Called by the InfoBarDelegate to notify it's closed. It'll display a new | |
| 81 // InfoBar if there's any request pending for this tab. | |
| 82 void OnInfoBarClosed(int render_process_id, | |
| 83 int render_view_id, | |
| 84 int bridge_id); | |
| 85 | |
| 86 // Called by the InfoBarDelegate to notify permission has been set. | 83 // Called by the InfoBarDelegate to notify permission has been set. |
| 87 // It'll notify and dismiss any other pending InfoBar request for the same | 84 // It'll notify and dismiss any other pending InfoBar request for the same |
| 88 // |requesting_frame| and embedder. | 85 // |requesting_frame| and embedder. |
| 89 void OnPermissionSet(int render_process_id, | 86 void OnPermissionSet(int render_process_id, |
| 90 int render_view_id, | 87 int render_view_id, |
| 91 int bridge_id, | 88 int bridge_id, |
| 92 const GURL& requesting_frame, | 89 const GURL& requesting_frame, |
| 93 const GURL& embedder, | 90 const GURL& embedder, |
| 94 bool allowed); | 91 bool allowed); |
| 95 | 92 |
| 96 // content::NotificationObserver | 93 // content::NotificationObserver |
| 97 virtual void Observe(int type, | 94 virtual void Observe(int type, |
| 98 const content::NotificationSource& source, | 95 const content::NotificationSource& source, |
| 99 const content::NotificationDetails& details); | 96 const content::NotificationDetails& details); |
| 100 | 97 |
| 101 private: | 98 private: |
| 102 struct PendingInfoBarRequest; | 99 struct PendingInfoBarRequest; |
| 103 class RequestEquals; | 100 class RequestEquals; |
| 104 | 101 |
| 105 typedef std::vector<PendingInfoBarRequest> PendingInfoBarRequests; | 102 typedef std::vector<PendingInfoBarRequest> PendingInfoBarRequests; |
| 106 | 103 |
| 104 // Called by Observe in response to NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED. | |
| 105 // It'll display a new InfoBar if there's any request pending for this tab. | |
| 106 void OnInfoBarClosed(int render_process_id, | |
| 107 int render_view_id, | |
| 108 int bridge_id); | |
| 109 | |
| 107 // Shows the first pending infobar for this tab. | 110 // Shows the first pending infobar for this tab. |
| 108 void ShowQueuedInfoBar(int render_process_id, int render_view_id); | 111 void ShowQueuedInfoBar(int render_process_id, int render_view_id); |
| 109 | 112 |
| 110 // Cancels an InfoBar request and returns the next iterator position. | 113 // Cancels an InfoBar request and returns the next iterator position. |
| 111 PendingInfoBarRequests::iterator CancelInfoBarRequestInternal( | 114 PendingInfoBarRequests::iterator CancelInfoBarRequestInternal( |
| 112 PendingInfoBarRequests::iterator i); | 115 PendingInfoBarRequests::iterator i); |
| 113 | 116 |
| 114 content::NotificationRegistrar registrar_; | 117 content::NotificationRegistrar registrar_; |
| 115 | 118 |
| 116 ChromeGeolocationPermissionContext* const geolocation_permission_context_; | 119 ChromeGeolocationPermissionContext* const geolocation_permission_context_; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 127 public: | 130 public: |
| 128 GeolocationConfirmInfoBarDelegate( | 131 GeolocationConfirmInfoBarDelegate( |
| 129 InfoBarTabHelper* infobar_helper, | 132 InfoBarTabHelper* infobar_helper, |
| 130 GeolocationInfoBarQueueController* controller, | 133 GeolocationInfoBarQueueController* controller, |
| 131 int render_process_id, | 134 int render_process_id, |
| 132 int render_view_id, | 135 int render_view_id, |
| 133 int bridge_id, | 136 int bridge_id, |
| 134 const GURL& requesting_frame_url, | 137 const GURL& requesting_frame_url, |
| 135 const std::string& display_languages); | 138 const std::string& display_languages); |
| 136 | 139 |
| 140 int render_process_id() const { return render_process_id_; } | |
| 141 int render_view_id() const { return render_view_id_; } | |
| 142 | |
| 137 private: | 143 private: |
| 138 virtual ~GeolocationConfirmInfoBarDelegate(); | |
| 139 | 144 |
| 140 // ConfirmInfoBarDelegate: | 145 // ConfirmInfoBarDelegate: |
| 141 virtual bool ShouldExpire( | 146 virtual bool ShouldExpire( |
| 142 const content::LoadCommittedDetails& details) const OVERRIDE; | 147 const content::LoadCommittedDetails& details) const OVERRIDE; |
| 143 virtual gfx::Image* GetIcon() const OVERRIDE; | 148 virtual gfx::Image* GetIcon() const OVERRIDE; |
| 144 virtual Type GetInfoBarType() const OVERRIDE; | 149 virtual Type GetInfoBarType() const OVERRIDE; |
| 145 virtual string16 GetMessageText() const OVERRIDE; | 150 virtual string16 GetMessageText() const OVERRIDE; |
| 146 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; | 151 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; |
| 147 virtual bool Accept() OVERRIDE; | 152 virtual bool Accept() OVERRIDE; |
| 148 virtual bool Cancel() OVERRIDE; | 153 virtual bool Cancel() OVERRIDE; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 177 render_view_id_(render_view_id), | 182 render_view_id_(render_view_id), |
| 178 bridge_id_(bridge_id), | 183 bridge_id_(bridge_id), |
| 179 requesting_frame_url_(requesting_frame_url), | 184 requesting_frame_url_(requesting_frame_url), |
| 180 display_languages_(display_languages) { | 185 display_languages_(display_languages) { |
| 181 const NavigationEntry* committed_entry = | 186 const NavigationEntry* committed_entry = |
| 182 infobar_helper->web_contents()->GetController().GetLastCommittedEntry(); | 187 infobar_helper->web_contents()->GetController().GetLastCommittedEntry(); |
| 183 committed_contents_unique_id_ = committed_entry ? | 188 committed_contents_unique_id_ = committed_entry ? |
| 184 committed_entry->GetUniqueID() : 0; | 189 committed_entry->GetUniqueID() : 0; |
| 185 } | 190 } |
| 186 | 191 |
| 187 GeolocationConfirmInfoBarDelegate::~GeolocationConfirmInfoBarDelegate() { | |
| 188 controller_->OnInfoBarClosed(render_process_id_, render_view_id_, | |
| 189 bridge_id_); | |
| 190 } | |
| 191 | |
| 192 bool GeolocationConfirmInfoBarDelegate::ShouldExpire( | 192 bool GeolocationConfirmInfoBarDelegate::ShouldExpire( |
| 193 const content::LoadCommittedDetails& details) const { | 193 const content::LoadCommittedDetails& details) const { |
| 194 if (details.did_replace_entry || !details.is_navigation_to_different_page()) | 194 if (details.did_replace_entry || !details.is_navigation_to_different_page()) |
| 195 return false; | 195 return false; |
| 196 return committed_contents_unique_id_ != details.entry->GetUniqueID() || | 196 return committed_contents_unique_id_ != details.entry->GetUniqueID() || |
| 197 content::PageTransitionStripQualifier( | 197 content::PageTransitionStripQualifier( |
| 198 details.entry->GetTransitionType()) == | 198 details.entry->GetTransitionType()) == |
| 199 content::PAGE_TRANSITION_RELOAD; | 199 content::PAGE_TRANSITION_RELOAD; |
| 200 } | 200 } |
| 201 | 201 |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 455 copied_request.render_process_id, copied_request.render_view_id, | 455 copied_request.render_process_id, copied_request.render_view_id, |
| 456 copied_request.bridge_id, copied_request.requesting_frame, | 456 copied_request.bridge_id, copied_request.requesting_frame, |
| 457 copied_request.callback, allowed); | 457 copied_request.callback, allowed); |
| 458 } else { | 458 } else { |
| 459 ++i; | 459 ++i; |
| 460 } | 460 } |
| 461 } | 461 } |
| 462 } | 462 } |
| 463 | 463 |
| 464 void GeolocationInfoBarQueueController::Observe( | 464 void GeolocationInfoBarQueueController::Observe( |
| 465 int type, const content::NotificationSource& source, | 465 int type, const content::NotificationSource& source, |
|
Peter Kasting
2012/02/28 19:34:59
Nit: While here, one arg per line
John Knottenbelt
2012/03/01 10:10:49
Done.
| |
| 466 const content::NotificationDetails& details) { | 466 const content::NotificationDetails& details) { |
| 467 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 467 registrar_.Remove(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
|
bulach
2012/02/28 17:20:34
as we chatted, I think we also need this one..
thi
Peter Kasting
2012/02/28 19:34:59
No, we don't want to keep this.
If the web conten
bulach
2012/02/29 11:29:29
thanks for the details, and sorry I wasn't clear.
Peter Kasting
2012/02/29 20:47:54
The pending requests should be cleared as well, be
bulach
2012/03/01 11:19:32
got it, thanks for the clarification.
|
Peter Kasting
2012/02/28 19:34:59
This code will be reached when any infobar is remo
|
| 468 source); | 468 source); |
| 469 WebContents* web_contents = content::Source<WebContents>(source).ptr(); | 469 InfoBarRemovedDetails* removed_details = |
| 470 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); | 470 content::Details<InfoBarRemovedDetails>(details).ptr(); |
| 471 i != pending_infobar_requests_.end();) { | 471 GeolocationConfirmInfoBarDelegate* delegate = |
| 472 if (i->infobar_delegate == NULL && | 472 static_cast<GeolocationConfirmInfoBarDelegate*>(removed_details->first); |
| 473 web_contents == tab_util::GetWebContentsByID(i->render_process_id, | 473 ShowQueuedInfoBar(delegate->render_process_id(), delegate->render_view_id()); |
| 474 i->render_view_id)) { | |
| 475 i = pending_infobar_requests_.erase(i); | |
| 476 } else { | |
| 477 ++i; | |
| 478 } | |
| 479 } | |
| 480 } | 474 } |
| 481 | 475 |
| 482 void GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id, | 476 void GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id, |
| 483 int render_view_id) { | 477 int render_view_id) { |
| 484 WebContents* tab_contents = | 478 WebContents* tab_contents = |
| 485 tab_util::GetWebContentsByID(render_process_id, render_view_id); | 479 tab_util::GetWebContentsByID(render_process_id, render_view_id); |
| 486 TabContentsWrapper* wrapper = NULL; | 480 TabContentsWrapper* wrapper = NULL; |
| 487 if (tab_contents) | 481 if (tab_contents) |
| 488 wrapper = TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); | 482 wrapper = TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); |
| 489 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); | 483 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
| 490 i != pending_infobar_requests_.end(); ) { | 484 i != pending_infobar_requests_.end(); ) { |
| 491 if (i->IsForTab(render_process_id, render_view_id)) { | 485 if (i->IsForTab(render_process_id, render_view_id)) { |
| 492 if (!wrapper) { | 486 if (!wrapper) { |
| 493 i = pending_infobar_requests_.erase(i); | 487 i = pending_infobar_requests_.erase(i); |
| 494 continue; | 488 continue; |
| 495 } | 489 } |
| 496 | 490 |
| 491 InfoBarTabHelper *helper = wrapper->infobar_tab_helper(); | |
|
bulach
2012/02/28 17:20:34
nit: s/r *helper/r* helper/
John Knottenbelt
2012/03/01 10:10:49
Done.
| |
| 492 | |
| 497 if (!i->infobar_delegate) { | 493 if (!i->infobar_delegate) { |
| 498 if (!registrar_.IsRegistered( | 494 if (!registrar_.IsRegistered( |
|
Peter Kasting
2012/02/28 19:34:59
If infobars are disabled, you'll add a listener fo
| |
| 499 this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 495 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| 500 content::Source<WebContents>(tab_contents))) { | 496 content::Source<InfoBarTabHelper>(helper))) { |
| 501 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 497 registrar_.Add( |
| 502 content::Source<WebContents>(tab_contents)); | 498 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
|
bulach
2012/02/28 17:20:34
as above, we may need to keep this too..
| |
| 499 content::Source<InfoBarTabHelper>(helper)); | |
| 503 } | 500 } |
| 504 i->infobar_delegate = new GeolocationConfirmInfoBarDelegate( | 501 i->infobar_delegate = new GeolocationConfirmInfoBarDelegate( |
| 505 wrapper->infobar_tab_helper(), this, render_process_id, | 502 helper, this, render_process_id, |
| 506 render_view_id, i->bridge_id, i->requesting_frame, | 503 render_view_id, i->bridge_id, i->requesting_frame, |
| 507 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); | 504 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
| 508 wrapper->infobar_tab_helper()->AddInfoBar(i->infobar_delegate); | 505 wrapper->infobar_tab_helper()->AddInfoBar(i->infobar_delegate); |
| 509 } | 506 } |
| 510 break; | 507 break; |
| 511 } | 508 } |
| 512 ++i; | 509 ++i; |
| 513 } | 510 } |
| 514 } | 511 } |
| 515 | 512 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 662 BrowserThread::UI, FROM_HERE, | 659 BrowserThread::UI, FROM_HERE, |
| 663 base::Bind( | 660 base::Bind( |
| 664 &ChromeGeolocationPermissionContext::CancelPendingInfoBarRequest, | 661 &ChromeGeolocationPermissionContext::CancelPendingInfoBarRequest, |
| 665 this, render_process_id, render_view_id, bridge_id)); | 662 this, render_process_id, render_view_id, bridge_id)); |
| 666 return; | 663 return; |
| 667 } | 664 } |
| 668 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 665 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 669 geolocation_infobar_queue_controller_->CancelInfoBarRequest(render_process_id, | 666 geolocation_infobar_queue_controller_->CancelInfoBarRequest(render_process_id, |
| 670 render_view_id, bridge_id); | 667 render_view_id, bridge_id); |
| 671 } | 668 } |
| OLD | NEW |